keboola-cli 0.100.2__tar.gz → 0.100.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.100.2 → keboola_cli-0.100.4}/CLAUDE.md +3 -3
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/PKG-INFO +1 -1
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/pyproject.toml +1 -1
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/changelog.py +18 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/context.py +4 -4
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/project.py +8 -3
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/_sync_writeback.py +9 -1
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_cli.py +64 -0
- keboola_cli-0.100.4/tests/test_sync_push_companion_hashes.py +137 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_sync_service.py +9 -1
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/.gitignore +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/CONTRIBUTING.md +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/LICENSE +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/Makefile +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/README.md +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/examples/README.md +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/examples/storage_tui/README.md +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/formal/sync/README.md +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/plugins/kbagent/.claude-plugin/CLAUDE.md +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/plugins/kbagent/skills/kbagent-cicd-migration/scripts/migrate_cicd.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/plugins/kbagent/skills/kbagent-promotion-pipeline/scripts/generate_promotion_pipeline.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/scripts/check_cli_spec.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/scripts/check_command_sync.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/scripts/check_error_codes.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/scripts/check_file_size.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/scripts/check_release_scope.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/scripts/check_sentinel_guards.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/scripts/check_version_gates.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/scripts/check_wheel_ui.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/scripts/cli_spec_baseline.json +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/scripts/debug_linkedby_type.sh +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/scripts/file_size_baseline.json +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/scripts/gen_command_reference.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/scripts/gen_endpoint_reference.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/scripts/gen_release_notes.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/scripts/generate_changelog.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/scripts/generate_skill.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/scripts/hatch_build.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/scripts/lineage_deep.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/scripts/post-edit-quality.sh +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/scripts/pre-commit +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/scripts/release_latest.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/scripts/sync_version.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/scripts/web-dev.sh +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/__init__.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/__main__.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/ai_client.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/auth/__init__.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/auth/auth_client.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/auth/device.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/auth/environment.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/auth/models.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/auth/pkce.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/auth/sentinel.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/auth/state_store.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/auth/token_provider.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/auth/totp.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/auto_update.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/cli.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/client/__init__.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/client/_client.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/client/_core.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/client/_s3_multipart.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/client/_transfer.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/client/billing.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/client/branches.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/client/configs.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/client/editor.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/client/merge_requests.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/client/misc.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/client/notifications.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/client/query.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/client/queue.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/client/storage_files.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/client/storage_tables.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/client/stream.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/client/tokens.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/client/triggers.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/client/workspaces.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/__init__.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/_all_projects.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/_auth_picker.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/_checkbox_select.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/_config_clone_cmd.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/_config_oauth.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/_config_trash_cmd.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/_config_variables_render.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/_data_app_git.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/_data_app_password.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/_data_app_runtime.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/_flow_triggers.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/_helpers.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/_lineage_build_output.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/_lineage_tree.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/_merge_request_common.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/_merge_request_render.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/_merge_request_writes.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/_metadata_input.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/_progress.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/_project_create.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/_project_pin.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/_project_ref.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/_semantic_layer_crud.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/_semantic_layer_helpers.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/_semantic_layer_reference_data.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/_semantic_layer_scope.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/_storage_delete.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/_storage_describe.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/_storage_jobs.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/_storage_snapshots.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/_storage_table_detail.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/_storage_tables_render.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/_sync_clone_render.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/_sync_push_render.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/_url_copy.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/agent.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/auth.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/billing.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/branch.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/changelog.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/component.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/config.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/config_state.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/data_app.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/dev_portal.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/docs.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/doctor.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/encrypt.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/feature.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/flow.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/http_client.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/init.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/job.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/kai.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/lineage.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/merge_request.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/notification.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/org.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/permissions.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/repl.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/schedule.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/search.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/semantic_layer.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/serve.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/sharing.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/storage.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/stream.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/sync.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/token.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/transformation.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/version.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/workspace.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/config_store.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/constants.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/data_science_client.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/dev_portal_client.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/effective_branch.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/errors.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/frozen_dist.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/http_base.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/json_utils.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/lib.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/manage_client.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/metastore_client.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/models.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/output.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/permissions.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/project_ref.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/py.typed +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/resources/__init__.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/resources/flow/__init__.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/resources/flow/conditional-flow-schema.json +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/resources/flow/conditional_flow_examples.jsonl +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/resources/flow/flow-schema.json +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/resources/flow/legacy_flow_examples.jsonl +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/result_models.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/scheduler_client.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/server/__init__.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/server/_serve_command_map.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/server/agent_runner.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/server/agents_store.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/server/app.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/server/auth.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/server/dependencies.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/server/pricing.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/server/route_permissions.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/server/routers/__init__.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/server/routers/agents.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/server/routers/ai_chat.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/server/routers/auth.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/server/routers/billing.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/server/routers/branches.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/server/routers/components.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/server/routers/configs.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/server/routers/data_apps.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/server/routers/dev_portal.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/server/routers/docs.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/server/routers/encrypt.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/server/routers/feature.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/server/routers/flows.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/server/routers/health.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/server/routers/jobs.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/server/routers/kai.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/server/routers/lineage.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/server/routers/members.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/server/routers/merge_requests.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/server/routers/notifications.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/server/routers/org.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/server/routers/permissions.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/server/routers/projects.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/server/routers/schedules.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/server/routers/search.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/server/routers/semantic_layer.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/server/routers/sharing.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/server/routers/storage.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/server/routers/stream.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/server/routers/token.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/server/routers/transformation.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/server/routers/workspaces.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/server/run_broadcaster.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/server/sse.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/__init__.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/_auth_registration.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/_column_descriptions.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/_config_clone.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/_config_set_guard.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/_config_trash.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/_data_app_bodies.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/_data_app_password.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/_describe_batch_input.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/_encryption.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/_lineage_ai.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/_lineage_er.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/_lineage_mermaid.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/_lineage_paths.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/_lineage_trace.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/_semantic_layer_cascade.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/_semantic_layer_crud.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/_semantic_layer_fqn.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/_semantic_layer_internals.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/_semantic_layer_lookup.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/_semantic_layer_reference_data.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/_semantic_layer_scope.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/_storage_downloads.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/_storage_jobs.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/_storage_tables.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/_sync_baseline.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/_sync_bindings.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/_sync_branch.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/_sync_bulk.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/_sync_clone.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/_sync_clone_warnings.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/_sync_data_app.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/_sync_models.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/_sync_project_guard.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/_sync_push_ops.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/_sync_stale.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/_sync_storage.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/_sync_workspace.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/_table_detail.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/_token_last_used.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/_transformation_ops.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/_workspace_load_plan.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/agent_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/auth_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/base.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/billing_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/branch_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/component_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/config_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/data_app_git_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/data_app_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/deep_lineage_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/dev_portal_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/docs_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/doctor_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/encrypt_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/feature_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/flow_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/flow_validation.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/http_forwarder_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/job_idempotency_store.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/job_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/kai_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/lineage_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/member_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/merge_request_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/notification_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/org_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/project_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/repo_validate_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/schedule_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/search_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/semantic_layer_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/sharing_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/snapshot_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/storage_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/stream_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/sync_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/table_usage.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/token_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/transformation_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/variables_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/version_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/workspace_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/stream_client.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/sync/__init__.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/sync/branch_mapping.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/sync/branch_registry.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/sync/branch_scope.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/sync/clone.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/sync/code_extraction.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/sync/config_format.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/sync/diff_engine.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/sync/git_utils.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/sync/manifest.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/sync/naming.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/sync/secrets.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/sync/sql_split.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/telemetry.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/update_notice.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/update_runner.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/yaml_input.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/__init__.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/conftest.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/helpers.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/snapshots/human_output/branch_merge_warning.txt +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/snapshots/human_output/config_detail_api_error.txt +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/snapshots/human_output/config_detail_panel.txt +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/snapshots/human_output/config_list_fanout_failure.txt +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/snapshots/human_output/config_list_table.txt +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/snapshots/human_output/project_remove_success.txt +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_agent_cli.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_agent_prompt.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_agent_prompt_helper.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_agent_runner.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_agent_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_agent_tombstone.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_agents_store_events.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_ai_client.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_all_projects_and_warnings.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_api_call_counts.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_auth_client.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_auth_device.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_auth_environment.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_auth_models.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_auth_picker.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_auth_pkce.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_auth_register_projects.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_auth_sentinel.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_auth_sentinel_guards.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_auth_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_auth_state_store.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_auth_totp.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_auto_update.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_base_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_billing_cli.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_billing_client.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_billing_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_branch_metadata_cli.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_branch_metadata_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_branch_registry.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_branch_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_branch_zero.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_build_hook.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_changelog_check.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_changelog_render.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_check_cli_spec.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_check_command_sync.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_check_file_size.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_check_release_scope.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_check_sentinel_guards.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_check_version_gates.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_checkbox_select.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_choice_enums.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_cli_auth.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_cli_contract.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_cli_human_snapshots.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_client.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_client_device_enrollment.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_client_token_events.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_component_cli.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_component_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_component_sync_action.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_config_clone_cli.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_config_clone_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_config_create_cli.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_config_create_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_config_encryption.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_config_examples.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_config_metadata.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_config_rename.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_config_rename_cli.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_config_resolution.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_config_row_cli.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_config_row_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_config_search.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_config_search_cli.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_config_set_default_bucket.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_config_set_guard.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_config_state.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_config_store.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_config_trash.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_config_update.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_data_app_cli.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_data_app_git_repo.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_data_app_password.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_data_app_plain_env_keys.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_data_app_secrets_cli.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_data_app_secrets_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_data_app_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_data_app_validate_repo_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_deep_lineage_ai.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_deep_lineage_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_dev_portal_cli.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_dev_portal_client.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_dev_portal_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_doc_examples.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_docs_cli.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_doctor_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_e2e.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_e2e_auth.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_e2e_config_dir_mode.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_e2e_lineage_deep.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_effective_branch.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_encrypt_cli.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_encrypt_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_encryption.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_error_forwarding.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_errors.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_feature_cli.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_feature_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_file_locking.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_flow_cli.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_flow_examples.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_flow_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_flow_validation.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_frozen_dist.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_gen_command_reference.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_gen_endpoint_reference.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_gen_release_notes.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_generate_promotion_pipeline.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_helpers.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_http_base.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_http_base_auth.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_http_client_cmd.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_http_forwarder_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_install_script.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_integration.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_job_idempotency_store.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_job_options.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_json_utils.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_kai_cli.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_kai_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_lib.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_lib_device_enrollment.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_license_consistency.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_lineage_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_lineage_view.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_local_ai_chat.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_major_gate.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_manage_client.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_manage_token_bulk.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_manage_token_cli.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_mcp_migration_recipe.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_member_cli.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_member_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_merge_request_cli.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_merge_request_client.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_merge_request_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_metastore_client.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_migrate_cicd.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_migration_page.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_models.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_normalize_script.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_notification_cli.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_notification_client.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_notification_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_org_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_output.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_partial_failure_exit_code.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_permissions.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_permissions_cli.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_pinned_installs.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_pricing.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_project_create_cli.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_project_edit.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_project_edit_cli.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_project_info_cli.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_project_info_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_project_ref.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_project_token_stdin_no_leak.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_release_kbagent_ai_kit_sync.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_release_latest.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_release_workflow_major.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_repl.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_result_models.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_run_broadcaster.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_s3_multipart.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_schedule_cli.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_schedule_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_scheduler_client.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_search_cli.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_search_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_semantic_layer_cli.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_semantic_layer_schema.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_semantic_layer_scope.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_semantic_layer_scope_cli.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_semantic_layer_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_serve_banner_encoding.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_serve_conversation_id.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_serve_extras_hint.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_serve_telemetry.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_serve_ui.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_server_active_project.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_server_auth.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_server_dry_run_guard.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_server_permissions.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_server_production_branch.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_server_project_ref.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_server_route_permissions.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_server_router_calls.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_server_semantic_layer_routes_e2e.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_server_smoke.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_services.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_sharing_cli.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_sharing_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_skill_frontmatter.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_sql_split.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_storage_clone.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_storage_create_table.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_storage_delete.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_storage_describe_cli.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_storage_describe_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_storage_empty_definition.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_storage_export_filters.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_storage_files.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_storage_import_jobs.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_storage_snapshots.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_storage_swap.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_storage_table_definition.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_storage_tables.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_storage_truncate.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_storage_write.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_stream_cli.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_stream_client.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_stream_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_sync_adopted_files.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_sync_baseline_stamping.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_sync_branch_mapping.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_sync_branch_scope.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_sync_cli.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_sync_cli_behavior.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_sync_clone.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_sync_clone_links.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_sync_code_extraction.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_sync_config_format.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_sync_data_app_type.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_sync_diff_engine.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_sync_e2e.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_sync_encrypt.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_sync_force_pull_baseline.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_sync_formal_counterexamples.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_sync_manifest.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_sync_naming.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_sync_plaintext_audit.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_sync_project_guard.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_sync_pull_companion_files.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_sync_push_encrypt_first.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_sync_push_script_guard.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_sync_reconcile.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_sync_secrets.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_sync_storage_jobs.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_sync_version_script.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_sync_workspaces.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_table_usage.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_telemetry.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_token_cli.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_token_provider.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_token_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_transfer_progress.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_transformation_cli.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_transformation_ops.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_triggers_client.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_update_runner.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_url_copy.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_variables_cli.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_variables_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_version_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_workspace_cli.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_workspace_gc.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_workspace_service.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_workspace_sql_helper.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/tests/test_yaml_input.py +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/README.md +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/index.html +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/package-lock.json +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/package.json +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/postcss.config.js +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/App.tsx +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/api/client.test.ts +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/api/client.ts +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/changelogNotes.test.ts +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/changelogNotes.ts +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/components/AgentRunView.tsx +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/components/CommandPalette.tsx +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/components/ConfirmModal.tsx +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/components/DetailTabs.tsx +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/components/Drawer.tsx +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/components/Empty.tsx +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/components/JsonView.tsx +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/components/KeyValueGrid.tsx +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/components/ManageTokenModal.tsx +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/components/PillList.tsx +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/components/RawDetail.tsx +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/components/SessionExpiredBanner.tsx +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/components/Table.tsx +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/components/WhatsNew.tsx +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/config/credits.test.ts +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/config/credits.ts +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/index.css +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/layout/Shell.tsx +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/layout/Sidebar.tsx +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/layout/StatusBar.tsx +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/layout/TopBar.tsx +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/lib/branch.test.ts +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/lib/branch.ts +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/lib/time.test.ts +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/lib/time.ts +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/main.tsx +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/pages/Agents.tsx +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/pages/Branches.tsx +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/pages/Changelog.tsx +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/pages/Components.tsx +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/pages/Configs.tsx +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/pages/Dashboard.tsx +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/pages/DataApps.tsx +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/pages/Doctor.tsx +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/pages/Encrypt.tsx +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/pages/Flows.tsx +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/pages/Jobs.tsx +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/pages/JobsAll.tsx +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/pages/Lineage.tsx +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/pages/LocalAi.tsx +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/pages/Members.tsx +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/pages/Org.tsx +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/pages/Projects.tsx +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/pages/Schedules.tsx +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/pages/Search.tsx +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/pages/SemanticLayer.tsx +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/pages/SemanticLayerDialogs.tsx +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/pages/Sharing.tsx +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/pages/Storage.tsx +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/pages/Streams.tsx +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/pages/Tokens.tsx +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/pages/TokensAll.tsx +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/pages/Workspaces.tsx +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/pages/jobsShared.test.ts +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/pages/jobsShared.tsx +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/pages/storageSel.test.ts +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/pages/tokensShared.test.ts +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/pages/tokensShared.tsx +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/router.test.ts +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/router.ts +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/state.tsx +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/theme.tsx +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/types.ts +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/useHashSelection.ts +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/src/whatsnew.ts +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/tailwind.config.ts +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/tsconfig.json +0 -0
- {keboola_cli-0.100.2 → keboola_cli-0.100.4}/web/frontend/vite.config.ts +0 -0
|
@@ -490,7 +490,7 @@ kbagent auth register-projects [--stack URL|alias] [--all] [--project-id ID ...]
|
|
|
490
490
|
# starts the server and blocks every destructive route (none of them under `/auth/*`).
|
|
491
491
|
# See docs/web-server.md.
|
|
492
492
|
|
|
493
|
-
kbagent project create --url URL [--project ALIAS] [--name NAME] [--backend snowflake|bigquery] [--sync-backend-init]
|
|
493
|
+
kbagent project create --url URL [--project|--alias ALIAS] [--name NAME] [--backend snowflake|bigquery] [--sync-backend-init]
|
|
494
494
|
# project create (since 0.95.0, DMD-1940): the ONLY kbagent command that works from nothing --
|
|
495
495
|
# no account, no token, no `auth login`. POSTs the unauthenticated provisioning endpoint
|
|
496
496
|
# (`/manage/programmatic-projects`, gated by the `agent-provisioning` stack feature
|
|
@@ -515,13 +515,13 @@ kbagent project create --url URL [--project ALIAS] [--name NAME] [--backend snow
|
|
|
515
515
|
# delivered and may have succeeded (retryable:false, message says not to repeat -- check
|
|
516
516
|
# `auth status`, whose stored session + claim link is the evidence). `--sync-backend-init`
|
|
517
517
|
# raises that call's read timeout to 300s, which can outlast an agent's foreground shell.
|
|
518
|
-
kbagent project add --project NAME --url URL [--token-stdin | --token-file PATH [--keep-token-file] | --token-env NAME | --token TOKEN]
|
|
518
|
+
kbagent project add --project|--alias NAME --url URL [--token-stdin | --token-file PATH [--keep-token-file] | --token-env NAME | --token TOKEN]
|
|
519
519
|
kbagent project list
|
|
520
520
|
kbagent project remove --project NAME
|
|
521
521
|
kbagent project edit --project NAME [--url URL] [--token-stdin | --token-file PATH [--keep-token-file] | --token-env NAME | --token TOKEN] [--new-alias NEW]
|
|
522
522
|
kbagent project status [--project NAME | --all-projects]
|
|
523
523
|
kbagent project refresh --project ALIAS [--dry-run] [--force] [--yes] [--token-description DESC] [--token-expires-in N]
|
|
524
|
-
kbagent project refresh --all [--dry-run] [--force] [--yes] [--token-description DESC] [--token-expires-in N]
|
|
524
|
+
kbagent project refresh --all|--all-projects [--dry-run] [--force] [--yes] [--token-description DESC] [--token-expires-in N]
|
|
525
525
|
kbagent project description-get --project NAME
|
|
526
526
|
kbagent project description-set --project NAME [--text STR | --file PATH | --stdin]
|
|
527
527
|
kbagent project use ALIAS
|
|
@@ -26,6 +26,24 @@ from .constants import CHANGELOG_HEADLINE_MAX_CHARS
|
|
|
26
26
|
|
|
27
27
|
# Ordered newest-first. Each value is a list of brief one-line descriptions.
|
|
28
28
|
CHANGELOG: dict[str, list[str]] = {
|
|
29
|
+
"0.100.4": [
|
|
30
|
+
"Fix (#919, backport of #917): `sync push` now sends an edit to `transform.sql` or another code file "
|
|
31
|
+
"of a config that a push created. Before, it found no change in such a file "
|
|
32
|
+
"(`transform.sql`, `transform.py`, `code.py`, `pyproject.toml`, `_description.md`): "
|
|
33
|
+
"`sync diff` said in sync, `sync push` said there was nothing to push, and the job "
|
|
34
|
+
"kept running the old code. With the same gap, `sync pull --force` could "
|
|
35
|
+
"replace such an edit with the remote code; it now stops with `SYNC_CONFLICT`. An edit "
|
|
36
|
+
"to `_config.yml` was always detected. A tree written by an older version is fixed by "
|
|
37
|
+
"one `sync pull`; copy edited code files aside before it.",
|
|
38
|
+
],
|
|
39
|
+
"0.100.3": [
|
|
40
|
+
"New (#911): `project add` and `project create` also take the alias of the new project "
|
|
41
|
+
"as `--alias`, and `project refresh` also takes `--all-projects`. These are the names of "
|
|
42
|
+
"kbagent 1.0.0, which removes `--project` from these two commands and `--all` from "
|
|
43
|
+
"`project refresh`. A script with the new names works on 0.100.3 and on 1.x. On 0.x, "
|
|
44
|
+
"`--project` and `--all` keep working.",
|
|
45
|
+
"Note (#912): housekeeping with no user-facing change. It updates the filelock package.",
|
|
46
|
+
],
|
|
29
47
|
"0.100.2": [
|
|
30
48
|
"Fix (#898): `kbagent update --beta` now allows a pre-release of kbagent itself, not of "
|
|
31
49
|
"the Python packages that kbagent uses. Before, it allowed pre-releases of every package, "
|
|
@@ -268,7 +268,7 @@ Use `kbagent <command> --help` for full flag details and examples.
|
|
|
268
268
|
|
|
269
269
|
### Project Management
|
|
270
270
|
|
|
271
|
-
kbagent project create --url URL [--project ALIAS] [--name NAME]
|
|
271
|
+
kbagent project create --url URL [--project|--alias ALIAS] [--name NAME]
|
|
272
272
|
[--backend snowflake|bigquery] [--sync-backend-init]
|
|
273
273
|
Create a BRAND-NEW Keboola project from a machine with no Keboola
|
|
274
274
|
identity -- no account, no token, no `auth login` first. The only command
|
|
@@ -300,7 +300,7 @@ Use `kbagent <command> --help` for full flag details and examples.
|
|
|
300
300
|
the stack finish it in the background (the async default warns that the
|
|
301
301
|
first Storage command may fail until it lands).
|
|
302
302
|
|
|
303
|
-
kbagent project add --project NAME --url URL [--token-stdin | --token-file PATH | --token-env NAME | --token TOKEN]
|
|
303
|
+
kbagent project add --project|--alias NAME --url URL [--token-stdin | --token-file PATH | --token-env NAME | --token TOKEN]
|
|
304
304
|
Add a new project connection. Token verified against API.
|
|
305
305
|
See "Getting a Storage token in" below before you pick a flag.
|
|
306
306
|
|
|
@@ -374,8 +374,8 @@ Use `kbagent <command> --help` for full flag details and examples.
|
|
|
374
374
|
`project list`, including on an ERROR row.
|
|
375
375
|
|
|
376
376
|
kbagent project refresh --project ALIAS [--dry-run] [--force] [--yes] [--token-description ...] [--token-expires-in N]
|
|
377
|
-
kbagent project refresh --all [--dry-run] [--force] [--yes] [--token-description ...] [--token-expires-in N]
|
|
378
|
-
Refresh project tokens via Manage API. --all refreshes all projects. --force replaces non-expiring tokens.
|
|
377
|
+
kbagent project refresh --all|--all-projects [--dry-run] [--force] [--yes] [--token-description ...] [--token-expires-in N]
|
|
378
|
+
Refresh project tokens via Manage API. --all (or --all-projects) refreshes all projects. --force replaces non-expiring tokens.
|
|
379
379
|
Browser-login (session) projects are reported under "skipped" with the
|
|
380
380
|
reason that there is no static token to replace -- their access token
|
|
381
381
|
rotates on its own from auth.json. --force does NOT convert them either;
|
|
@@ -172,7 +172,9 @@ def _format_status_table(console: Console, statuses: list[dict[str, Any]]) -> No
|
|
|
172
172
|
@project_app.command("add")
|
|
173
173
|
def project_add(
|
|
174
174
|
ctx: typer.Context,
|
|
175
|
-
alias: str = typer.Option(
|
|
175
|
+
alias: str = typer.Option(
|
|
176
|
+
..., "--project", "--alias", help="Human-friendly name for this project"
|
|
177
|
+
),
|
|
176
178
|
url: str = typer.Option(
|
|
177
179
|
DEFAULT_STACK_URL,
|
|
178
180
|
help="Keboola stack URL",
|
|
@@ -244,7 +246,10 @@ def project_create(
|
|
|
244
246
|
help="Keboola stack URL to create the project on (required -- never guessed)",
|
|
245
247
|
),
|
|
246
248
|
alias: str | None = typer.Option(
|
|
247
|
-
None,
|
|
249
|
+
None,
|
|
250
|
+
"--project",
|
|
251
|
+
"--alias",
|
|
252
|
+
help="Local alias for the new project (default: from its name)",
|
|
248
253
|
),
|
|
249
254
|
name: str | None = typer.Option(None, "--name", help="Name for the new Keboola project"),
|
|
250
255
|
backend: ProjectBackend | None = typer.Option(
|
|
@@ -574,7 +579,7 @@ def project_refresh(
|
|
|
574
579
|
None, "--project", "-p", help="Refresh token for a specific project"
|
|
575
580
|
),
|
|
576
581
|
all_projects: bool = typer.Option(
|
|
577
|
-
False, "--all", help="Refresh all projects with invalid tokens"
|
|
582
|
+
False, "--all", "--all-projects", help="Refresh all projects with invalid tokens"
|
|
578
583
|
),
|
|
579
584
|
dry_run: bool = typer.Option(
|
|
580
585
|
False, "--dry-run", help="Preview what would be refreshed without making changes"
|
{keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/services/_sync_writeback.py
RENAMED
|
@@ -61,6 +61,7 @@ def stamp_created_config(
|
|
|
61
61
|
new_id=new_id,
|
|
62
62
|
file_hash=hashes.file_hash,
|
|
63
63
|
cfg_hash=stamp.cfg_hash,
|
|
64
|
+
extra_hashes=hashes.extra_hashes,
|
|
64
65
|
)
|
|
65
66
|
apply_stamp(writeback.entry.metadata, stamp)
|
|
66
67
|
return writeback
|
|
@@ -112,6 +113,7 @@ def stamp_updated_config(
|
|
|
112
113
|
new_id=config_id,
|
|
113
114
|
file_hash=hashes.file_hash,
|
|
114
115
|
cfg_hash=stamp.cfg_hash,
|
|
116
|
+
extra_hashes=hashes.extra_hashes,
|
|
115
117
|
).entry
|
|
116
118
|
apply_stamp(entry.metadata, stamp)
|
|
117
119
|
|
|
@@ -125,6 +127,7 @@ def writeback_create_config_in_manifest(
|
|
|
125
127
|
new_id: str,
|
|
126
128
|
file_hash: str,
|
|
127
129
|
cfg_hash: str,
|
|
130
|
+
extra_hashes: dict[str, str],
|
|
128
131
|
) -> WritebackResult:
|
|
129
132
|
"""Record a freshly-created config in the manifest.
|
|
130
133
|
|
|
@@ -154,13 +157,18 @@ def writeback_create_config_in_manifest(
|
|
|
154
157
|
entry.id = new_id
|
|
155
158
|
entry.metadata["pull_hash"] = file_hash
|
|
156
159
|
entry.metadata["pull_config_hash"] = cfg_hash
|
|
160
|
+
entry.metadata["pull_extra_hashes"] = extra_hashes
|
|
157
161
|
return WritebackResult(entry=entry, previous_id=previous_id)
|
|
158
162
|
new_entry = ManifestConfiguration(
|
|
159
163
|
branchId=target_branch,
|
|
160
164
|
componentId=component_id,
|
|
161
165
|
id=new_id,
|
|
162
166
|
path=config_path_str,
|
|
163
|
-
metadata={
|
|
167
|
+
metadata={
|
|
168
|
+
"pull_hash": file_hash,
|
|
169
|
+
"pull_config_hash": cfg_hash,
|
|
170
|
+
"pull_extra_hashes": extra_hashes,
|
|
171
|
+
},
|
|
164
172
|
)
|
|
165
173
|
manifest.configurations.append(new_entry)
|
|
166
174
|
return WritebackResult(entry=new_entry, previous_id="")
|
|
@@ -10,6 +10,7 @@ from typing import Any
|
|
|
10
10
|
from unittest.mock import MagicMock, patch
|
|
11
11
|
|
|
12
12
|
import pytest
|
|
13
|
+
import typer.main
|
|
13
14
|
from typer.testing import CliRunner
|
|
14
15
|
|
|
15
16
|
from helpers import make_mock_client
|
|
@@ -75,6 +76,48 @@ class TestProjectAdd:
|
|
|
75
76
|
# Token should be masked
|
|
76
77
|
assert "55555" not in output["data"]["token"]
|
|
77
78
|
|
|
79
|
+
def test_project_add_alias_option(self, tmp_path: Path) -> None:
|
|
80
|
+
"""--alias is the 1.x name of --project here, so one command works on 0.x and 1.x."""
|
|
81
|
+
mock_client = make_mock_client(project_name="Prod Project", project_id=5678)
|
|
82
|
+
config_dir = tmp_path / "config"
|
|
83
|
+
config_dir.mkdir()
|
|
84
|
+
|
|
85
|
+
with (
|
|
86
|
+
patch("keboola_agent_cli.cli.ConfigStore") as MockStore,
|
|
87
|
+
patch("keboola_agent_cli.cli.ProjectService") as MockService,
|
|
88
|
+
patch.dict(os.environ, {"KBC_TOKEN": TEST_TOKEN}),
|
|
89
|
+
):
|
|
90
|
+
store_instance = ConfigStore(config_dir=config_dir)
|
|
91
|
+
MockStore.return_value = store_instance
|
|
92
|
+
MockService.return_value = ProjectService(
|
|
93
|
+
config_store=store_instance,
|
|
94
|
+
client_factory=lambda url, token: mock_client,
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
result = runner.invoke(
|
|
98
|
+
app,
|
|
99
|
+
[
|
|
100
|
+
"--json",
|
|
101
|
+
"project",
|
|
102
|
+
"add",
|
|
103
|
+
"--alias",
|
|
104
|
+
"prod",
|
|
105
|
+
"--url",
|
|
106
|
+
"https://connection.keboola.com",
|
|
107
|
+
],
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
assert result.exit_code == 0, f"Exit code {result.exit_code}: {result.output}"
|
|
111
|
+
assert json.loads(result.output)["data"]["alias"] == "prod"
|
|
112
|
+
assert "prod" in store_instance.load().projects
|
|
113
|
+
|
|
114
|
+
def test_project_create_takes_alias_option(self) -> None:
|
|
115
|
+
"""project create accepts --alias, the 1.x name of its --project."""
|
|
116
|
+
root: Any = typer.main.get_command(app)
|
|
117
|
+
create = root.commands["project"].commands["create"]
|
|
118
|
+
alias = next(p for p in create.params if p.name == "alias")
|
|
119
|
+
assert alias.opts == ["--project", "--alias"]
|
|
120
|
+
|
|
78
121
|
def test_project_add_success_human(self, tmp_path: Path) -> None:
|
|
79
122
|
"""project add in human mode outputs success message."""
|
|
80
123
|
mock_client = make_mock_client()
|
|
@@ -8520,6 +8563,27 @@ class TestProjectRefresh:
|
|
|
8520
8563
|
assert output["status"] == "error"
|
|
8521
8564
|
assert "not both" in output["error"]["message"]
|
|
8522
8565
|
|
|
8566
|
+
def test_project_refresh_all_projects_is_the_all_option(self, tmp_path: Path) -> None:
|
|
8567
|
+
"""--all-projects is the 1.x name of --all: with --project it is the same usage error."""
|
|
8568
|
+
config_dir = tmp_path / "config"
|
|
8569
|
+
config_dir.mkdir()
|
|
8570
|
+
store = ConfigStore(config_dir=config_dir)
|
|
8571
|
+
|
|
8572
|
+
with (
|
|
8573
|
+
patch("keboola_agent_cli.cli.ConfigStore") as MockStore,
|
|
8574
|
+
patch("keboola_agent_cli.cli.OrgService"),
|
|
8575
|
+
):
|
|
8576
|
+
MockStore.return_value = store
|
|
8577
|
+
|
|
8578
|
+
result = runner.invoke(
|
|
8579
|
+
app,
|
|
8580
|
+
["--json", "project", "refresh", "--project", "prod", "--all-projects", "--yes"],
|
|
8581
|
+
)
|
|
8582
|
+
|
|
8583
|
+
assert result.exit_code == 2, f"Exit code {result.exit_code}: {result.output}"
|
|
8584
|
+
output = json.loads(result.output)
|
|
8585
|
+
assert "not both" in output["error"]["message"]
|
|
8586
|
+
|
|
8523
8587
|
def test_project_refresh_dry_run(self, tmp_path: Path) -> None:
|
|
8524
8588
|
"""project refresh --all --dry-run --json shows preview without changes."""
|
|
8525
8589
|
config_dir = tmp_path / "config"
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"""A config CREATED by `sync push` must track its companion code files.
|
|
2
|
+
|
|
3
|
+
`sync pull` records a hash for every companion file (`transform.sql`,
|
|
4
|
+
`code.py`, ...) under `pull_extra_hashes`; diff reads an edit to one of them
|
|
5
|
+
only through that record. The create path recorded `_config.yml` alone, so
|
|
6
|
+
after a push that created a config, a later edit to its SQL diffed as
|
|
7
|
+
"unchanged" and the next push sent nothing -- exit 0, the job kept running the
|
|
8
|
+
old code. Reported by a customer on a dev-branch loop (author in `main/`,
|
|
9
|
+
`sync push --branch <dev>`, edit `transform.sql`, push again).
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
from pathlib import Path
|
|
15
|
+
|
|
16
|
+
import pytest
|
|
17
|
+
|
|
18
|
+
import test_sync_formal_counterexamples as formal
|
|
19
|
+
from test_sync_formal_counterexamples import DEV, PROD, World
|
|
20
|
+
|
|
21
|
+
TRANSFORMATION = "keboola.snowflake-transformation"
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@pytest.fixture
|
|
25
|
+
def world(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> World:
|
|
26
|
+
"""A sync world whose fake remote lists configs under a SQL transformation."""
|
|
27
|
+
monkeypatch.setattr(formal, "COMP", TRANSFORMATION)
|
|
28
|
+
w = World(tmp_path)
|
|
29
|
+
return w
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def _author_transformation(root: Path) -> Path:
|
|
33
|
+
"""Write a new, untracked transformation under main/ (no config id yet)."""
|
|
34
|
+
config_dir = root / "main" / "transformation" / TRANSFORMATION / "orders-model"
|
|
35
|
+
config_dir.mkdir(parents=True)
|
|
36
|
+
(config_dir / "_config.yml").write_text(
|
|
37
|
+
"version: 2\nname: orders-model\ndescription: ''\nparameters: {}\n"
|
|
38
|
+
f"_keboola:\n component_id: {TRANSFORMATION}\n"
|
|
39
|
+
)
|
|
40
|
+
(config_dir / "transform.sql").write_text("SELECT 1 FROM VALUES (1);\n")
|
|
41
|
+
return config_dir
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def _edit_sql(config_dir: Path) -> None:
|
|
45
|
+
sql = config_dir / "transform.sql"
|
|
46
|
+
sql.write_text(sql.read_text().replace("VALUES", "VALUEZ"))
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def _remote_sql(world: World, branch: int, config_id: str) -> str:
|
|
50
|
+
blocks = world.api.remote[branch][config_id]["configuration"]["parameters"]["blocks"]
|
|
51
|
+
return "".join(s for b in blocks for c in b["codes"] for s in c["script"])
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def test_sql_edit_after_create_on_default_branch_is_pushed(world: World) -> None:
|
|
55
|
+
world.init()
|
|
56
|
+
world.pull()
|
|
57
|
+
config_dir = _author_transformation(world.root)
|
|
58
|
+
assert world.push().get("created", 0) == 1
|
|
59
|
+
(config_id,) = world.api.ids(PROD)
|
|
60
|
+
|
|
61
|
+
_edit_sql(config_dir)
|
|
62
|
+
|
|
63
|
+
assert world.diff()["summary"]["modified"] == 1
|
|
64
|
+
assert world.push().get("updated", 0) == 1
|
|
65
|
+
assert "VALUEZ" in _remote_sql(world, PROD, config_id)
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def test_sql_edit_after_promote_create_to_dev_branch_is_pushed(world: World) -> None:
|
|
69
|
+
"""The customer's loop: author in main/, push to a dev branch, edit, push."""
|
|
70
|
+
world.init()
|
|
71
|
+
world.pull()
|
|
72
|
+
config_dir = _author_transformation(world.root)
|
|
73
|
+
assert world.push(branch=DEV).get("created", 0) == 1
|
|
74
|
+
(config_id,) = world.api.ids(DEV)
|
|
75
|
+
|
|
76
|
+
_edit_sql(config_dir)
|
|
77
|
+
|
|
78
|
+
assert world.diff(branch=DEV)["summary"]["modified"] == 1
|
|
79
|
+
second = world.push(branch=DEV)
|
|
80
|
+
assert second.get("updated", 0) == 1
|
|
81
|
+
assert second.get("created", 0) == 0
|
|
82
|
+
assert "VALUEZ" in _remote_sql(world, DEV, config_id)
|
|
83
|
+
assert world.api.ids(PROD) == []
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def test_sql_edit_after_promoting_a_pulled_config_is_pushed(world: World) -> None:
|
|
87
|
+
"""A production config promoted to a dev branch gets a NEW dev entry."""
|
|
88
|
+
world.api.put(
|
|
89
|
+
PROD,
|
|
90
|
+
"cfg-1",
|
|
91
|
+
"Orders",
|
|
92
|
+
"a",
|
|
93
|
+
extra={"blocks": [{"name": "B", "codes": [{"name": "C", "script": ["SELECT 1;"]}]}]},
|
|
94
|
+
)
|
|
95
|
+
world.init()
|
|
96
|
+
world.pull()
|
|
97
|
+
world.push(branch=DEV)
|
|
98
|
+
(dev_id,) = world.api.ids(DEV)
|
|
99
|
+
sql = world.config_dir("orders") / "transform.sql"
|
|
100
|
+
sql.write_text(sql.read_text().replace("SELECT 1", "SELECT 2"))
|
|
101
|
+
|
|
102
|
+
assert world.diff(branch=DEV)["summary"]["modified"] == 1
|
|
103
|
+
assert world.push(branch=DEV).get("updated", 0) == 1
|
|
104
|
+
assert "SELECT 2" in _remote_sql(world, DEV, dev_id)
|
|
105
|
+
assert "SELECT 1" in _remote_sql(world, PROD, "cfg-1")
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def test_unedited_config_stays_clean_after_create(world: World) -> None:
|
|
109
|
+
"""Recording the companion hashes must not turn a clean tree dirty."""
|
|
110
|
+
world.init()
|
|
111
|
+
world.pull()
|
|
112
|
+
_author_transformation(world.root)
|
|
113
|
+
world.push(branch=DEV)
|
|
114
|
+
|
|
115
|
+
summary = world.diff(branch=DEV)["summary"]
|
|
116
|
+
assert summary["modified"] == 0
|
|
117
|
+
assert summary["added"] == 0
|
|
118
|
+
assert world.push(branch=DEV).get("updated", 0) == 0
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def test_force_pull_does_not_overwrite_sql_edit_after_create(world: World) -> None:
|
|
122
|
+
"""Without the companion hashes, pull read an edited `transform.sql` as
|
|
123
|
+
untouched and `--force` replaced it with the remote code once the config
|
|
124
|
+
changed remotely (here: renamed in the UI). It is now a conflict."""
|
|
125
|
+
from keboola_agent_cli.errors import SyncConflictError
|
|
126
|
+
|
|
127
|
+
world.init()
|
|
128
|
+
world.pull()
|
|
129
|
+
config_dir = _author_transformation(world.root)
|
|
130
|
+
world.push()
|
|
131
|
+
(config_id,) = world.api.ids(PROD)
|
|
132
|
+
_edit_sql(config_dir)
|
|
133
|
+
world.api.remote[PROD][config_id]["name"] = "renamed in the UI"
|
|
134
|
+
|
|
135
|
+
with pytest.raises(SyncConflictError):
|
|
136
|
+
world.pull(force=True)
|
|
137
|
+
assert "VALUEZ" in (config_dir / "transform.sql").read_text()
|
|
@@ -3194,6 +3194,7 @@ class TestFreshCreateWriteback:
|
|
|
3194
3194
|
new_id="123456789",
|
|
3195
3195
|
file_hash="abc123",
|
|
3196
3196
|
cfg_hash="def456",
|
|
3197
|
+
extra_hashes={"transform.sql": "sql789"},
|
|
3197
3198
|
)
|
|
3198
3199
|
|
|
3199
3200
|
entry = writeback.entry
|
|
@@ -3205,6 +3206,7 @@ class TestFreshCreateWriteback:
|
|
|
3205
3206
|
assert entry.branch_id == 12345
|
|
3206
3207
|
assert entry.metadata["pull_hash"] == "abc123"
|
|
3207
3208
|
assert entry.metadata["pull_config_hash"] == "def456"
|
|
3209
|
+
assert entry.metadata["pull_extra_hashes"] == {"transform.sql": "sql789"}
|
|
3208
3210
|
assert entry.metadata["KBC.configuration.folderName"] == "FI Pipeline", (
|
|
3209
3211
|
"user-declared KBC.* metadata must survive the writeback"
|
|
3210
3212
|
)
|
|
@@ -3238,6 +3240,7 @@ class TestFreshCreateWriteback:
|
|
|
3238
3240
|
new_id="dev-id-002",
|
|
3239
3241
|
file_hash="h1",
|
|
3240
3242
|
cfg_hash="h2",
|
|
3243
|
+
extra_hashes={},
|
|
3241
3244
|
)
|
|
3242
3245
|
|
|
3243
3246
|
entry = writeback.entry
|
|
@@ -3269,6 +3272,7 @@ class TestFreshCreateWriteback:
|
|
|
3269
3272
|
new_id="999",
|
|
3270
3273
|
file_hash="h1",
|
|
3271
3274
|
cfg_hash="h2",
|
|
3275
|
+
extra_hashes={},
|
|
3272
3276
|
)
|
|
3273
3277
|
|
|
3274
3278
|
entry = writeback.entry
|
|
@@ -3276,7 +3280,11 @@ class TestFreshCreateWriteback:
|
|
|
3276
3280
|
assert len(manifest.configurations) == 1
|
|
3277
3281
|
assert manifest.configurations[0] is entry
|
|
3278
3282
|
assert entry.id == "999"
|
|
3279
|
-
assert entry.metadata == {
|
|
3283
|
+
assert entry.metadata == {
|
|
3284
|
+
"pull_hash": "h1",
|
|
3285
|
+
"pull_config_hash": "h2",
|
|
3286
|
+
"pull_extra_hashes": {},
|
|
3287
|
+
}
|
|
3280
3288
|
|
|
3281
3289
|
def test_propagate_kbc_metadata_calls_set_config_metadata(self, tmp_config_dir: Path) -> None:
|
|
3282
3290
|
"""KBC.* keys are POSTed via client.set_config_metadata; bookkeeping
|
|
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
|
{keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/_checkbox_select.py
RENAMED
|
File without changes
|
{keboola_cli-0.100.2 → keboola_cli-0.100.4}/src/keboola_agent_cli/commands/_config_clone_cmd.py
RENAMED
|
File without changes
|
|
File without changes
|