uipath 2.1.62__tar.gz → 2.1.64__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.
- {uipath-2.1.62 → uipath-2.1.64}/PKG-INFO +1 -1
- {uipath-2.1.62 → uipath-2.1.64}/pyproject.toml +1 -1
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/_auth/_auth_service.py +15 -2
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/_auth/_portal_service.py +29 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/_evals/_progress_reporter.py +6 -4
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/_utils/_project_files.py +63 -14
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/cli_auth.py +7 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/cli_eval.py +1 -1
- {uipath-2.1.62 → uipath-2.1.64}/tests/cli/test_auth.py +44 -0
- {uipath-2.1.62 → uipath-2.1.64}/tests/cli/test_pack.py +253 -0
- {uipath-2.1.62 → uipath-2.1.64}/tests/cli/test_push.py +469 -0
- {uipath-2.1.62 → uipath-2.1.64}/tests/cli/utils/uipath_json.py +9 -1
- {uipath-2.1.62 → uipath-2.1.64}/uv.lock +1 -1
- {uipath-2.1.62 → uipath-2.1.64}/.cursorrules +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/.editorconfig +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/.gitattributes +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/.github/workflows/cd.yml +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/.github/workflows/ci.yml +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/.github/workflows/commitlint.yml +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/.github/workflows/integration_tests.yml +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/.github/workflows/lint.yml +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/.github/workflows/publish-dev.yml +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/.github/workflows/publish-docs.yml +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/.github/workflows/slack.yml +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/.github/workflows/test.yml +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/.gitignore +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/.pre-commit-config.yaml +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/.python-version +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/.vscode/extensions.json +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/.vscode/launch.json +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/.vscode/settings.json +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/CONTRIBUTING.md +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/LICENSE +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/README.md +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/docs/CONTRIBUTING.md +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/docs/FAQ.md +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/docs/assets/env-preparation-failed-dark.png +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/docs/assets/env-preparation-failed-light.png +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/docs/assets/favicon.png +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/docs/assets/logo-dark.svg +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/docs/assets/logo-light.svg +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/docs/cli/index.md +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/docs/core/actions.md +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/docs/core/assets/cloud_env_var_dark.gif +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/docs/core/assets/cloud_env_var_light.gif +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/docs/core/assets/cloud_env_var_secret_dark.png +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/docs/core/assets/cloud_env_var_secret_light.png +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/docs/core/assets/copy_path_dark.png +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/docs/core/assets/copy_path_light.png +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/docs/core/assets.md +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/docs/core/attachments.md +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/docs/core/buckets.md +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/docs/core/connections.md +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/docs/core/context_grounding.md +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/docs/core/environment_variables.md +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/docs/core/getting_started.md +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/docs/core/jobs.md +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/docs/core/llm_gateway.md +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/docs/core/processes.md +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/docs/core/queues.md +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/docs/core/traced.md +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/docs/hooks.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/docs/index.md +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/docs/javascripts/extra.js +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/docs/overrides/main.html +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/docs/overrides/partials/actions.html +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/docs/overrides/partials/logo.html +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/docs/release_policy.md +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/docs/sample_images/google-ADK-agent/agent-output.png +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/docs/stylesheets/extra.css +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/justfile +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/mkdocs.yml +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/py.typed +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/samples/calculator/README.md +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/samples/calculator/main.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/samples/calculator/pyproject.toml +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/samples/event-trigger/.python-version +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/samples/event-trigger/README.md +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/samples/event-trigger/main.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/samples/event-trigger/pyproject.toml +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/samples/google-ADK-agent/.env.example +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/samples/google-ADK-agent/README.md +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/samples/google-ADK-agent/input.json +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/samples/google-ADK-agent/multi_tool_agent/__init__.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/samples/google-ADK-agent/multi_tool_agent/agent.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/samples/google-ADK-agent/pyproject.toml +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/samples/google-ADK-agent/uv.lock +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/scripts/debug_test.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/scripts/lint_httpx_client.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/__init__.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/README.md +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/__init__.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/_auth/_auth_server.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/_auth/_client_credentials.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/_auth/_models.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/_auth/_oidc_utils.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/_auth/_url_utils.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/_auth/_utils.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/_auth/auth_config.json +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/_auth/index.html +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/_auth/localhost.crt +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/_auth/localhost.key +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/_dev/_terminal/__init__.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/_dev/_terminal/_components/_chat.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/_dev/_terminal/_components/_details.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/_dev/_terminal/_components/_history.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/_dev/_terminal/_components/_json_input.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/_dev/_terminal/_components/_new.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/_dev/_terminal/_models/_execution.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/_dev/_terminal/_models/_messages.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/_dev/_terminal/_styles/terminal.tcss +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/_dev/_terminal/_utils/_chat.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/_dev/_terminal/_utils/_exporter.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/_dev/_terminal/_utils/_logger.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/_evals/_evaluator_factory.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/_evals/_models/_evaluation_set.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/_evals/_models/_evaluator_base_params.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/_evals/_models/_output.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/_evals/_models/_sw_reporting.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/_evals/_runtime.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/_push/sw_file_handler.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/_runtime/_contracts.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/_runtime/_escalation.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/_runtime/_hitl.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/_runtime/_logging.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/_runtime/_runtime.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/_runtime/_script_executor.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/_templates/.psmdcp.template +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/_templates/.rels.template +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/_templates/[Content_Types].xml.template +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/_templates/main.py.template +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/_templates/package.nuspec.template +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/_utils/_common.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/_utils/_console.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/_utils/_constants.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/_utils/_debug.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/_utils/_eval_set.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/_utils/_folders.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/_utils/_input_args.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/_utils/_parse_ast.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/_utils/_processes.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/_utils/_studio_project.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/_utils/_tracing.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/_utils/_uv_helpers.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/cli_deploy.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/cli_dev.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/cli_init.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/cli_invoke.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/cli_new.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/cli_pack.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/cli_publish.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/cli_pull.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/cli_push.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/cli_run.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/middlewares.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_cli/spinner.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_config.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_events/__init__.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_events/_event_bus.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_events/_events.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_execution_context.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_folder_context.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_resources/AGENTS.md +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_services/__init__.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_services/_base_service.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_services/actions_service.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_services/api_client.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_services/assets_service.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_services/attachments_service.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_services/buckets_service.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_services/connections_service.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_services/context_grounding_service.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_services/entities_service.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_services/folder_service.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_services/jobs_service.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_services/llm_gateway_service.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_services/processes_service.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_services/queues_service.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_uipath.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_utils/__init__.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_utils/_endpoint.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_utils/_infer_bindings.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_utils/_logs.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_utils/_read_overwrites.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_utils/_request_override.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_utils/_request_spec.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_utils/_ssl_context.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_utils/_url.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_utils/_user_agent.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/_utils/constants.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/agent/_utils.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/agent/conversation/__init__.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/agent/conversation/async_stream.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/agent/conversation/citation.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/agent/conversation/content.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/agent/conversation/conversation.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/agent/conversation/event.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/agent/conversation/exchange.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/agent/conversation/message.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/agent/conversation/meta.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/agent/conversation/tool.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/agent/models/agent.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/eval/_helpers/__init__.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/eval/_helpers/helpers.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/eval/evaluators/__init__.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/eval/evaluators/base_evaluator.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/eval/evaluators/deterministic_evaluator_base.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/eval/evaluators/exact_match_evaluator.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/eval/evaluators/json_similarity_evaluator.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/eval/evaluators/llm_as_judge_evaluator.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/eval/evaluators/trajectory_evaluator.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/eval/models/__init__.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/eval/models/models.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/models/__init__.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/models/action_schema.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/models/actions.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/models/assets.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/models/attachment.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/models/buckets.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/models/connections.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/models/context_grounding.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/models/context_grounding_index.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/models/entities.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/models/errors.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/models/exceptions.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/models/interrupt_models.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/models/job.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/models/llm_gateway.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/models/processes.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/models/queues.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/py.typed +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/telemetry/__init__.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/telemetry/_constants.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/telemetry/_track.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/tracing/__init__.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/tracing/_otel_exporters.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/tracing/_traced.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/tracing/_utils.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/utils/__init__.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/src/uipath/utils/_endpoints_manager.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/testcases/apicalls-testcase/main.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/testcases/apicalls-testcase/pyproject.toml +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/testcases/apicalls-testcase/run.sh +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/testcases/apicalls-testcase/src/assert.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/testcases/basic-testcase/main.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/testcases/basic-testcase/pyproject.toml +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/testcases/basic-testcase/run.sh +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/testcases/basic-testcase/src/assert.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/testcases/common/validate_output.sh +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/testcases/langchain-cross/agent.mermaid +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/testcases/langchain-cross/langgraph.json +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/testcases/langchain-cross/pyproject.toml +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/testcases/langchain-cross/run.sh +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/testcases/langchain-cross/src/assert.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/testcases/langchain-cross/src/main.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/testcases/llamaindex-cross/agent.mermaid +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/testcases/llamaindex-cross/llama_index.json +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/testcases/llamaindex-cross/pyproject.toml +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/testcases/llamaindex-cross/run.sh +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/testcases/llamaindex-cross/src/assert.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/testcases/llamaindex-cross/src/main.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/tests/__init__.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/tests/agent/models/test_agent.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/tests/cli/conftest.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/tests/cli/evaluators/test_json_similarity_evaluator.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/tests/cli/mocks/bindings_script.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/tests/cli/mocks/pyproject.toml +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/tests/cli/mocks/simple_script.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/tests/cli/mocks/uipath-mock.json +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/tests/cli/mocks/uipath-simple-script-mock.json +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/tests/cli/test_hitl.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/tests/cli/test_init.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/tests/cli/test_init_agents_md.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/tests/cli/test_input_args.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/tests/cli/test_invoke.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/tests/cli/test_new.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/tests/cli/test_portal_service_ensure_valid_token.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/tests/cli/test_portal_service_refresh_token.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/tests/cli/test_publish.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/tests/cli/test_pull.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/tests/cli/test_run.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/tests/cli/test_utils.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/tests/cli/utils/common.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/tests/cli/utils/project_details.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/tests/conftest.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/tests/sdk/services/conftest.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/tests/sdk/services/test_actions_service.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/tests/sdk/services/test_api_client.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/tests/sdk/services/test_assets_service.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/tests/sdk/services/test_attachments_service.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/tests/sdk/services/test_base_service.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/tests/sdk/services/test_buckets_service.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/tests/sdk/services/test_connections_service.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/tests/sdk/services/test_context_grounding_service.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/tests/sdk/services/test_entities_service.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/tests/sdk/services/test_folder_service.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/tests/sdk/services/test_jobs_service.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/tests/sdk/services/test_llm_integration.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/tests/sdk/services/test_llm_schema_cleanup.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/tests/sdk/services/test_llm_service.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/tests/sdk/services/test_processes_service.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/tests/sdk/services/test_queues_service.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/tests/sdk/services/test_uipath_llm_integration.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/tests/sdk/test_bindings_inference.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/tests/sdk/test_config.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/tests/sdk/test_overwrites.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/tests/tracing/test_otel_exporters.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/tests/tracing/test_span_utils.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/tests/tracing/test_traced.py +0 -0
- {uipath-2.1.62 → uipath-2.1.64}/tests/tracing/test_tracing_manager.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: uipath
|
3
|
-
Version: 2.1.
|
3
|
+
Version: 2.1.64
|
4
4
|
Summary: Python SDK and CLI for UiPath Platform, enabling programmatic interaction with automation services, process management, and deployment tools.
|
5
5
|
Project-URL: Homepage, https://uipath.com
|
6
6
|
Project-URL: Repository, https://github.com/UiPath/uipath-python
|
@@ -1,6 +1,6 @@
|
|
1
1
|
[project]
|
2
2
|
name = "uipath"
|
3
|
-
version = "2.1.
|
3
|
+
version = "2.1.64"
|
4
4
|
description = "Python SDK and CLI for UiPath Platform, enabling programmatic interaction with automation services, process management, and deployment tools."
|
5
5
|
readme = { file = "README.md", content-type = "text/markdown" }
|
6
6
|
requires-python = ">=3.10"
|
@@ -9,7 +9,11 @@ from urllib.parse import urlparse
|
|
9
9
|
from uipath._cli._auth._auth_server import HTTPServer
|
10
10
|
from uipath._cli._auth._client_credentials import ClientCredentialsService
|
11
11
|
from uipath._cli._auth._oidc_utils import OidcUtils
|
12
|
-
from uipath._cli._auth._portal_service import
|
12
|
+
from uipath._cli._auth._portal_service import (
|
13
|
+
PortalService,
|
14
|
+
get_tenant_id,
|
15
|
+
select_tenant,
|
16
|
+
)
|
13
17
|
from uipath._cli._auth._url_utils import set_force_flag
|
14
18
|
from uipath._cli._auth._utils import update_auth_file, update_env_file
|
15
19
|
from uipath._cli._utils._console import ConsoleLogger
|
@@ -24,6 +28,7 @@ class AuthService:
|
|
24
28
|
client_id: Optional[str],
|
25
29
|
client_secret: Optional[str],
|
26
30
|
base_url: Optional[str],
|
31
|
+
tenant: Optional[str],
|
27
32
|
scope: Optional[str],
|
28
33
|
):
|
29
34
|
self._force = force
|
@@ -32,6 +37,7 @@ class AuthService:
|
|
32
37
|
self._client_id = client_id
|
33
38
|
self._client_secret = client_secret
|
34
39
|
self._base_url = base_url
|
40
|
+
self._tenant = tenant
|
35
41
|
self._scope = scope
|
36
42
|
set_force_flag(self._force)
|
37
43
|
|
@@ -108,7 +114,14 @@ class AuthService:
|
|
108
114
|
update_env_file({"UIPATH_ACCESS_TOKEN": access_token})
|
109
115
|
|
110
116
|
tenants_and_organizations = portal_service.get_tenants_and_organizations()
|
111
|
-
|
117
|
+
|
118
|
+
if self._tenant:
|
119
|
+
base_url = get_tenant_id(
|
120
|
+
self._domain, self._tenant, tenants_and_organizations
|
121
|
+
)
|
122
|
+
else:
|
123
|
+
base_url = select_tenant(self._domain, tenants_and_organizations)
|
124
|
+
|
112
125
|
try:
|
113
126
|
portal_service.post_auth(base_url)
|
114
127
|
except Exception:
|
@@ -231,3 +231,32 @@ def select_tenant(
|
|
231
231
|
)
|
232
232
|
|
233
233
|
return uipath_url
|
234
|
+
|
235
|
+
|
236
|
+
def get_tenant_id(
|
237
|
+
domain: str,
|
238
|
+
tenant_name: str,
|
239
|
+
tenants_and_organizations: TenantsAndOrganizationInfoResponse,
|
240
|
+
) -> str:
|
241
|
+
tenants = tenants_and_organizations["tenants"]
|
242
|
+
|
243
|
+
matched_tenant = next((t for t in tenants if t["name"] == tenant_name), None)
|
244
|
+
if not matched_tenant:
|
245
|
+
console.error(f"Tenant '{tenant_name}' not found.")
|
246
|
+
raise ValueError(f"Tenant '{tenant_name}' not found.")
|
247
|
+
|
248
|
+
domain = get_base_url(domain)
|
249
|
+
account_name = tenants_and_organizations["organization"]["name"]
|
250
|
+
|
251
|
+
base_url = get_base_url(domain)
|
252
|
+
uipath_url = f"{base_url}/{account_name}/{tenant_name}"
|
253
|
+
|
254
|
+
update_env_file(
|
255
|
+
{
|
256
|
+
"UIPATH_URL": uipath_url,
|
257
|
+
"UIPATH_TENANT_ID": matched_tenant["id"],
|
258
|
+
"UIPATH_ORGANIZATION_ID": tenants_and_organizations["organization"]["id"],
|
259
|
+
}
|
260
|
+
)
|
261
|
+
|
262
|
+
return uipath_url
|
@@ -59,7 +59,9 @@ def gracefully_handle_errors(func):
|
|
59
59
|
class StudioWebProgressReporter:
|
60
60
|
"""Handles reporting evaluation progress to StudioWeb."""
|
61
61
|
|
62
|
-
def __init__(self):
|
62
|
+
def __init__(self, spans_exporter: LlmOpsHttpExporter):
|
63
|
+
self.spans_exporter = spans_exporter
|
64
|
+
|
63
65
|
logging.getLogger("uipath._cli.middlewares").setLevel(logging.CRITICAL)
|
64
66
|
console_logger = ConsoleLogger.get_instance()
|
65
67
|
uipath = UiPath()
|
@@ -199,11 +201,11 @@ class StudioWebProgressReporter:
|
|
199
201
|
|
200
202
|
async def handle_update_eval_run(self, payload: EvalRunUpdatedEvent) -> None:
|
201
203
|
try:
|
202
|
-
spans_exporter =
|
203
|
-
|
204
|
+
self.spans_exporter.trace_id = self.eval_set_run_ids.get(
|
205
|
+
payload.execution_id
|
204
206
|
)
|
205
207
|
|
206
|
-
spans_exporter.export(payload.spans)
|
208
|
+
self.spans_exporter.export(payload.spans)
|
207
209
|
|
208
210
|
for eval_result in payload.eval_results:
|
209
211
|
evaluator_id = eval_result.evaluator_id
|
@@ -330,6 +330,10 @@ def files_to_include(
|
|
330
330
|
"""
|
331
331
|
file_extensions_included = [".py", ".mermaid", ".json", ".yaml", ".yml", ".md"]
|
332
332
|
files_included = ["pyproject.toml"]
|
333
|
+
files_excluded = []
|
334
|
+
|
335
|
+
if directories_to_ignore is None:
|
336
|
+
directories_to_ignore = []
|
333
337
|
if include_uv_lock:
|
334
338
|
files_included += ["uv.lock"]
|
335
339
|
if "settings" in config_data:
|
@@ -338,8 +342,10 @@ def files_to_include(
|
|
338
342
|
file_extensions_included.extend(settings["fileExtensionsIncluded"])
|
339
343
|
if "filesIncluded" in settings:
|
340
344
|
files_included.extend(settings["filesIncluded"])
|
341
|
-
|
342
|
-
|
345
|
+
if "filesExcluded" in settings:
|
346
|
+
files_excluded.extend(settings["filesExcluded"])
|
347
|
+
if "directoriesExcluded" in settings:
|
348
|
+
directories_to_ignore.extend(settings["directoriesExcluded"])
|
343
349
|
|
344
350
|
def is_venv_dir(d: str) -> bool:
|
345
351
|
"""Check if a directory is a Python virtual environment.
|
@@ -359,20 +365,63 @@ def files_to_include(
|
|
359
365
|
extra_files: list[FileInfo] = []
|
360
366
|
# Walk through directory and return all files in the allowlist
|
361
367
|
for root, dirs, files in os.walk(directory):
|
362
|
-
# Skip all directories that start with . or are a venv
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
368
|
+
# Skip all directories that start with . or are a venv or are excluded
|
369
|
+
included_dirs = []
|
370
|
+
for d in dirs:
|
371
|
+
if d.startswith(".") or is_venv_dir(os.path.join(root, d)):
|
372
|
+
continue
|
373
|
+
|
374
|
+
# Check if directory should be excluded
|
375
|
+
dir_path = os.path.join(root, d)
|
376
|
+
dir_rel_path = os.path.relpath(dir_path, directory)
|
377
|
+
normalized_dir_rel_path = dir_rel_path.replace(os.sep, "/")
|
378
|
+
|
379
|
+
# Check exclusion: by dirname (for root level) or by relative path
|
380
|
+
should_exclude_dir = (
|
381
|
+
(
|
382
|
+
(
|
383
|
+
d in directories_to_ignore and normalized_dir_rel_path == d
|
384
|
+
) # name match for root level only
|
385
|
+
or normalized_dir_rel_path
|
386
|
+
in directories_to_ignore # path match for nested directories
|
387
|
+
)
|
388
|
+
if directories_to_ignore is not None
|
389
|
+
else False
|
390
|
+
)
|
391
|
+
|
392
|
+
if not should_exclude_dir:
|
393
|
+
included_dirs.append(d)
|
394
|
+
|
395
|
+
dirs[:] = included_dirs
|
370
396
|
for file in files:
|
371
397
|
file_extension = os.path.splitext(file)[1].lower()
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
398
|
+
file_path = os.path.join(root, file)
|
399
|
+
file_name = os.path.basename(file_path)
|
400
|
+
rel_path = os.path.relpath(file_path, directory)
|
401
|
+
|
402
|
+
# Normalize the path
|
403
|
+
normalized_rel_path = rel_path.replace(os.sep, "/")
|
404
|
+
|
405
|
+
# Check inclusion: by extension, by filename (for base directory), or by relative path
|
406
|
+
should_include = (
|
407
|
+
file_extension in file_extensions_included
|
408
|
+
or (
|
409
|
+
file in files_included and normalized_rel_path == file
|
410
|
+
) # filename match for base directory only
|
411
|
+
or normalized_rel_path
|
412
|
+
in files_included # path match for subdirectories
|
413
|
+
)
|
414
|
+
|
415
|
+
# Check exclusion: by filename (for base directory only) or by relative path
|
416
|
+
should_exclude = (
|
417
|
+
(
|
418
|
+
file in files_excluded and normalized_rel_path == file
|
419
|
+
) # filename match for base directory only
|
420
|
+
or normalized_rel_path
|
421
|
+
in files_excluded # path match for subdirectories
|
422
|
+
)
|
423
|
+
|
424
|
+
if should_include and not should_exclude:
|
376
425
|
extra_files.append(
|
377
426
|
FileInfo(
|
378
427
|
file_name=file_name,
|
@@ -35,6 +35,11 @@ console = ConsoleLogger()
|
|
35
35
|
required=False,
|
36
36
|
help="Base URL for the UiPath tenant instance (required for client credentials)",
|
37
37
|
)
|
38
|
+
@click.option(
|
39
|
+
"--tenant",
|
40
|
+
required=False,
|
41
|
+
help="Tenant name within UiPath Automation Cloud",
|
42
|
+
)
|
38
43
|
@click.option(
|
39
44
|
"--scope",
|
40
45
|
required=False,
|
@@ -48,6 +53,7 @@ def auth(
|
|
48
53
|
client_id: Optional[str] = None,
|
49
54
|
client_secret: Optional[str] = None,
|
50
55
|
base_url: Optional[str] = None,
|
56
|
+
tenant: Optional[str] = None,
|
51
57
|
scope: Optional[str] = None,
|
52
58
|
):
|
53
59
|
"""Authenticate with UiPath Cloud Platform.
|
@@ -69,6 +75,7 @@ def auth(
|
|
69
75
|
client_id=client_id,
|
70
76
|
client_secret=client_secret,
|
71
77
|
base_url=base_url,
|
78
|
+
tenant=tenant,
|
72
79
|
scope=scope,
|
73
80
|
)
|
74
81
|
with console.spinner("Authenticating with UiPath ..."):
|
@@ -101,7 +101,7 @@ def eval(
|
|
101
101
|
event_bus = EventBus()
|
102
102
|
|
103
103
|
if not no_report:
|
104
|
-
progress_reporter = StudioWebProgressReporter()
|
104
|
+
progress_reporter = StudioWebProgressReporter(LlmOpsHttpExporter())
|
105
105
|
asyncio.run(progress_reporter.subscribe_to_eval_runtime_events(event_bus))
|
106
106
|
|
107
107
|
def generate_runtime_context(**context_kwargs) -> UiPathRuntimeContext:
|
@@ -146,3 +146,47 @@ class TestAuth:
|
|
146
146
|
assert result.exit_code == 1
|
147
147
|
assert "Malformed UIPATH_URL" in result.output
|
148
148
|
assert "custom.uipath.com" in result.output
|
149
|
+
|
150
|
+
def test_auth_with_tenant_flag(self):
|
151
|
+
"""
|
152
|
+
Test that providing --tenant bypasses interactive tenant selection
|
153
|
+
and uses the specified tenant name.
|
154
|
+
"""
|
155
|
+
runner = CliRunner()
|
156
|
+
with (
|
157
|
+
patch("uipath._cli._auth._auth_service.webbrowser.open") as mock_open,
|
158
|
+
patch("uipath._cli._auth._auth_service.HTTPServer") as mock_server,
|
159
|
+
patch(
|
160
|
+
"uipath._cli._auth._auth_service.PortalService"
|
161
|
+
) as mock_portal_service,
|
162
|
+
patch(
|
163
|
+
"uipath._cli._auth._auth_service.select_tenant"
|
164
|
+
) as mock_select_tenant,
|
165
|
+
patch(
|
166
|
+
"uipath._cli._auth._url_utils.get_base_url",
|
167
|
+
return_value="https://alpha.uipath.com",
|
168
|
+
),
|
169
|
+
):
|
170
|
+
mock_server.return_value.start = AsyncMock(
|
171
|
+
return_value={"access_token": "test_token"}
|
172
|
+
)
|
173
|
+
|
174
|
+
mock_portal_service.return_value.__enter__.return_value.get_tenants_and_organizations.return_value = {
|
175
|
+
"tenants": [
|
176
|
+
{"name": "MyTenantName", "id": "tenant-id"},
|
177
|
+
{"name": "OtherTenant", "id": "other-id"},
|
178
|
+
],
|
179
|
+
"organization": {"name": "MyOrg", "id": "org-id"},
|
180
|
+
}
|
181
|
+
|
182
|
+
result = runner.invoke(
|
183
|
+
cli, ["auth", "--alpha", "--tenant", "MyTenantName", "--force"]
|
184
|
+
)
|
185
|
+
|
186
|
+
assert result.exit_code == 0, result.output
|
187
|
+
mock_open.assert_called_once()
|
188
|
+
|
189
|
+
assert not mock_select_tenant.called
|
190
|
+
|
191
|
+
portal = mock_portal_service.return_value.__enter__.return_value
|
192
|
+
assert portal.get_tenants_and_organizations.called
|
@@ -614,3 +614,256 @@ class TestPack:
|
|
614
614
|
assert "content/uv.lock" not in actual_files, (
|
615
615
|
"uv.lock should not be in nupkg when --nolock is used"
|
616
616
|
)
|
617
|
+
|
618
|
+
def test_files_excluded(
|
619
|
+
self,
|
620
|
+
runner: CliRunner,
|
621
|
+
temp_dir: str,
|
622
|
+
project_details: ProjectDetails,
|
623
|
+
uipath_json: UiPathJson,
|
624
|
+
) -> None:
|
625
|
+
"""Test that files mentioned in filesExcluded are excluded from the package."""
|
626
|
+
json_file_to_exclude = "config.json"
|
627
|
+
json_file_to_include = "other.json"
|
628
|
+
|
629
|
+
# Set up exclusions
|
630
|
+
uipath_json.settings.files_excluded = [json_file_to_exclude]
|
631
|
+
|
632
|
+
with runner.isolated_filesystem(temp_dir=temp_dir):
|
633
|
+
with open("uipath.json", "w") as f:
|
634
|
+
f.write(uipath_json.to_json())
|
635
|
+
with open("pyproject.toml", "w") as f:
|
636
|
+
f.write(project_details.to_toml())
|
637
|
+
|
638
|
+
# Create files - .json files are included by default
|
639
|
+
with open(json_file_to_exclude, "w") as f:
|
640
|
+
f.write('{"should": "be excluded"}')
|
641
|
+
with open(json_file_to_include, "w") as f:
|
642
|
+
f.write('{"should": "be included"}')
|
643
|
+
|
644
|
+
result = runner.invoke(cli, ["pack", "./"])
|
645
|
+
assert result.exit_code == 0
|
646
|
+
|
647
|
+
with zipfile.ZipFile(
|
648
|
+
f".uipath/{project_details.name}.{project_details.version}.nupkg", "r"
|
649
|
+
) as z:
|
650
|
+
# Excluded file should not be present
|
651
|
+
assert f"content/{json_file_to_exclude}" not in z.namelist()
|
652
|
+
# Other JSON file should still be present
|
653
|
+
assert f"content/{json_file_to_include}" in z.namelist()
|
654
|
+
|
655
|
+
def test_files_excluded_takes_precedence_over_included(
|
656
|
+
self,
|
657
|
+
runner: CliRunner,
|
658
|
+
temp_dir: str,
|
659
|
+
project_details: ProjectDetails,
|
660
|
+
uipath_json: UiPathJson,
|
661
|
+
) -> None:
|
662
|
+
"""Test that filesExcluded takes precedence over filesIncluded."""
|
663
|
+
conflicting_file = "conflicting.txt"
|
664
|
+
|
665
|
+
# Set up both inclusion and exclusion for the same file
|
666
|
+
uipath_json.settings.files_included = [conflicting_file]
|
667
|
+
uipath_json.settings.files_excluded = [conflicting_file]
|
668
|
+
|
669
|
+
with runner.isolated_filesystem(temp_dir=temp_dir):
|
670
|
+
with open("uipath.json", "w") as f:
|
671
|
+
f.write(uipath_json.to_json())
|
672
|
+
with open("pyproject.toml", "w") as f:
|
673
|
+
f.write(project_details.to_toml())
|
674
|
+
|
675
|
+
# Create the conflicting file
|
676
|
+
with open(conflicting_file, "w") as f:
|
677
|
+
f.write("This file should be excluded despite being in filesIncluded")
|
678
|
+
|
679
|
+
result = runner.invoke(cli, ["pack", "./"])
|
680
|
+
assert result.exit_code == 0
|
681
|
+
|
682
|
+
with zipfile.ZipFile(
|
683
|
+
f".uipath/{project_details.name}.{project_details.version}.nupkg", "r"
|
684
|
+
) as z:
|
685
|
+
# File should be excluded (exclusion takes precedence)
|
686
|
+
assert f"content/{conflicting_file}" not in z.namelist()
|
687
|
+
|
688
|
+
def test_filename_vs_path_exclusion(
|
689
|
+
self,
|
690
|
+
runner: CliRunner,
|
691
|
+
temp_dir: str,
|
692
|
+
project_details: ProjectDetails,
|
693
|
+
uipath_json: UiPathJson,
|
694
|
+
) -> None:
|
695
|
+
"""Test that filename exclusion only affects root directory, path exclusion affects specific paths."""
|
696
|
+
# Exclude root config.json and specific path subdir2/settings.json
|
697
|
+
uipath_json.settings.files_excluded = ["config.json", "subdir2/settings.json"]
|
698
|
+
|
699
|
+
with runner.isolated_filesystem(temp_dir=temp_dir):
|
700
|
+
with open("uipath.json", "w") as f:
|
701
|
+
f.write(uipath_json.to_json())
|
702
|
+
with open("pyproject.toml", "w") as f:
|
703
|
+
f.write(project_details.to_toml())
|
704
|
+
|
705
|
+
# Create directories
|
706
|
+
os.mkdir("subdir1")
|
707
|
+
os.mkdir("subdir2")
|
708
|
+
|
709
|
+
# Create files with same names in different locations
|
710
|
+
with open("config.json", "w") as f: # Root - should be excluded
|
711
|
+
f.write('{"root": "config"}')
|
712
|
+
with open("subdir1/config.json", "w") as f: # Subdir - should be included
|
713
|
+
f.write('{"subdir1": "config"}')
|
714
|
+
with open("subdir2/config.json", "w") as f: # Subdir - should be included
|
715
|
+
f.write('{"subdir2": "config"}')
|
716
|
+
|
717
|
+
with open("settings.json", "w") as f: # Root - should be included
|
718
|
+
f.write('{"root": "settings"}')
|
719
|
+
with open("subdir1/settings.json", "w") as f: # Subdir - should be included
|
720
|
+
f.write('{"subdir1": "settings"}')
|
721
|
+
with open(
|
722
|
+
"subdir2/settings.json", "w"
|
723
|
+
) as f: # Specific path - should be excluded
|
724
|
+
f.write('{"subdir2": "settings"}')
|
725
|
+
|
726
|
+
result = runner.invoke(cli, ["pack", "./"])
|
727
|
+
assert result.exit_code == 0
|
728
|
+
|
729
|
+
with zipfile.ZipFile(
|
730
|
+
f".uipath/{project_details.name}.{project_details.version}.nupkg", "r"
|
731
|
+
) as z:
|
732
|
+
# Filename exclusion: only affects root directory
|
733
|
+
assert "content/config.json" not in z.namelist() # Root excluded
|
734
|
+
assert "content/subdir1/config.json" in z.namelist() # Subdir included
|
735
|
+
assert "content/subdir2/config.json" in z.namelist() # Subdir included
|
736
|
+
|
737
|
+
# Path exclusion: only affects specific path
|
738
|
+
assert "content/settings.json" in z.namelist() # Root included
|
739
|
+
assert (
|
740
|
+
"content/subdir1/settings.json" in z.namelist()
|
741
|
+
) # Different path included
|
742
|
+
assert (
|
743
|
+
"content/subdir2/settings.json" not in z.namelist()
|
744
|
+
) # Specific path excluded
|
745
|
+
|
746
|
+
def test_filename_vs_path_inclusion(
|
747
|
+
self,
|
748
|
+
runner: CliRunner,
|
749
|
+
temp_dir: str,
|
750
|
+
project_details: ProjectDetails,
|
751
|
+
uipath_json: UiPathJson,
|
752
|
+
) -> None:
|
753
|
+
"""Test that filename inclusion only affects root directory, path inclusion affects specific paths."""
|
754
|
+
# Include root data.txt and specific path subdir2/config.txt
|
755
|
+
uipath_json.settings.files_included = ["data.txt", "subdir1/config.txt"]
|
756
|
+
|
757
|
+
with runner.isolated_filesystem(temp_dir=temp_dir):
|
758
|
+
with open("uipath.json", "w") as f:
|
759
|
+
f.write(uipath_json.to_json())
|
760
|
+
with open("pyproject.toml", "w") as f:
|
761
|
+
f.write(project_details.to_toml())
|
762
|
+
|
763
|
+
# Create directories
|
764
|
+
os.mkdir("subdir1")
|
765
|
+
os.mkdir("subdir2")
|
766
|
+
|
767
|
+
# Create .txt files (not included by default extension)
|
768
|
+
with open("data.txt", "w") as f: # Root - should be included by filename
|
769
|
+
f.write("root data")
|
770
|
+
with open("subdir1/data.txt", "w") as f: # Subdir - should NOT be included
|
771
|
+
f.write("subdir1 data")
|
772
|
+
with open(
|
773
|
+
"subdir2/data.txt", "w"
|
774
|
+
) as f: # Different subdir - should NOT be included
|
775
|
+
f.write("subdir2 data")
|
776
|
+
|
777
|
+
with open("config.txt", "w") as f: # Root - should NOT be included
|
778
|
+
f.write("root config")
|
779
|
+
with open(
|
780
|
+
"subdir1/config.txt", "w"
|
781
|
+
) as f: # Specific path - should be included
|
782
|
+
f.write("subdir1 config")
|
783
|
+
with open(
|
784
|
+
"subdir2/config.txt", "w"
|
785
|
+
) as f: # Different path - should NOT be included
|
786
|
+
f.write("subdir2 config")
|
787
|
+
|
788
|
+
result = runner.invoke(cli, ["pack", "./"])
|
789
|
+
assert result.exit_code == 0
|
790
|
+
|
791
|
+
with zipfile.ZipFile(
|
792
|
+
f".uipath/{project_details.name}.{project_details.version}.nupkg", "r"
|
793
|
+
) as z:
|
794
|
+
# Filename inclusion: only affects root directory
|
795
|
+
assert "content/data.txt" in z.namelist() # Root included
|
796
|
+
assert (
|
797
|
+
"content/subdir1/data.txt" not in z.namelist()
|
798
|
+
) # Subdir not included
|
799
|
+
assert (
|
800
|
+
"content/subdir2/data.txt" not in z.namelist()
|
801
|
+
) # Subdir not included
|
802
|
+
|
803
|
+
# Path inclusion: only affects specific path
|
804
|
+
assert "content/config.txt" not in z.namelist() # Root not included
|
805
|
+
assert (
|
806
|
+
"content/subdir1/config.txt" in z.namelist()
|
807
|
+
) # Specific path included
|
808
|
+
assert (
|
809
|
+
"content/subdir2/config.txt" not in z.namelist()
|
810
|
+
) # Different path not included
|
811
|
+
|
812
|
+
def test_directory_name_vs_path_exclusion(
|
813
|
+
self,
|
814
|
+
runner: CliRunner,
|
815
|
+
temp_dir: str,
|
816
|
+
project_details: ProjectDetails,
|
817
|
+
uipath_json: UiPathJson,
|
818
|
+
) -> None:
|
819
|
+
"""Test that directory exclusion by name only affects root level, by path affects specific paths."""
|
820
|
+
# Exclude root-level "temp" directory and specific path "tests/old"
|
821
|
+
uipath_json.settings.directories_excluded = ["temp", "tests/old"]
|
822
|
+
|
823
|
+
with runner.isolated_filesystem(temp_dir=temp_dir):
|
824
|
+
with open("uipath.json", "w") as f:
|
825
|
+
f.write(uipath_json.to_json())
|
826
|
+
with open("pyproject.toml", "w") as f:
|
827
|
+
f.write(project_details.to_toml())
|
828
|
+
|
829
|
+
# Create directory structure
|
830
|
+
os.makedirs("temp") # Root level - should be excluded
|
831
|
+
os.makedirs("src/temp") # Nested - should be included
|
832
|
+
os.makedirs("tests/old") # Specific path - should be excluded
|
833
|
+
os.makedirs("tests/new") # Different path - should be included
|
834
|
+
os.makedirs("old") # Root level - should be included
|
835
|
+
|
836
|
+
# Create JSON files in each directory (included by default)
|
837
|
+
with open("temp/config.json", "w") as f:
|
838
|
+
f.write('{"location": "root temp"}')
|
839
|
+
with open("src/temp/config.json", "w") as f:
|
840
|
+
f.write('{"location": "src temp"}')
|
841
|
+
with open("tests/old/config.json", "w") as f:
|
842
|
+
f.write('{"location": "tests old"}')
|
843
|
+
with open("tests/new/config.json", "w") as f:
|
844
|
+
f.write('{"location": "tests new"}')
|
845
|
+
with open("old/config.json", "w") as f:
|
846
|
+
f.write('{"location": "root old"}')
|
847
|
+
|
848
|
+
result = runner.invoke(cli, ["pack", "./"])
|
849
|
+
assert result.exit_code == 0
|
850
|
+
|
851
|
+
with zipfile.ZipFile(
|
852
|
+
f".uipath/{project_details.name}.{project_details.version}.nupkg", "r"
|
853
|
+
) as z:
|
854
|
+
# Directory name exclusion: only affects root level
|
855
|
+
assert (
|
856
|
+
"content/temp/config.json" not in z.namelist()
|
857
|
+
) # Root temp excluded
|
858
|
+
assert (
|
859
|
+
"content/src/temp/config.json" in z.namelist()
|
860
|
+
) # Nested temp included
|
861
|
+
|
862
|
+
# Directory path exclusion: only affects specific path
|
863
|
+
assert (
|
864
|
+
"content/tests/old/config.json" not in z.namelist()
|
865
|
+
) # Specific path excluded
|
866
|
+
assert (
|
867
|
+
"content/tests/new/config.json" in z.namelist()
|
868
|
+
) # Different path included
|
869
|
+
assert "content/old/config.json" in z.namelist() # Root old included
|