uipath 2.1.23__tar.gz → 2.1.25__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.23 → uipath-2.1.25}/PKG-INFO +1 -1
- {uipath-2.1.23 → uipath-2.1.25}/pyproject.toml +1 -1
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/__init__.py +1 -1
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/_auth/_client_credentials.py +1 -1
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/_auth/_oidc_utils.py +2 -1
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/_auth/_portal_service.py +14 -6
- uipath-2.1.25/src/uipath/_cli/_auth/_url_utils.py +41 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/_auth/index.html +9 -1
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/cli_auth.py +35 -11
- uipath-2.1.25/tests/cli/test_auth.py +141 -0
- uipath-2.1.25/tests/cli/test_portal_service_ensure_valid_token.py +336 -0
- uipath-2.1.25/tests/cli/test_portal_service_refresh_token.py +457 -0
- {uipath-2.1.23 → uipath-2.1.25}/uv.lock +1 -1
- {uipath-2.1.23 → uipath-2.1.25}/.cursorrules +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/.editorconfig +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/.gitattributes +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/.github/workflows/cd.yml +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/.github/workflows/ci.yml +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/.github/workflows/commitlint.yml +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/.github/workflows/lint.yml +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/.github/workflows/publish-dev.yml +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/.github/workflows/publish-docs.yml +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/.github/workflows/slack.yml +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/.github/workflows/test.yml +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/.gitignore +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/.pre-commit-config.yaml +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/.python-version +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/.vscode/extensions.json +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/.vscode/launch.json +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/.vscode/settings.json +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/CONTRIBUTING.md +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/LICENSE +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/README.md +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/docs/CONTRIBUTING.md +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/docs/FAQ.md +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/docs/assets/env-preparation-failed-dark.png +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/docs/assets/env-preparation-failed-light.png +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/docs/assets/favicon.png +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/docs/assets/logo-dark.svg +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/docs/assets/logo-light.svg +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/docs/cli/index.md +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/docs/core/actions.md +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/docs/core/assets/cloud_env_var_dark.gif +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/docs/core/assets/cloud_env_var_light.gif +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/docs/core/assets/cloud_env_var_secret_dark.png +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/docs/core/assets/cloud_env_var_secret_light.png +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/docs/core/assets/copy_path_dark.png +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/docs/core/assets/copy_path_light.png +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/docs/core/assets.md +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/docs/core/attachments.md +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/docs/core/buckets.md +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/docs/core/connections.md +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/docs/core/context_grounding.md +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/docs/core/environment_variables.md +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/docs/core/getting_started.md +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/docs/core/jobs.md +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/docs/core/llm_gateway.md +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/docs/core/processes.md +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/docs/core/queues.md +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/docs/core/traced.md +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/docs/hooks.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/docs/index.md +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/docs/javascripts/extra.js +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/docs/overrides/main.html +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/docs/overrides/partials/actions.html +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/docs/overrides/partials/logo.html +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/docs/release_policy.md +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/docs/sample_images/google-ADK-agent/agent-output.png +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/docs/stylesheets/extra.css +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/justfile +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/mkdocs.yml +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/py.typed +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/samples/event-trigger/.python-version +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/samples/event-trigger/README.md +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/samples/event-trigger/main.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/samples/event-trigger/pyproject.toml +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/samples/google-ADK-agent/.env.example +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/samples/google-ADK-agent/README.md +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/samples/google-ADK-agent/input.json +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/samples/google-ADK-agent/multi_tool_agent/__init__.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/samples/google-ADK-agent/multi_tool_agent/agent.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/samples/google-ADK-agent/pyproject.toml +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/samples/google-ADK-agent/uv.lock +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/scripts/debug_test.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/scripts/lint_httpx_client.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/__init__.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/README.md +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/_auth/_auth_server.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/_auth/_models.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/_auth/_utils.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/_auth/auth_config.json +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/_auth/localhost.crt +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/_auth/localhost.key +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/_evals/_evaluators/__init__.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/_evals/_evaluators/_deterministic_evaluator_base.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/_evals/_evaluators/_evaluator_base.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/_evals/_evaluators/_evaluator_factory.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/_evals/_evaluators/_exact_match_evaluator.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/_evals/_evaluators/_json_similarity_evaluator.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/_evals/_evaluators/_llm_as_judge_evaluator.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/_evals/_evaluators/_trajectory_evaluator.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/_evals/_models/__init__.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/_evals/_models/_evaluation_set.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/_evals/_models/_evaluators.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/_evals/evaluation_service.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/_evals/progress_reporter.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/_push/sw_file_handler.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/_runtime/_contracts.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/_runtime/_escalation.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/_runtime/_hitl.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/_runtime/_logging.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/_runtime/_runtime.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/_templates/.psmdcp.template +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/_templates/.rels.template +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/_templates/[Content_Types].xml.template +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/_templates/main.py.template +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/_templates/package.nuspec.template +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/_utils/_common.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/_utils/_console.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/_utils/_constants.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/_utils/_debug.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/_utils/_folders.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/_utils/_input_args.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/_utils/_parse_ast.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/_utils/_processes.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/_utils/_project_files.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/_utils/_studio_project.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/_utils/_tracing.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/_utils/_uv_helpers.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/cli_deploy.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/cli_eval.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/cli_init.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/cli_invoke.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/cli_new.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/cli_pack.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/cli_publish.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/cli_pull.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/cli_push.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/cli_run.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/middlewares.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_cli/spinner.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_config.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_execution_context.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_folder_context.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_services/__init__.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_services/_base_service.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_services/actions_service.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_services/api_client.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_services/assets_service.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_services/attachments_service.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_services/buckets_service.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_services/connections_service.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_services/context_grounding_service.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_services/folder_service.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_services/jobs_service.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_services/llm_gateway_service.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_services/processes_service.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_services/queues_service.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_uipath.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_utils/__init__.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_utils/_endpoint.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_utils/_infer_bindings.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_utils/_logs.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_utils/_read_overwrites.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_utils/_request_override.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_utils/_request_spec.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_utils/_ssl_context.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_utils/_url.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_utils/_user_agent.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/_utils/constants.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/models/__init__.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/models/action_schema.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/models/actions.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/models/assets.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/models/attachment.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/models/buckets.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/models/connections.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/models/context_grounding.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/models/context_grounding_index.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/models/errors.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/models/exceptions.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/models/interrupt_models.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/models/job.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/models/llm_gateway.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/models/processes.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/models/queues.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/py.typed +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/telemetry/__init__.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/telemetry/_constants.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/telemetry/_track.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/tracing/__init__.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/tracing/_otel_exporters.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/tracing/_traced.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/tracing/_utils.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/utils/__init__.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/src/uipath/utils/_endpoints_manager.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/tests/__init__.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/tests/cli/conftest.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/tests/cli/evaluators/test_json_similarity_evaluator.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/tests/cli/mocks/bindings_script.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/tests/cli/mocks/pyproject.toml +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/tests/cli/mocks/simple_script.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/tests/cli/mocks/uipath-mock.json +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/tests/cli/mocks/uipath-simple-script-mock.json +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/tests/cli/test_hitl.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/tests/cli/test_init.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/tests/cli/test_input_args.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/tests/cli/test_invoke.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/tests/cli/test_new.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/tests/cli/test_pack.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/tests/cli/test_publish.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/tests/cli/test_pull.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/tests/cli/test_push.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/tests/cli/test_run.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/tests/cli/test_utils.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/tests/cli/utils/common.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/tests/cli/utils/project_details.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/tests/cli/utils/uipath_json.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/tests/conftest.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/tests/sdk/services/conftest.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/tests/sdk/services/test_actions_service.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/tests/sdk/services/test_api_client.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/tests/sdk/services/test_assets_service.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/tests/sdk/services/test_attachments_service.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/tests/sdk/services/test_base_service.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/tests/sdk/services/test_buckets_service.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/tests/sdk/services/test_connections_service.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/tests/sdk/services/test_context_grounding_service.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/tests/sdk/services/test_folder_service.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/tests/sdk/services/test_jobs_service.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/tests/sdk/services/test_llm_integration.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/tests/sdk/services/test_llm_schema_cleanup.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/tests/sdk/services/test_llm_service.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/tests/sdk/services/test_processes_service.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/tests/sdk/services/test_queues_service.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/tests/sdk/services/test_uipath_llm_integration.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/tests/sdk/test_bindings_inference.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/tests/sdk/test_config.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/tests/sdk/test_overwrites.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/tests/tracing/test_otel_exporters.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/tests/tracing/test_span_utils.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/tests/tracing/test_traced.py +0 -0
- {uipath-2.1.23 → uipath-2.1.25}/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.25
|
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.25"
|
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"
|
@@ -3,7 +3,7 @@ import sys
|
|
3
3
|
|
4
4
|
import click
|
5
5
|
|
6
|
-
from .cli_auth import auth as auth
|
6
|
+
from .cli_auth import auth as auth
|
7
7
|
from .cli_deploy import deploy as deploy # type: ignore
|
8
8
|
from .cli_eval import eval as eval # type: ignore
|
9
9
|
from .cli_init import init as init # type: ignore
|
@@ -70,7 +70,7 @@ class ClientCredentialsService:
|
|
70
70
|
return "cloud"
|
71
71
|
|
72
72
|
def authenticate(
|
73
|
-
self, client_id: str, client_secret: str, scope: str = "OR.Execution"
|
73
|
+
self, client_id: str, client_secret: str, scope: Optional[str] = "OR.Execution"
|
74
74
|
) -> Optional[TokenData]:
|
75
75
|
"""Authenticate using client credentials flow.
|
76
76
|
|
@@ -5,6 +5,7 @@ import os
|
|
5
5
|
from urllib.parse import urlencode
|
6
6
|
|
7
7
|
from ._models import AuthConfig
|
8
|
+
from ._url_utils import build_service_url
|
8
9
|
|
9
10
|
|
10
11
|
def generate_code_verifier_and_challenge():
|
@@ -65,5 +66,5 @@ def get_auth_url(domain: str) -> tuple[str, str, str]:
|
|
65
66
|
}
|
66
67
|
|
67
68
|
query_string = urlencode(query_params)
|
68
|
-
url = f"
|
69
|
+
url = build_service_url(domain, f"/identity_/connect/authorize?{query_string}")
|
69
70
|
return url, code_verifier, state
|
@@ -9,6 +9,7 @@ from ..._utils._ssl_context import get_httpx_client_kwargs
|
|
9
9
|
from .._utils._console import ConsoleLogger
|
10
10
|
from ._models import TenantsAndOrganizationInfoResponse, TokenData
|
11
11
|
from ._oidc_utils import get_auth_config
|
12
|
+
from ._url_utils import build_service_url, get_base_url
|
12
13
|
from ._utils import (
|
13
14
|
get_auth_data,
|
14
15
|
get_parsed_token_data,
|
@@ -24,7 +25,7 @@ class PortalService:
|
|
24
25
|
|
25
26
|
access_token: Optional[str] = None
|
26
27
|
prt_id: Optional[str] = None
|
27
|
-
domain:
|
28
|
+
domain: str
|
28
29
|
selected_tenant: Optional[str] = None
|
29
30
|
|
30
31
|
_client: Optional[httpx.Client] = None
|
@@ -65,7 +66,10 @@ class PortalService:
|
|
65
66
|
if self._client is None:
|
66
67
|
raise RuntimeError("HTTP client is not initialized")
|
67
68
|
|
68
|
-
url =
|
69
|
+
url = build_service_url(
|
70
|
+
self.domain,
|
71
|
+
f"/{self.prt_id}/portal_/api/filtering/leftnav/tenantsAndOrganizationInfo",
|
72
|
+
)
|
69
73
|
response = self._client.get(
|
70
74
|
url, headers={"Authorization": f"Bearer {self.access_token}"}
|
71
75
|
)
|
@@ -90,13 +94,14 @@ class PortalService:
|
|
90
94
|
console.error("Organization not found.")
|
91
95
|
return ""
|
92
96
|
account_name = organization.get("name")
|
93
|
-
|
97
|
+
base_url = get_base_url(self.domain)
|
98
|
+
return f"{base_url}/{account_name}/{self.selected_tenant}/orchestrator_"
|
94
99
|
|
95
100
|
def post_refresh_token_request(self, refresh_token: str) -> TokenData:
|
96
101
|
if self._client is None:
|
97
102
|
raise RuntimeError("HTTP client is not initialized")
|
98
103
|
|
99
|
-
url =
|
104
|
+
url = build_service_url(self.domain, "/identity_/connect/token")
|
100
105
|
client_id = get_auth_config().get("client_id")
|
101
106
|
|
102
107
|
data = {
|
@@ -213,12 +218,15 @@ def select_tenant(
|
|
213
218
|
account_name = tenants_and_organizations["organization"]["name"]
|
214
219
|
console.info(f"Selected tenant: {click.style(tenant_name, fg='cyan')}")
|
215
220
|
|
221
|
+
base_url = get_base_url(domain)
|
222
|
+
uipath_url = f"{base_url}/{account_name}/{tenant_name}"
|
223
|
+
|
216
224
|
update_env_file(
|
217
225
|
{
|
218
|
-
"UIPATH_URL":
|
226
|
+
"UIPATH_URL": uipath_url,
|
219
227
|
"UIPATH_TENANT_ID": tenants_and_organizations["tenants"][tenant_idx]["id"],
|
220
228
|
"UIPATH_ORGANIZATION_ID": tenants_and_organizations["organization"]["id"],
|
221
229
|
}
|
222
230
|
)
|
223
231
|
|
224
|
-
return
|
232
|
+
return uipath_url
|
@@ -0,0 +1,41 @@
|
|
1
|
+
import os
|
2
|
+
from urllib.parse import urlparse
|
3
|
+
|
4
|
+
|
5
|
+
def get_base_url(domain: str) -> str:
|
6
|
+
"""Get the base URL for UiPath services.
|
7
|
+
|
8
|
+
Args:
|
9
|
+
domain: Either a domain name (e.g., 'cloud', 'alpha') or a full URL from UIPATH_URL
|
10
|
+
|
11
|
+
Returns:
|
12
|
+
The base URL to use for UiPath services
|
13
|
+
"""
|
14
|
+
# If UIPATH_URL is set and domain is 'cloud' (default), use the base from UIPATH_URL
|
15
|
+
uipath_url = os.getenv("UIPATH_URL")
|
16
|
+
if uipath_url and domain == "cloud":
|
17
|
+
parsed_url = urlparse(uipath_url)
|
18
|
+
return f"{parsed_url.scheme}://{parsed_url.netloc}"
|
19
|
+
|
20
|
+
# If domain is already a full URL, use it directly
|
21
|
+
if domain.startswith("http"):
|
22
|
+
return domain
|
23
|
+
|
24
|
+
# Otherwise, construct the URL using the domain
|
25
|
+
return f"https://{domain if domain else 'cloud'}.uipath.com"
|
26
|
+
|
27
|
+
|
28
|
+
def build_service_url(domain: str, path: str) -> str:
|
29
|
+
"""Build a service URL by combining the base URL with a path.
|
30
|
+
|
31
|
+
Args:
|
32
|
+
domain: Either a domain name or full URL
|
33
|
+
path: The path to append (should start with /)
|
34
|
+
|
35
|
+
Returns:
|
36
|
+
The complete service URL
|
37
|
+
"""
|
38
|
+
base_url = get_base_url(domain)
|
39
|
+
# Remove trailing slash from base_url to avoid double slashes
|
40
|
+
base_url = base_url.rstrip("/")
|
41
|
+
return f"{base_url}{path}"
|
@@ -477,7 +477,15 @@
|
|
477
477
|
formData.append('client_id', '__PY_REPLACE_CLIENT_ID__');
|
478
478
|
formData.append('code_verifier', codeVerifier);
|
479
479
|
|
480
|
-
const
|
480
|
+
const domainOrUrl = '__PY_REPLACE_DOMAIN__';
|
481
|
+
let tokenUrl;
|
482
|
+
if (domainOrUrl.startsWith('http')) {
|
483
|
+
tokenUrl = `${domainOrUrl}/identity_/connect/token`;
|
484
|
+
} else {
|
485
|
+
tokenUrl = `https://${domainOrUrl}.uipath.com/identity_/connect/token`;
|
486
|
+
}
|
487
|
+
|
488
|
+
const response = await fetch(tokenUrl, {
|
481
489
|
method: 'POST',
|
482
490
|
headers: {
|
483
491
|
'Content-Type': 'application/x-www-form-urlencoded'
|
@@ -1,9 +1,10 @@
|
|
1
|
-
# type: ignore
|
2
1
|
import asyncio
|
3
2
|
import json
|
4
3
|
import os
|
5
4
|
import socket
|
6
5
|
import webbrowser
|
6
|
+
from typing import Optional
|
7
|
+
from urllib.parse import urlparse
|
7
8
|
|
8
9
|
import click
|
9
10
|
from dotenv import load_dotenv
|
@@ -33,10 +34,10 @@ def is_port_in_use(port: int) -> bool:
|
|
33
34
|
|
34
35
|
def set_port():
|
35
36
|
auth_config = get_auth_config()
|
36
|
-
port = auth_config.get("port", 8104)
|
37
|
-
port_option_one = auth_config.get("portOptionOne", 8104)
|
38
|
-
port_option_two = auth_config.get("portOptionTwo", 8055)
|
39
|
-
port_option_three = auth_config.get("portOptionThree", 42042)
|
37
|
+
port = int(auth_config.get("port", 8104))
|
38
|
+
port_option_one = int(auth_config.get("portOptionOne", 8104)) # type: ignore
|
39
|
+
port_option_two = int(auth_config.get("portOptionTwo", 8055)) # type: ignore
|
40
|
+
port_option_three = int(auth_config.get("portOptionThree", 42042)) # type: ignore
|
40
41
|
if is_port_in_use(port):
|
41
42
|
if is_port_in_use(port_option_one):
|
42
43
|
if is_port_in_use(port_option_two):
|
@@ -81,24 +82,45 @@ def set_port():
|
|
81
82
|
required=False,
|
82
83
|
help="Base URL for the UiPath tenant instance (required for client credentials)",
|
83
84
|
)
|
85
|
+
@click.option(
|
86
|
+
"--scope",
|
87
|
+
required=False,
|
88
|
+
default="OR.Execution",
|
89
|
+
help="Space-separated list of OAuth scopes to request (e.g., 'OR.Execution OR.Queues'). Defaults to 'OR.Execution'",
|
90
|
+
)
|
84
91
|
@track
|
85
92
|
def auth(
|
86
93
|
domain,
|
87
|
-
force:
|
88
|
-
client_id: str = None,
|
89
|
-
client_secret: str = None,
|
90
|
-
base_url: str = None,
|
94
|
+
force: Optional[bool] = False,
|
95
|
+
client_id: Optional[str] = None,
|
96
|
+
client_secret: Optional[str] = None,
|
97
|
+
base_url: Optional[str] = None,
|
98
|
+
scope: Optional[str] = None,
|
91
99
|
):
|
92
100
|
"""Authenticate with UiPath Cloud Platform.
|
93
101
|
|
102
|
+
The domain for authentication is determined by the UIPATH_URL environment variable if set.
|
103
|
+
Otherwise, it can be specified with --cloud (default), --staging, or --alpha flags.
|
104
|
+
|
94
105
|
Interactive mode (default): Opens browser for OAuth authentication.
|
95
|
-
Unattended mode: Use --client-id, --client-secret
|
106
|
+
Unattended mode: Use --client-id, --client-secret, --base-url and --scope for client credentials flow.
|
96
107
|
|
97
108
|
Network options:
|
98
109
|
- Set HTTP_PROXY/HTTPS_PROXY/NO_PROXY environment variables for proxy configuration
|
99
110
|
- Set REQUESTS_CA_BUNDLE to specify a custom CA bundle for SSL verification
|
100
111
|
- Set UIPATH_DISABLE_SSL_VERIFY to disable SSL verification (not recommended)
|
101
112
|
"""
|
113
|
+
uipath_url = os.getenv("UIPATH_URL")
|
114
|
+
if uipath_url and domain == "cloud": # "cloud" is the default
|
115
|
+
parsed_url = urlparse(uipath_url)
|
116
|
+
if parsed_url.scheme and parsed_url.netloc:
|
117
|
+
domain = f"{parsed_url.scheme}://{parsed_url.netloc}"
|
118
|
+
else:
|
119
|
+
console.error(
|
120
|
+
f"Malformed UIPATH_URL: '{uipath_url}'. Please ensure it includes both scheme and netloc (e.g., 'https://cloud.uipath.com')."
|
121
|
+
)
|
122
|
+
return
|
123
|
+
|
102
124
|
# Check if client credentials are provided for unattended authentication
|
103
125
|
if client_id and client_secret:
|
104
126
|
if not base_url:
|
@@ -117,7 +139,9 @@ def auth(
|
|
117
139
|
)
|
118
140
|
credentials_service.domain = extracted_domain
|
119
141
|
|
120
|
-
token_data = credentials_service.authenticate(
|
142
|
+
token_data = credentials_service.authenticate(
|
143
|
+
client_id, client_secret, scope
|
144
|
+
)
|
121
145
|
|
122
146
|
if token_data:
|
123
147
|
credentials_service.setup_environment(token_data, base_url)
|
@@ -0,0 +1,141 @@
|
|
1
|
+
import os
|
2
|
+
from unittest.mock import AsyncMock, patch
|
3
|
+
|
4
|
+
import pytest
|
5
|
+
from click.testing import CliRunner
|
6
|
+
|
7
|
+
from uipath._cli.cli_auth import auth
|
8
|
+
|
9
|
+
"""
|
10
|
+
Unit tests for the 'uipath auth' command.
|
11
|
+
|
12
|
+
This test suite covers the following scenarios for the authentication logic:
|
13
|
+
|
14
|
+
1. **UIPATH_URL Environment Variable**:
|
15
|
+
Ensures the `auth` command correctly uses the domain from the `UIPATH_URL`
|
16
|
+
environment variable when no specific environment flag is used.
|
17
|
+
|
18
|
+
2. **--alpha Flag**:
|
19
|
+
Verifies that the `--alpha` flag correctly uses the 'alpha' environment and
|
20
|
+
overrides the `UIPATH_URL` environment variable if it is set.
|
21
|
+
|
22
|
+
3. **--staging Flag**:
|
23
|
+
Verifies that the `--staging` flag correctly uses the 'staging' environment and
|
24
|
+
overrides the `UIPATH_URL` environment variable if it is set.
|
25
|
+
|
26
|
+
4. **--cloud Flag**:
|
27
|
+
Checks that the `--cloud` flag works as expected, using the 'cloud' environment,
|
28
|
+
when no `UIPATH_URL` environment variable is set.
|
29
|
+
|
30
|
+
5. **Default Behavior**:
|
31
|
+
Confirms that the command defaults to the 'cloud' environment when no flags
|
32
|
+
or environment variables are provided.
|
33
|
+
"""
|
34
|
+
|
35
|
+
|
36
|
+
@pytest.mark.parametrize(
|
37
|
+
"scenario_name, cli_args, env_vars, expected_url_part, expected_select_tenant_return",
|
38
|
+
[
|
39
|
+
(
|
40
|
+
"auth_with_uipath_url_env_variable",
|
41
|
+
["--force"],
|
42
|
+
{"UIPATH_URL": "https://custom.automationsuite.org/org/tenant"},
|
43
|
+
"https://custom.automationsuite.org/identity_/connect/authorize",
|
44
|
+
"https://custom.automationsuite.org/DefaultOrg/DefaultTenant",
|
45
|
+
),
|
46
|
+
(
|
47
|
+
"auth_with_uipath_url_env_variable_with_trailing_slash",
|
48
|
+
["--force"],
|
49
|
+
{"UIPATH_URL": "https://custom.uipath.com/org/tenant/"},
|
50
|
+
"https://custom.uipath.com/identity_/connect/authorize",
|
51
|
+
"https://custom.uipath.com/DefaultOrg/DefaultTenant",
|
52
|
+
),
|
53
|
+
(
|
54
|
+
"auth_with_alpha_flag",
|
55
|
+
["--alpha", "--force"],
|
56
|
+
{"UIPATH_URL": "https://custom.uipath.com/org/tenant"},
|
57
|
+
"https://alpha.uipath.com/identity_/connect/authorize",
|
58
|
+
"https://alpha.uipath.com/DefaultOrg/DefaultTenant",
|
59
|
+
),
|
60
|
+
(
|
61
|
+
"auth_with_staging_flag",
|
62
|
+
["--staging", "--force"],
|
63
|
+
{"UIPATH_URL": "https://custom.uipath.com/org/tenant"},
|
64
|
+
"https://staging.uipath.com/identity_/connect/authorize",
|
65
|
+
"https://staging.uipath.com/DefaultOrg/DefaultTenant",
|
66
|
+
),
|
67
|
+
(
|
68
|
+
"auth_with_cloud_flag",
|
69
|
+
["--cloud", "--force"],
|
70
|
+
{},
|
71
|
+
"https://cloud.uipath.com/identity_/connect/authorize",
|
72
|
+
"https://cloud.uipath.com/DefaultOrg/DefaultTenant",
|
73
|
+
),
|
74
|
+
(
|
75
|
+
"auth_default_to_cloud",
|
76
|
+
["--force"],
|
77
|
+
{},
|
78
|
+
"https://cloud.uipath.com/identity_/connect/authorize",
|
79
|
+
"https://cloud.uipath.com/DefaultOrg/DefaultTenant",
|
80
|
+
),
|
81
|
+
],
|
82
|
+
ids=[
|
83
|
+
"uipath_url_env",
|
84
|
+
"alpha_flag_overrides_env",
|
85
|
+
"staging_flag_overrides_env",
|
86
|
+
"cloud_flag",
|
87
|
+
"default_to_cloud",
|
88
|
+
"uipath_url_env_with_trailing_slash",
|
89
|
+
],
|
90
|
+
)
|
91
|
+
def test_auth_scenarios(
|
92
|
+
scenario_name, cli_args, env_vars, expected_url_part, expected_select_tenant_return
|
93
|
+
):
|
94
|
+
"""
|
95
|
+
Test 'uipath auth' with different configurations.
|
96
|
+
"""
|
97
|
+
runner = CliRunner()
|
98
|
+
with (
|
99
|
+
patch("uipath._cli.cli_auth.webbrowser.open") as mock_open,
|
100
|
+
patch("uipath._cli.cli_auth.HTTPServer") as mock_server,
|
101
|
+
patch("uipath._cli.cli_auth.PortalService") as mock_portal_service,
|
102
|
+
):
|
103
|
+
mock_server.return_value.start = AsyncMock(
|
104
|
+
return_value={"access_token": "test_token"}
|
105
|
+
)
|
106
|
+
mock_portal_service.return_value.__enter__.return_value.get_tenants_and_organizations.return_value = {
|
107
|
+
"tenants": [{"name": "DefaultTenant", "id": "tenant-id"}],
|
108
|
+
"organization": {"name": "DefaultOrg", "id": "org-id"},
|
109
|
+
}
|
110
|
+
mock_portal_service.return_value.__enter__.return_value.select_tenant.return_value = expected_select_tenant_return
|
111
|
+
|
112
|
+
with runner.isolated_filesystem():
|
113
|
+
for key, value in env_vars.items():
|
114
|
+
os.environ[key] = value
|
115
|
+
|
116
|
+
result = runner.invoke(auth, cli_args)
|
117
|
+
|
118
|
+
for key in env_vars:
|
119
|
+
del os.environ[key]
|
120
|
+
|
121
|
+
assert result.exit_code == 0, (
|
122
|
+
f"Scenario '{scenario_name}' failed with exit code {result.exit_code}: {result.output}"
|
123
|
+
)
|
124
|
+
mock_open.assert_called_once()
|
125
|
+
call_args = mock_open.call_args[0][0]
|
126
|
+
assert expected_url_part in call_args
|
127
|
+
|
128
|
+
|
129
|
+
def test_auth_with_malformed_url():
|
130
|
+
"""
|
131
|
+
Test that 'uipath auth' handles a malformed UIPATH_URL gracefully.
|
132
|
+
"""
|
133
|
+
runner = CliRunner()
|
134
|
+
with runner.isolated_filesystem():
|
135
|
+
os.environ["UIPATH_URL"] = "custom.uipath.com"
|
136
|
+
result = runner.invoke(auth, ["--force"])
|
137
|
+
del os.environ["UIPATH_URL"]
|
138
|
+
|
139
|
+
assert result.exit_code == 1
|
140
|
+
assert "Malformed UIPATH_URL" in result.output
|
141
|
+
assert "custom.uipath.com" in result.output
|