keboola-cli 0.80.2__tar.gz → 0.80.4__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.
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/PKG-INFO +1 -1
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/pyproject.toml +1 -1
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/changelog.py +44 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/_semantic_layer_reference_data.py +5 -1
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/dev_portal.py +2 -2
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/deep_lineage_service.py +19 -2
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/sync_service.py +1 -1
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/sync/manifest.py +36 -1
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_deep_lineage_service.py +47 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_sync_manifest.py +46 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/.gitignore +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/CLAUDE.md +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/CONTRIBUTING.md +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/LICENSE +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/Makefile +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/README.md +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/examples/README.md +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/examples/storage_tui/README.md +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/plugins/kbagent/.claude-plugin/CLAUDE.md +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/scripts/benchmark.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/scripts/check_command_sync.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/scripts/check_error_codes.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/scripts/check_file_size.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/scripts/check_mcp_parity.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/scripts/check_sentinel_guards.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/scripts/check_wheel_ui.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/scripts/debug_linkedby_type.sh +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/scripts/file_size_baseline.json +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/scripts/gen_command_reference.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/scripts/gen_release_notes.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/scripts/generate_changelog.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/scripts/generate_skill.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/scripts/hatch_build.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/scripts/lineage_deep.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/scripts/post-edit-quality.sh +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/scripts/pre-commit +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/scripts/sync_version.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/scripts/web-dev.sh +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/__init__.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/__main__.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/ai_client.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/auth/__init__.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/auth/auth_client.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/auth/device.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/auth/environment.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/auth/models.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/auth/pkce.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/auth/sentinel.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/auth/state_store.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/auth/token_provider.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/auto_update.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/cli.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/client/__init__.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/client/_client.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/client/_core.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/client/_transfer.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/client/branches.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/client/configs.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/client/misc.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/client/query.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/client/queue.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/client/storage_files.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/client/storage_tables.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/client/stream.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/client/tokens.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/client/workspaces.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/__init__.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/_auth_picker.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/_checkbox_select.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/_data_app_git.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/_data_app_runtime.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/_helpers.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/_metadata_input.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/_semantic_layer_crud.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/_semantic_layer_helpers.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/_storage_snapshots.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/agent.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/auth.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/branch.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/changelog.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/component.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/config.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/context.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/data_app.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/docs.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/doctor.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/encrypt.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/feature.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/flow.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/http_client.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/init.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/job.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/kai.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/lineage.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/org.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/permissions.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/project.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/repl.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/schedule.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/search.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/semantic_layer.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/serve.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/sharing.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/storage.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/stream.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/sync.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/token.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/tool.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/transformation.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/version.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/workspace.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/config_store.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/constants.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/data_science_client.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/dev_portal_client.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/errors.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/frozen_dist.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/http_base.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/json_utils.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/lib.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/manage_client.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/mcp_parity.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/metastore_client.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/models.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/output.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/permissions.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/py.typed +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/resources/__init__.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/resources/flow/__init__.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/resources/flow/conditional-flow-schema.json +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/resources/flow/conditional_flow_examples.jsonl +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/resources/flow/flow-schema.json +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/resources/flow/legacy_flow_examples.jsonl +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/result_models.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/scheduler_client.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/__init__.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/agent_runner.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/agents_store.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/app.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/auth.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/dependencies.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/pricing.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/routers/__init__.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/routers/agents.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/routers/ai_chat.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/routers/branches.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/routers/components.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/routers/configs.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/routers/data_apps.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/routers/dev_portal.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/routers/docs.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/routers/encrypt.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/routers/feature.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/routers/flows.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/routers/health.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/routers/jobs.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/routers/kai.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/routers/lineage.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/routers/mcp.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/routers/members.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/routers/org.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/routers/projects.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/routers/schedules.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/routers/search.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/routers/semantic_layer.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/routers/sharing.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/routers/storage.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/routers/stream.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/routers/token.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/routers/transformation.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/routers/workspaces.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/run_broadcaster.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/sse.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/__init__.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/_auth_registration.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/_encryption.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/_semantic_layer_cascade.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/_semantic_layer_crud.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/_semantic_layer_internals.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/_semantic_layer_lookup.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/_semantic_layer_reference_data.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/_sync_bindings.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/_sync_branch.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/_sync_bulk.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/_sync_clone.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/_sync_models.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/_sync_push_ops.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/_sync_storage.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/_sync_writeback.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/_transformation_ops.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/agent_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/auth_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/base.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/branch_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/component_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/config_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/data_app_git_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/data_app_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/dev_portal_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/docs_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/doctor_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/encrypt_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/feature_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/flow_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/flow_validation.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/http_forwarder_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/job_idempotency_store.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/job_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/kai_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/lineage_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/mcp_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/mcp_transport.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/member_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/org_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/project_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/repo_validate_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/schedule_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/search_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/semantic_layer_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/sharing_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/snapshot_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/storage_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/stream_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/token_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/transformation_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/variables_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/version_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/workspace_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/stream_client.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/sync/__init__.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/sync/branch_mapping.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/sync/clone.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/sync/code_extraction.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/sync/config_format.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/sync/diff_engine.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/sync/git_utils.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/sync/naming.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/sync/secrets.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/sync/sql_split.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/update_runner.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/__init__.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/conftest.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/helpers.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_agent_cli.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_agent_prompt.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_agent_prompt_helper.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_agent_runner.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_agent_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_agents_store_events.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_ai_client.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_auth_client.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_auth_device.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_auth_environment.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_auth_models.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_auth_picker.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_auth_pkce.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_auth_register_projects.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_auth_sentinel.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_auth_sentinel_guards.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_auth_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_auth_state_store.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_auto_update.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_base_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_branch_metadata_cli.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_branch_metadata_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_branch_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_build_hook.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_changelog_check.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_changelog_render.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_check_command_sync.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_check_file_size.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_check_sentinel_guards.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_checkbox_select.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_choice_enums.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_cli.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_cli_auth.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_client.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_client_device_enrollment.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_component_cli.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_component_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_component_sync_action.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_config_create_cli.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_config_create_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_config_encryption.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_config_examples.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_config_metadata.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_config_rename.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_config_rename_cli.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_config_resolution.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_config_row_cli.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_config_row_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_config_search.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_config_search_cli.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_config_set_default_bucket.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_config_store.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_config_update.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_data_app_cli.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_data_app_git_repo.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_data_app_plain_env_keys.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_data_app_secrets_cli.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_data_app_secrets_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_data_app_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_data_app_validate_repo_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_dev_portal_cli.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_dev_portal_client.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_dev_portal_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_docs_cli.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_doctor_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_e2e.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_e2e_auth.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_e2e_config_dir_mode.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_e2e_lineage_deep.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_encrypt_cli.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_encrypt_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_encryption.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_errors.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_feature_cli.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_feature_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_file_locking.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_flow_cli.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_flow_examples.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_flow_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_flow_validation.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_frozen_dist.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_gen_command_reference.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_gen_release_notes.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_helpers.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_http_base.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_http_base_auth.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_http_client_cmd.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_http_forwarder_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_integration.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_job_idempotency_store.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_json_utils.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_kai_cli.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_kai_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_lib.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_lib_device_enrollment.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_lineage_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_local_ai_chat.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_manage_client.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_manage_token_bulk.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_manage_token_cli.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_mcp_deprecation_warnings.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_mcp_parity_map.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_mcp_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_mcp_transport.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_member_cli.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_member_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_metastore_client.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_models.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_normalize_script.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_org_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_output.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_permissions.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_permissions_cli.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_pricing.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_project_edit.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_project_edit_cli.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_project_info_cli.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_project_info_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_repl.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_result_models.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_run_broadcaster.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_schedule_cli.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_schedule_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_scheduler_client.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_search_cli.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_search_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_semantic_layer_cli.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_semantic_layer_schema.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_semantic_layer_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_serve_banner_encoding.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_serve_conversation_id.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_serve_ui.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_server_router_calls.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_server_semantic_layer_routes_e2e.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_server_smoke.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_services.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_sharing_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_skill_frontmatter.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_sql_split.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_storage_clone.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_storage_create_table.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_storage_delete.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_storage_describe_cli.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_storage_describe_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_storage_empty_definition.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_storage_export_filters.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_storage_files.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_storage_snapshots.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_storage_swap.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_storage_tables.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_storage_truncate.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_storage_write.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_stream_cli.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_stream_client.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_stream_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_sync_branch_mapping.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_sync_cli.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_sync_clone.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_sync_code_extraction.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_sync_config_format.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_sync_diff_engine.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_sync_e2e.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_sync_encrypt.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_sync_force_pull_baseline.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_sync_naming.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_sync_plaintext_audit.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_sync_reconcile.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_sync_secrets.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_sync_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_sync_storage_jobs.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_sync_version_script.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_token_cli.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_token_provider.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_token_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_tool_call_permissions.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_transformation_cli.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_transformation_ops.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_update_runner.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_variables_cli.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_variables_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_version_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_workspace_cli.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_workspace_gc.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_workspace_service.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_workspace_sql_helper.py +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/README.md +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/index.html +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/package-lock.json +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/package.json +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/postcss.config.js +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/App.tsx +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/api/client.ts +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/components/AgentRunView.tsx +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/components/ConfirmModal.tsx +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/components/Drawer.tsx +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/components/Empty.tsx +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/components/JsonView.tsx +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/components/ManageTokenModal.tsx +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/components/Table.tsx +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/index.css +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/layout/Shell.tsx +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/layout/Sidebar.tsx +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/layout/StatusBar.tsx +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/layout/TopBar.tsx +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/main.tsx +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/pages/Agents.tsx +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/pages/Branches.tsx +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/pages/Changelog.tsx +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/pages/Components.tsx +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/pages/Configs.tsx +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/pages/Dashboard.tsx +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/pages/DataApps.tsx +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/pages/Doctor.tsx +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/pages/Encrypt.tsx +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/pages/Flows.tsx +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/pages/Jobs.tsx +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/pages/Lineage.tsx +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/pages/LocalAi.tsx +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/pages/Mcp.tsx +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/pages/Members.tsx +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/pages/Org.tsx +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/pages/Projects.tsx +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/pages/Schedules.tsx +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/pages/Search.tsx +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/pages/SemanticLayer.tsx +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/pages/SemanticLayerDialogs.tsx +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/pages/Sharing.tsx +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/pages/Storage.tsx +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/pages/Streams.tsx +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/pages/Workspaces.tsx +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/state.tsx +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/theme.tsx +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/types.ts +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/tailwind.config.ts +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/tsconfig.json +0 -0
- {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/vite.config.ts +0 -0
|
@@ -24,6 +24,50 @@ from .constants import CHANGELOG_HEADLINE_MAX_CHARS
|
|
|
24
24
|
|
|
25
25
|
# Ordered newest-first. Each value is a list of brief one-line descriptions.
|
|
26
26
|
CHANGELOG: dict[str, list[str]] = {
|
|
27
|
+
"0.80.4": [
|
|
28
|
+
"Fix: a sync manifest written on Windows was unusable by everyone else "
|
|
29
|
+
"on the team. `.keboola/manifest.json` is a **tracked** file -- sharing "
|
|
30
|
+
"the synced tree through git is the point of the sync workflow -- but "
|
|
31
|
+
"`sync push --adopt-existing` recorded config paths with the host's "
|
|
32
|
+
"separator, so a Windows machine committed "
|
|
33
|
+
"`extractor\\keboola.ex-http\\name`. The asymmetry is what hid it: "
|
|
34
|
+
"`Path()` on Windows accepts forward slashes, so POSIX-written "
|
|
35
|
+
"manifests work everywhere, while on POSIX a backslash path is a single "
|
|
36
|
+
"filename that matches nothing. Paths are now written with `as_posix()` "
|
|
37
|
+
"and normalised on load, so a manifest already committed by a Windows "
|
|
38
|
+
"kbagent repairs itself on the next read instead of needing a hand "
|
|
39
|
+
"edit. Found by running the full test suite on Windows rather than by a "
|
|
40
|
+
"report -- see the note below.",
|
|
41
|
+
"Note (tests): this is the first Windows-only defect the project found "
|
|
42
|
+
"itself. The full suite has never run on Windows in CI (only a narrow "
|
|
43
|
+
"slice does), and a real run was 55 failures -- unusable as a gate, so "
|
|
44
|
+
"nobody enabled it, so anything could hide in it. Working through those "
|
|
45
|
+
"failures to make gating possible is what surfaced this one, among "
|
|
46
|
+
"otherwise routine test-portability noise. The remaining failures are "
|
|
47
|
+
"POSIX-only permission assertions and unguarded `fcntl` imports.",
|
|
48
|
+
],
|
|
49
|
+
"0.80.3": [
|
|
50
|
+
"Fix (#570): `kbagent lineage build` crashed with `UnicodeDecodeError` on "
|
|
51
|
+
"Windows when a transformation's `transform.sql` or `code.py` contained "
|
|
52
|
+
"non-ASCII text -- an accented word in a Czech comment was enough to abort "
|
|
53
|
+
"the whole graph. The reads used `Path.read_text()`, which decodes with "
|
|
54
|
+
"the platform default: cp1250 on a Czech box, where UTF-8's continuation "
|
|
55
|
+
"bytes are undefined. Keboola serves this content as UTF-8, so UTF-8 is "
|
|
56
|
+
"now explicit, which also makes a build reproducible across machines "
|
|
57
|
+
"instead of varying with the host locale. Files that genuinely hold "
|
|
58
|
+
"non-UTF-8 bytes -- a transformation edited locally and saved in the OS "
|
|
59
|
+
'codepage -- decode with `errors="replace"`: table identifiers are '
|
|
60
|
+
"ASCII, so a mangled comment costs nothing and never costs the graph. The "
|
|
61
|
+
"`PYTHONUTF8=1` workaround is no longer needed. Thanks to "
|
|
62
|
+
"@MichalProchazkaP3 for the report.",
|
|
63
|
+
"Fix (#570): the same unqualified `Path.read_text()` in "
|
|
64
|
+
"`dev-portal create --data` / `patch --value-file` and "
|
|
65
|
+
"`semantic-layer reference-data set --members-file` now reads UTF-8 too. "
|
|
66
|
+
"Those parse their input as data rather than scan it, so they stay "
|
|
67
|
+
"strict: a decode error there is honest and identical on every OS, "
|
|
68
|
+
"whereas the platform default silently produced different results per "
|
|
69
|
+
"machine.",
|
|
70
|
+
],
|
|
27
71
|
"0.80.2": [
|
|
28
72
|
"Fix (#571): the deferred Windows self-update never applied. kbagent has "
|
|
29
73
|
"not auto-updated on Windows since the deferred path landed in 0.78.0 -- "
|
|
@@ -111,7 +111,11 @@ def _print_reference_data_delete_result(console: Console, data: dict) -> None:
|
|
|
111
111
|
def _load_members(formatter: Any, members_file: str) -> list[dict]:
|
|
112
112
|
"""Read a JSON array of member objects from a file or ``-`` (stdin)."""
|
|
113
113
|
try:
|
|
114
|
-
raw =
|
|
114
|
+
raw = (
|
|
115
|
+
sys.stdin.read()
|
|
116
|
+
if members_file == "-"
|
|
117
|
+
else Path(members_file).read_text(encoding="utf-8")
|
|
118
|
+
)
|
|
115
119
|
except OSError as exc:
|
|
116
120
|
formatter.error(
|
|
117
121
|
message=f"Could not read members file {members_file!r}: {exc}",
|
|
@@ -317,7 +317,7 @@ def _load_payload(data: str | None) -> dict:
|
|
|
317
317
|
raise typer.BadParameter("--data is required")
|
|
318
318
|
if data == "-":
|
|
319
319
|
return json.loads(sys.stdin.read())
|
|
320
|
-
return json.loads(Path(data).read_text())
|
|
320
|
+
return json.loads(Path(data).read_text(encoding="utf-8"))
|
|
321
321
|
|
|
322
322
|
|
|
323
323
|
def _render_pending(formatter: OutputFormatter, pending: PendingWrite) -> None:
|
|
@@ -435,7 +435,7 @@ def patch_cmd(
|
|
|
435
435
|
payload = _load_payload(data)
|
|
436
436
|
elif property_:
|
|
437
437
|
if value_file:
|
|
438
|
-
raw = Path(value_file).read_text()
|
|
438
|
+
raw = Path(value_file).read_text(encoding="utf-8")
|
|
439
439
|
elif value is not None:
|
|
440
440
|
raw = value
|
|
441
441
|
else:
|
{keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/deep_lineage_service.py
RENAMED
|
@@ -48,6 +48,23 @@ _QUALIFIED_3 = re.compile(r'"KBC_USE4_(\d+)"\s*\.\s*"([^"]+)"\s*\.\s*"([^"]+)"')
|
|
|
48
48
|
_QUALIFIED_2 = re.compile(r'"([^"]+)"\s*\.\s*"([^"]+)"')
|
|
49
49
|
|
|
50
50
|
|
|
51
|
+
def _read_source(path: Path) -> str:
|
|
52
|
+
"""Read a transformation's code, whatever bytes the file actually holds.
|
|
53
|
+
|
|
54
|
+
``Path.read_text()`` decodes with the platform default, which on a Czech or
|
|
55
|
+
Polish Windows box is cp1250 -- so a single accented character in a SQL
|
|
56
|
+
comment aborted the whole lineage build with ``UnicodeDecodeError`` (issue
|
|
57
|
+
#570). Keboola serves this content as UTF-8, so UTF-8 is the right guess
|
|
58
|
+
everywhere, and forcing it also makes a build reproducible across machines.
|
|
59
|
+
|
|
60
|
+
``errors="replace"`` because the goal here is finding table references: a
|
|
61
|
+
file that genuinely holds non-UTF-8 bytes (a locally-edited transformation
|
|
62
|
+
saved in the OS codepage) should cost a mangled comment, never the entire
|
|
63
|
+
graph. Table identifiers are ASCII, so nothing load-bearing is lost.
|
|
64
|
+
"""
|
|
65
|
+
return path.read_text(encoding="utf-8", errors="replace")
|
|
66
|
+
|
|
67
|
+
|
|
51
68
|
def extract_sql_table_refs(sql: str, project_id: int) -> list[tuple[int, str, str]]:
|
|
52
69
|
"""Extract table references from Snowflake SQL using a state machine.
|
|
53
70
|
|
|
@@ -632,10 +649,10 @@ class DeepLineageService:
|
|
|
632
649
|
code_py = full_path / "code.py"
|
|
633
650
|
|
|
634
651
|
if transform_sql.exists():
|
|
635
|
-
code = transform_sql
|
|
652
|
+
code = _read_source(transform_sql)
|
|
636
653
|
code_type = "sql"
|
|
637
654
|
elif code_py.exists():
|
|
638
|
-
code = code_py
|
|
655
|
+
code = _read_source(code_py)
|
|
639
656
|
code_type = "python"
|
|
640
657
|
|
|
641
658
|
# Include config row mappings
|
|
@@ -2350,7 +2350,7 @@ class SyncService(BaseService):
|
|
|
2350
2350
|
{
|
|
2351
2351
|
"component_id": keboola_meta.get("component_id", "unknown"),
|
|
2352
2352
|
"config_id": keboola_meta.get("config_id", ""),
|
|
2353
|
-
"path":
|
|
2353
|
+
"path": config_dir.relative_to(project_root / branch.path).as_posix(),
|
|
2354
2354
|
}
|
|
2355
2355
|
)
|
|
2356
2356
|
|
|
@@ -10,7 +10,7 @@ import json
|
|
|
10
10
|
from pathlib import Path
|
|
11
11
|
from typing import Any
|
|
12
12
|
|
|
13
|
-
from pydantic import BaseModel, ConfigDict, Field
|
|
13
|
+
from pydantic import BaseModel, ConfigDict, Field, field_validator
|
|
14
14
|
|
|
15
15
|
from ..constants import KEBOOLA_DIR_NAME, MANIFEST_FILENAME, MANIFEST_VERSION
|
|
16
16
|
|
|
@@ -59,6 +59,26 @@ class ManifestNaming(BaseModel):
|
|
|
59
59
|
data_app_config: str = Field(default="app/{component_id}/{config_name}", alias="dataAppConfig")
|
|
60
60
|
|
|
61
61
|
|
|
62
|
+
def _posix_path(value: str) -> str:
|
|
63
|
+
r"""Normalise a manifest path to forward slashes.
|
|
64
|
+
|
|
65
|
+
The manifest is a **tracked** file -- the point of a sync tree is that a
|
|
66
|
+
team shares it through git -- so its paths must mean the same thing on
|
|
67
|
+
every machine. The asymmetry is what makes this bite: ``Path()`` on Windows
|
|
68
|
+
happily accepts ``a/b``, but on POSIX ``a\b`` is a single filename that
|
|
69
|
+
merely contains a backslash. So a manifest written on Windows silently
|
|
70
|
+
stops resolving for everyone else on the team, while the reverse direction
|
|
71
|
+
works fine and hides the problem.
|
|
72
|
+
|
|
73
|
+
Applied on load as well as on write, so a manifest already committed by a
|
|
74
|
+
Windows kbagent repairs itself on the next read instead of needing a hand
|
|
75
|
+
edit. Component and config names are slugified by :mod:`.naming` long
|
|
76
|
+
before they reach a path, so a backslash here is always a separator and
|
|
77
|
+
never part of a real name.
|
|
78
|
+
"""
|
|
79
|
+
return value.replace("\\", "/")
|
|
80
|
+
|
|
81
|
+
|
|
62
82
|
class ManifestBranch(BaseModel):
|
|
63
83
|
"""A branch entry in the manifest."""
|
|
64
84
|
|
|
@@ -68,6 +88,11 @@ class ManifestBranch(BaseModel):
|
|
|
68
88
|
path: str
|
|
69
89
|
metadata: dict[str, Any] = Field(default_factory=dict)
|
|
70
90
|
|
|
91
|
+
@field_validator("path")
|
|
92
|
+
@classmethod
|
|
93
|
+
def _normalise_path(cls, value: str) -> str:
|
|
94
|
+
return _posix_path(value)
|
|
95
|
+
|
|
71
96
|
|
|
72
97
|
class ManifestConfigRow(BaseModel):
|
|
73
98
|
"""A single configuration row reference.
|
|
@@ -85,6 +110,11 @@ class ManifestConfigRow(BaseModel):
|
|
|
85
110
|
path: str
|
|
86
111
|
metadata: dict[str, Any] = Field(default_factory=dict)
|
|
87
112
|
|
|
113
|
+
@field_validator("path")
|
|
114
|
+
@classmethod
|
|
115
|
+
def _normalise_path(cls, value: str) -> str:
|
|
116
|
+
return _posix_path(value)
|
|
117
|
+
|
|
88
118
|
|
|
89
119
|
class ManifestConfiguration(BaseModel):
|
|
90
120
|
"""A single configuration reference inside the manifest."""
|
|
@@ -98,6 +128,11 @@ class ManifestConfiguration(BaseModel):
|
|
|
98
128
|
metadata: dict[str, Any] = Field(default_factory=dict)
|
|
99
129
|
rows: list[ManifestConfigRow] = Field(default_factory=list)
|
|
100
130
|
|
|
131
|
+
@field_validator("path")
|
|
132
|
+
@classmethod
|
|
133
|
+
def _normalise_path(cls, value: str) -> str:
|
|
134
|
+
return _posix_path(value)
|
|
135
|
+
|
|
101
136
|
|
|
102
137
|
# ---------------------------------------------------------------------------
|
|
103
138
|
# Root manifest
|
|
@@ -4,6 +4,7 @@ import json
|
|
|
4
4
|
from pathlib import Path
|
|
5
5
|
from unittest.mock import patch
|
|
6
6
|
|
|
7
|
+
import pytest
|
|
7
8
|
import yaml
|
|
8
9
|
|
|
9
10
|
from keboola_agent_cli.config_store import ConfigStore
|
|
@@ -15,6 +16,7 @@ from keboola_agent_cli.services.deep_lineage_service import (
|
|
|
15
16
|
Table,
|
|
16
17
|
_collect_create_targets,
|
|
17
18
|
_collect_cte_names,
|
|
19
|
+
_read_source,
|
|
18
20
|
_strip_comments_and_strings,
|
|
19
21
|
extract_sql_table_refs,
|
|
20
22
|
)
|
|
@@ -939,3 +941,48 @@ class TestRenderErDiagramXssRegression:
|
|
|
939
941
|
)
|
|
940
942
|
assert "<img" not in rendered
|
|
941
943
|
assert "<img" in rendered
|
|
944
|
+
|
|
945
|
+
|
|
946
|
+
class TestSourceReadsAreUtf8:
|
|
947
|
+
"""Transformation code must decode the same on every host (issue #570).
|
|
948
|
+
|
|
949
|
+
`Path.read_text()` uses the platform default encoding. On a Czech or Polish
|
|
950
|
+
Windows box that is cp1250, so one accented character in a SQL comment
|
|
951
|
+
aborted the entire `lineage build` with `UnicodeDecodeError`. These run
|
|
952
|
+
everywhere by driving the decode explicitly rather than by depending on the
|
|
953
|
+
host's locale.
|
|
954
|
+
"""
|
|
955
|
+
|
|
956
|
+
def test_utf8_content_survives_a_cp1250_default(
|
|
957
|
+
self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
|
|
958
|
+
) -> None:
|
|
959
|
+
"""The exact reported crash: UTF-8 bytes read on a cp1250 host."""
|
|
960
|
+
sql = tmp_path / "transform.sql"
|
|
961
|
+
# U+0159 encodes to 0xC5 0x99 in UTF-8; 0x99 is undefined in cp1250,
|
|
962
|
+
# which is what raised in the report.
|
|
963
|
+
sql.write_bytes("-- příprava dat\nSELECT 1 FROM t;\n".encode())
|
|
964
|
+
|
|
965
|
+
real_read_text = Path.read_text
|
|
966
|
+
|
|
967
|
+
def cp1250_default(
|
|
968
|
+
self: Path, encoding: str | None = None, errors: str | None = None
|
|
969
|
+
) -> str:
|
|
970
|
+
# Mimic a Windows host: no explicit encoding means cp1250.
|
|
971
|
+
return real_read_text(self, encoding=encoding or "cp1250", errors=errors)
|
|
972
|
+
|
|
973
|
+
monkeypatch.setattr(Path, "read_text", cp1250_default)
|
|
974
|
+
|
|
975
|
+
code = _read_source(sql)
|
|
976
|
+
assert "SELECT 1 FROM t" in code
|
|
977
|
+
assert "příprava" in code, "UTF-8 content must round-trip intact"
|
|
978
|
+
|
|
979
|
+
def test_genuinely_undecodable_bytes_do_not_abort_the_build(self, tmp_path: Path) -> None:
|
|
980
|
+
"""A locally-edited file saved in the OS codepage costs a comment, not the graph."""
|
|
981
|
+
sql = tmp_path / "transform.sql"
|
|
982
|
+
# 0x81 is invalid UTF-8 and is the byte from the report's traceback.
|
|
983
|
+
sql.write_bytes(b"-- koment\x81\nSELECT 1 FROM in.c_bucket.tbl;\n")
|
|
984
|
+
|
|
985
|
+
code = _read_source(sql)
|
|
986
|
+
|
|
987
|
+
# The table reference -- the only thing lineage actually needs -- survives.
|
|
988
|
+
assert "in.c_bucket.tbl" in code
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"""Tests for sync manifest models and load/save functions."""
|
|
2
2
|
|
|
3
3
|
import json
|
|
4
|
+
from pathlib import Path
|
|
4
5
|
|
|
5
6
|
import pytest
|
|
6
7
|
|
|
@@ -275,3 +276,48 @@ class TestManifestExtraFields:
|
|
|
275
276
|
# Extra field on nested model
|
|
276
277
|
project_dumped = loaded.project.model_dump(mode="json", by_alias=True)
|
|
277
278
|
assert project_dumped["unknownField"] == "kept"
|
|
279
|
+
|
|
280
|
+
|
|
281
|
+
class TestManifestPathsArePortable:
|
|
282
|
+
"""The manifest is tracked in git, so its paths must be OS-neutral.
|
|
283
|
+
|
|
284
|
+
The asymmetry is what makes this dangerous: `Path()` on Windows accepts
|
|
285
|
+
`a/b`, but on POSIX `a\\b` is a single filename containing a backslash. A
|
|
286
|
+
manifest written on Windows therefore stops resolving for every teammate on
|
|
287
|
+
macOS or Linux, while the reverse direction works and hides the problem.
|
|
288
|
+
"""
|
|
289
|
+
|
|
290
|
+
def test_windows_separators_are_normalised_on_load(self) -> None:
|
|
291
|
+
"""A manifest already committed by a Windows kbagent repairs itself."""
|
|
292
|
+
cfg = ManifestConfiguration(
|
|
293
|
+
branchId=1,
|
|
294
|
+
componentId="keboola.ex-http",
|
|
295
|
+
id="123",
|
|
296
|
+
path=r"extractor\keboola.ex-http\adopted-extractor",
|
|
297
|
+
)
|
|
298
|
+
assert cfg.path == "extractor/keboola.ex-http/adopted-extractor"
|
|
299
|
+
|
|
300
|
+
def test_branch_and_row_paths_are_normalised_too(self) -> None:
|
|
301
|
+
assert ManifestBranch(id=1, path=r"main\nested").path == "main/nested"
|
|
302
|
+
assert ManifestConfigRow(id="r1", path=r"rows\first").path == "rows/first"
|
|
303
|
+
|
|
304
|
+
def test_posix_paths_are_left_alone(self) -> None:
|
|
305
|
+
"""The common case must be untouched, not round-tripped through a rewrite."""
|
|
306
|
+
cfg = ManifestConfiguration(branchId=1, componentId="c", id="1", path="extractor/c/name")
|
|
307
|
+
assert cfg.path == "extractor/c/name"
|
|
308
|
+
|
|
309
|
+
def test_a_saved_manifest_holds_forward_slashes(self, tmp_path: Path) -> None:
|
|
310
|
+
"""End to end: what lands in git is portable regardless of the writer's OS."""
|
|
311
|
+
manifest = Manifest(
|
|
312
|
+
project=ManifestProject(id=1, apiHost="connection.keboola.com"),
|
|
313
|
+
naming=ManifestNaming(),
|
|
314
|
+
branches=[ManifestBranch(id=1, path="main")],
|
|
315
|
+
configurations=[
|
|
316
|
+
ManifestConfiguration(branchId=1, componentId="c", id="1", path=r"extractor\c\name")
|
|
317
|
+
],
|
|
318
|
+
)
|
|
319
|
+
save_manifest(tmp_path, manifest)
|
|
320
|
+
|
|
321
|
+
raw = (tmp_path / ".keboola" / "manifest.json").read_text(encoding="utf-8")
|
|
322
|
+
assert "extractor/c/name" in raw
|
|
323
|
+
assert "\\\\" not in raw, "a backslash in the tracked manifest breaks POSIX checkouts"
|
|
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
|
{keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/_checkbox_select.py
RENAMED
|
File without changes
|
|
File without changes
|
{keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/_data_app_runtime.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/_semantic_layer_crud.py
RENAMED
|
File without changes
|
{keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/_semantic_layer_helpers.py
RENAMED
|
File without changes
|
{keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/_storage_snapshots.py
RENAMED
|
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
|