uipath 2.0.73__tar.gz → 2.0.74__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.
Potentially problematic release.
This version of uipath might be problematic. Click here for more details.
- {uipath-2.0.73 → uipath-2.0.74}/PKG-INFO +2 -1
- uipath-2.0.74/docs/FAQ.md +289 -0
- {uipath-2.0.73 → uipath-2.0.74}/pyproject.toml +6 -4
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_cli/_auth/_client_credentials.py +2 -3
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_cli/_auth/_portal_service.py +31 -4
- uipath-2.0.74/src/uipath/_cli/_utils/_folders.py +35 -0
- uipath-2.0.74/src/uipath/_cli/_utils/_processes.py +54 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_cli/cli_auth.py +51 -46
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_cli/cli_invoke.py +19 -18
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_cli/cli_publish.py +44 -38
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_services/_base_service.py +10 -10
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_services/attachments_service.py +6 -5
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_services/buckets_service.py +4 -8
- uipath-2.0.74/src/uipath/_utils/_ssl_context.py +54 -0
- uipath-2.0.74/uv.lock +3765 -0
- uipath-2.0.73/docs/FAQ.md +0 -77
- uipath-2.0.73/src/uipath/_cli/_utils/_folders.py +0 -28
- uipath-2.0.73/src/uipath/_cli/_utils/_processes.py +0 -49
- uipath-2.0.73/uv.lock +0 -3517
- {uipath-2.0.73 → uipath-2.0.74}/.cursorrules +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/.editorconfig +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/.gitattributes +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/.github/workflows/cd.yml +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/.github/workflows/ci.yml +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/.github/workflows/commitlint.yml +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/.github/workflows/lint.yml +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/.github/workflows/publish-dev.yml +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/.github/workflows/publish-docs.yml +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/.github/workflows/slack.yml +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/.github/workflows/test.yml +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/.gitignore +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/.pre-commit-config.yaml +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/.python-version +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/.vscode/extensions.json +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/.vscode/launch.json +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/.vscode/settings.json +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/CONTRIBUTING.md +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/LICENSE +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/README.md +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/docs/CONTRIBUTING.md +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/docs/assets/env-preparation-failed-dark.png +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/docs/assets/env-preparation-failed-light.png +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/docs/assets/favicon.png +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/docs/assets/logo-dark.svg +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/docs/assets/logo-light.svg +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/docs/cli/index.md +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/docs/core/actions.md +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/docs/core/assets/cloud_env_var_dark.gif +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/docs/core/assets/cloud_env_var_light.gif +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/docs/core/assets/cloud_env_var_secret_dark.png +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/docs/core/assets/cloud_env_var_secret_light.png +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/docs/core/assets/copy_path_dark.png +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/docs/core/assets/copy_path_light.png +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/docs/core/assets.md +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/docs/core/attachments.md +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/docs/core/buckets.md +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/docs/core/connections.md +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/docs/core/context_grounding.md +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/docs/core/environment_variables.md +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/docs/core/getting_started.md +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/docs/core/jobs.md +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/docs/core/processes.md +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/docs/core/queues.md +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/docs/core/traced.md +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/docs/hooks.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/docs/index.md +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/docs/javascripts/extra.js +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/docs/overrides/main.html +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/docs/overrides/partials/actions.html +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/docs/overrides/partials/logo.html +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/docs/release_policy.md +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/docs/stylesheets/extra.css +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/justfile +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/mkdocs.yml +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/py.typed +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/__init__.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_cli/README.md +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_cli/__init__.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_cli/_auth/_auth_server.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_cli/_auth/_models.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_cli/_auth/_oidc_utils.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_cli/_auth/_utils.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_cli/_auth/auth_config.json +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_cli/_auth/index.html +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_cli/_auth/localhost.crt +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_cli/_auth/localhost.key +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_cli/_runtime/_contracts.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_cli/_runtime/_escalation.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_cli/_runtime/_hitl.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_cli/_runtime/_logging.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_cli/_runtime/_runtime.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_cli/_templates/.psmdcp.template +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_cli/_templates/.rels.template +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_cli/_templates/[Content_Types].xml.template +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_cli/_templates/main.py.template +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_cli/_templates/package.nuspec.template +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_cli/_utils/_common.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_cli/_utils/_console.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_cli/_utils/_constants.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_cli/_utils/_debug.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_cli/_utils/_input_args.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_cli/_utils/_parse_ast.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_cli/_utils/_tracing.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_cli/cli_deploy.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_cli/cli_init.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_cli/cli_new.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_cli/cli_pack.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_cli/cli_run.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_cli/middlewares.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_cli/spinner.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_config.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_execution_context.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_folder_context.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_services/__init__.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_services/actions_service.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_services/api_client.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_services/assets_service.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_services/connections_service.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_services/context_grounding_service.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_services/folder_service.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_services/jobs_service.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_services/llm_gateway_service.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_services/processes_service.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_services/queues_service.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_uipath.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_utils/__init__.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_utils/_endpoint.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_utils/_infer_bindings.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_utils/_logs.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_utils/_read_overwrites.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_utils/_request_override.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_utils/_request_spec.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_utils/_url.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_utils/_user_agent.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/_utils/constants.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/models/__init__.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/models/action_schema.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/models/actions.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/models/assets.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/models/attachment.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/models/buckets.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/models/connections.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/models/context_grounding.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/models/context_grounding_index.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/models/errors.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/models/exceptions.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/models/interrupt_models.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/models/job.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/models/llm_gateway.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/models/processes.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/models/queues.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/py.typed +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/telemetry/__init__.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/telemetry/_constants.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/telemetry/_track.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/tracing/__init__.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/tracing/_otel_exporters.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/tracing/_traced.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/src/uipath/tracing/_utils.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/tests/__init__.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/tests/cli/conftest.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/tests/cli/mocks/bindings_script.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/tests/cli/mocks/pyproject.toml +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/tests/cli/mocks/simple_script.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/tests/cli/mocks/uipath-mock.json +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/tests/cli/mocks/uipath-simple-script-mock.json +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/tests/cli/test_hitl.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/tests/cli/test_init.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/tests/cli/test_invoke.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/tests/cli/test_new.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/tests/cli/test_pack.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/tests/cli/test_publish.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/tests/cli/test_run.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/tests/cli/test_utils.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/tests/cli/utils/project_details.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/tests/cli/utils/uipath_json.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/tests/conftest.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/tests/sdk/services/conftest.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/tests/sdk/services/test_actions_service.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/tests/sdk/services/test_api_client.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/tests/sdk/services/test_assets_service.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/tests/sdk/services/test_attachments_service.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/tests/sdk/services/test_base_service.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/tests/sdk/services/test_buckets_service.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/tests/sdk/services/test_connections_service.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/tests/sdk/services/test_context_grounding_service.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/tests/sdk/services/test_folder_service.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/tests/sdk/services/test_jobs_service.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/tests/sdk/services/test_llm_integration.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/tests/sdk/services/test_llm_service.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/tests/sdk/services/test_processes_service.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/tests/sdk/services/test_queues_service.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/tests/sdk/services/test_uipath_llm_integration.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/tests/sdk/test_bindings_inference.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/tests/sdk/test_config.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/tests/sdk/test_overwrites.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/tests/tracing/test_otel_exporters.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/tests/tracing/test_span_utils.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/tests/tracing/test_traced.py +0 -0
- {uipath-2.0.73 → uipath-2.0.74}/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.0.
|
|
3
|
+
Version: 2.0.74
|
|
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
|
|
@@ -24,6 +24,7 @@ Requires-Dist: python-dotenv>=1.0.1
|
|
|
24
24
|
Requires-Dist: rich>=13.0.0
|
|
25
25
|
Requires-Dist: tenacity>=9.0.0
|
|
26
26
|
Requires-Dist: tomli>=2.2.1
|
|
27
|
+
Requires-Dist: truststore>=0.10.1
|
|
27
28
|
Provides-Extra: langchain
|
|
28
29
|
Requires-Dist: uipath-langchain<0.1.0,>=0.0.88; extra == 'langchain'
|
|
29
30
|
Description-Content-Type: text/markdown
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
# Frequently Asked Questions (FAQ)
|
|
2
|
+
|
|
3
|
+
### Q: Why am I getting a "Failed to prepare environment" error when deploying my python agent to UiPath Cloud Platform?
|
|
4
|
+
|
|
5
|
+
#### Error Message
|
|
6
|
+
|
|
7
|
+
```json
|
|
8
|
+
{
|
|
9
|
+
"Code": "Serverless.PythonCodedAgent.PrepareEnvironmentError",
|
|
10
|
+
"Title": "Failed to prepare environment",
|
|
11
|
+
"Detail": "An error occurred while installing the package dependencies. Please try again. If the error persists, please contact support.",
|
|
12
|
+
"Category": "System",
|
|
13
|
+
"Status": null
|
|
14
|
+
}
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
#### Visual Example
|
|
18
|
+
|
|
19
|
+
<picture data-light="../assets/env-preparation-failed-light.png" data-dark="../assets/env-preparation-failed-dark.png">
|
|
20
|
+
<source
|
|
21
|
+
media="(prefers-color-scheme: dark)"
|
|
22
|
+
srcset="../assets/env-preparation-failed-dark.png"
|
|
23
|
+
/>
|
|
24
|
+
<img
|
|
25
|
+
src="../assets/env-preparation-failed-light.png"
|
|
26
|
+
/>
|
|
27
|
+
</picture>
|
|
28
|
+
|
|
29
|
+
*Example of the error as it appears in UiPath Cloud Platform*
|
|
30
|
+
|
|
31
|
+
#### Description
|
|
32
|
+
|
|
33
|
+
This error might occur when deploying coded-agents to UiPath Cloud Platform, even though the same project might work correctly in your local environment. The issue is often related to how Python packages are discovered and distributed during the cloud deployment process.
|
|
34
|
+
|
|
35
|
+
#### Common Causes
|
|
36
|
+
|
|
37
|
+
1. Multiple top-level packages or modules in your project structure
|
|
38
|
+
2. Improper configuration or formatting in the pyproject.toml or requirements.txt files
|
|
39
|
+
|
|
40
|
+
#### Solution
|
|
41
|
+
|
|
42
|
+
##### 1. Check Your Project Structure
|
|
43
|
+
|
|
44
|
+
- Ensure your Python files are organized under a non top-level directory (e.g., using the `src` layout)
|
|
45
|
+
- Follow the recommended project structure:
|
|
46
|
+
|
|
47
|
+
```plaintext
|
|
48
|
+
project_root/
|
|
49
|
+
├── src/
|
|
50
|
+
│ └── your_package/
|
|
51
|
+
│ ├── __init__.py
|
|
52
|
+
│ └── your_modules.py
|
|
53
|
+
├── pyproject.toml
|
|
54
|
+
└── setup.cfg/setup.py
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
##### 2. Configure Package Discovery
|
|
58
|
+
|
|
59
|
+
If you need to maintain your current project structure, you can configure custom package discovery in your `pyproject.toml`:
|
|
60
|
+
|
|
61
|
+
```toml
|
|
62
|
+
[tool.setuptools]
|
|
63
|
+
py-modules = []
|
|
64
|
+
packages = ["your_package"]
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
##### 3. Verify Dependencies
|
|
68
|
+
|
|
69
|
+
- Ensure all required dependencies are properly listed in your `requirements.txt` or `pyproject.toml`
|
|
70
|
+
|
|
71
|
+
#### Reference
|
|
72
|
+
|
|
73
|
+
For more detailed information about package discovery and configuration, refer to the [official setuptools documentation](https://setuptools.pypa.io/en/latest/userguide/package_discovery.html).
|
|
74
|
+
|
|
75
|
+
### Q: Why am I getting timeouts or "[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed" errors?
|
|
76
|
+
|
|
77
|
+
The UiPath CLI automatically works with your corporate network setup, including proxy servers and security tools like ZScaler, by leveraging your system's native SSL certificate store.
|
|
78
|
+
|
|
79
|
+
#### Proxy Configuration
|
|
80
|
+
|
|
81
|
+
Configure these environment variables to route CLI traffic through your corporate proxy:
|
|
82
|
+
|
|
83
|
+
//// tab | Linux/macOS Bash
|
|
84
|
+
|
|
85
|
+
<!-- termynal -->
|
|
86
|
+
```bash
|
|
87
|
+
> export HTTP_PROXY=http://proxy.company.com:8080
|
|
88
|
+
> export HTTPS_PROXY=https://proxy.company.com:8080
|
|
89
|
+
> export NO_PROXY=localhost,127.0.0.1
|
|
90
|
+
> uipath auth
|
|
91
|
+
⠋ Authenticating with UiPath ...
|
|
92
|
+
✓ Authentication successful.
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
////
|
|
96
|
+
|
|
97
|
+
//// tab | Windows PowerShell
|
|
98
|
+
|
|
99
|
+
<!-- termynal -->
|
|
100
|
+
```powershell
|
|
101
|
+
> $env:HTTP_PROXY="http://proxy.company.com:8080"
|
|
102
|
+
> $env:HTTPS_PROXY="https://proxy.company.com:8080"
|
|
103
|
+
> $env:NO_PROXY="localhost,127.0.0.1"
|
|
104
|
+
> uipath auth
|
|
105
|
+
⠋ Authenticating with UiPath ...
|
|
106
|
+
✓ Authentication successful.
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
////
|
|
110
|
+
|
|
111
|
+
//// tab | Windows CMD
|
|
112
|
+
|
|
113
|
+
<!-- termynal -->
|
|
114
|
+
```cmd
|
|
115
|
+
> set HTTP_PROXY=http://proxy.company.com:8080
|
|
116
|
+
> set HTTPS_PROXY=https://proxy.company.com:8080
|
|
117
|
+
> set NO_PROXY=localhost,127.0.0.1
|
|
118
|
+
> uipath auth
|
|
119
|
+
⠋ Authenticating with UiPath ...
|
|
120
|
+
✓ Authentication successful.
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
////
|
|
124
|
+
|
|
125
|
+
#### Proxy Authentication
|
|
126
|
+
|
|
127
|
+
//// tab | Linux/macOS Bash
|
|
128
|
+
|
|
129
|
+
<!-- termynal -->
|
|
130
|
+
```bash
|
|
131
|
+
> export HTTP_PROXY=http://username:password@proxy.company.com:8080
|
|
132
|
+
> export HTTPS_PROXY=https://username:password@proxy.company.com:8080
|
|
133
|
+
> export NO_PROXY=localhost,127.0.0.1
|
|
134
|
+
> uipath publish
|
|
135
|
+
⠋ Fetching available package feeds...
|
|
136
|
+
✓ Package published successfully!
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
////
|
|
140
|
+
|
|
141
|
+
//// tab | Windows PowerShell
|
|
142
|
+
|
|
143
|
+
<!-- termynal -->
|
|
144
|
+
```powershell
|
|
145
|
+
> $env:HTTP_PROXY="http://username:password@proxy.company.com:8080"
|
|
146
|
+
> $env:HTTPS_PROXY="https://username:password@proxy.company.com:8080"
|
|
147
|
+
> $env:NO_PROXY="localhost,127.0.0.1"
|
|
148
|
+
> uipath publish
|
|
149
|
+
⠋ Fetching available package feeds...
|
|
150
|
+
✓ Package published successfully!
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
////
|
|
154
|
+
|
|
155
|
+
//// tab | Windows CMD
|
|
156
|
+
|
|
157
|
+
<!-- termynal -->
|
|
158
|
+
```cmd
|
|
159
|
+
> set HTTP_PROXY=http://username:password@proxy.company.com:8080
|
|
160
|
+
> set HTTPS_PROXY=https://username:password@proxy.company.com:8080
|
|
161
|
+
> set NO_PROXY=localhost,127.0.0.1
|
|
162
|
+
> uipath publish
|
|
163
|
+
⠋ Fetching available package feeds...
|
|
164
|
+
✓ Package published successfully!
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
////
|
|
168
|
+
|
|
169
|
+
/// tip
|
|
170
|
+
**For IT Administrators**: Add these environment variables to your Group Policy or system configuration:
|
|
171
|
+
|
|
172
|
+
```bash
|
|
173
|
+
HTTP_PROXY=http://your-proxy.company.com:8080
|
|
174
|
+
HTTPS_PROXY=https://your-proxy.company.com:8080
|
|
175
|
+
NO_PROXY=localhost,127.0.0.1,*.company.com
|
|
176
|
+
```
|
|
177
|
+
///
|
|
178
|
+
|
|
179
|
+
/// warning
|
|
180
|
+
The CLI uses a local HTTP server for the authentication callback. You must **exclude localhost** from your proxy using `NO_PROXY=localhost,127.0.0.1` or authentication will fail.
|
|
181
|
+
///
|
|
182
|
+
|
|
183
|
+
##### Troubleshooting
|
|
184
|
+
<!-- termynal -->
|
|
185
|
+
```bash
|
|
186
|
+
> # Test proxy connectivity
|
|
187
|
+
> curl -v --proxy $HTTP_PROXY https://cloud.uipath.com
|
|
188
|
+
* Trying 192.168.1.100:8080...
|
|
189
|
+
* Connected to proxy.company.com (192.168.1.100) port 8080
|
|
190
|
+
✓ Connection successful
|
|
191
|
+
|
|
192
|
+
> # Test localhost exclusion
|
|
193
|
+
> curl --proxy $HTTP_PROXY http://localhost:8080
|
|
194
|
+
* Bypassing proxy for localhost
|
|
195
|
+
✓ Direct connection to localhost successful
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
#### SSL Certificates
|
|
199
|
+
|
|
200
|
+
The UiPath CLI automatically uses your system's certificate store (Windows Certificate Store, macOS Keychain, Linux ca-certificates). Corporate certificates installed via Group Policy or IT tools will be automatically recognized.
|
|
201
|
+
|
|
202
|
+
##### Troubleshooting SSL Issues
|
|
203
|
+
|
|
204
|
+
If you encounter SSL certificate errors:
|
|
205
|
+
|
|
206
|
+
1. **Disable SSL verification** (for testing only):
|
|
207
|
+
|
|
208
|
+
//// tab | Linux/macOS Bash
|
|
209
|
+
|
|
210
|
+
<!-- termynal -->
|
|
211
|
+
```bash
|
|
212
|
+
> export UIPATH_DISABLE_SSL_VERIFY=true
|
|
213
|
+
> uipath auth
|
|
214
|
+
⠋ Authenticating with UiPath ...
|
|
215
|
+
✓ Authentication successful.
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
////
|
|
219
|
+
|
|
220
|
+
//// tab | Windows PowerShell
|
|
221
|
+
|
|
222
|
+
<!-- termynal -->
|
|
223
|
+
```powershell
|
|
224
|
+
> $env:UIPATH_DISABLE_SSL_VERIFY="true"
|
|
225
|
+
> uipath auth
|
|
226
|
+
⠋ Authenticating with UiPath ...
|
|
227
|
+
✓ Authentication successful.
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
////
|
|
231
|
+
|
|
232
|
+
//// tab | Windows CMD
|
|
233
|
+
|
|
234
|
+
<!-- termynal -->
|
|
235
|
+
```cmd
|
|
236
|
+
> set UIPATH_DISABLE_SSL_VERIFY=true
|
|
237
|
+
> uipath auth
|
|
238
|
+
⠋ Authenticating with UiPath ...
|
|
239
|
+
✓ Authentication successful.
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
////
|
|
243
|
+
|
|
244
|
+
2. **Use custom certificate bundle** (if needed):
|
|
245
|
+
|
|
246
|
+
//// tab | Linux/macOS Bash
|
|
247
|
+
|
|
248
|
+
<!-- termynal -->
|
|
249
|
+
```bash
|
|
250
|
+
> export SSL_CERT_FILE=/path/to/company-ca-bundle.pem
|
|
251
|
+
> export REQUESTS_CA_BUNDLE=/path/to/company-ca-bundle.pem
|
|
252
|
+
> uipath publish
|
|
253
|
+
⠋ Publishing most recent package...
|
|
254
|
+
✓ Package published successfully!
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
////
|
|
258
|
+
|
|
259
|
+
//// tab | Windows PowerShell
|
|
260
|
+
|
|
261
|
+
<!-- termynal -->
|
|
262
|
+
```powershell
|
|
263
|
+
> $env:SSL_CERT_FILE="C:\certs\company-ca-bundle.pem"
|
|
264
|
+
> $env:REQUESTS_CA_BUNDLE="C:\certs\company-ca-bundle.pem"
|
|
265
|
+
> uipath publish
|
|
266
|
+
⠋ Publishing most recent package...
|
|
267
|
+
✓ Package published successfully!
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
////
|
|
271
|
+
|
|
272
|
+
//// tab | Windows CMD
|
|
273
|
+
|
|
274
|
+
<!-- termynal -->
|
|
275
|
+
```cmd
|
|
276
|
+
> set SSL_CERT_FILE=C:\certs\company-ca-bundle.pem
|
|
277
|
+
> set REQUESTS_CA_BUNDLE=C:\certs\company-ca-bundle.pem
|
|
278
|
+
> uipath publish
|
|
279
|
+
⠋ Publishing most recent package...
|
|
280
|
+
✓ Package published successfully!
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
////
|
|
284
|
+
|
|
285
|
+
|
|
286
|
+
---
|
|
287
|
+
|
|
288
|
+
*Note: This FAQ will be updated as new information becomes available. If you continue experiencing issues after following these solutions, please contact UiPath support.*
|
|
289
|
+
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "uipath"
|
|
3
|
-
version = "2.0.
|
|
3
|
+
version = "2.0.74"
|
|
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"
|
|
@@ -15,6 +15,7 @@ dependencies = [
|
|
|
15
15
|
"pathlib>=1.0.1",
|
|
16
16
|
"rich>=13.0.0",
|
|
17
17
|
"azure-monitor-opentelemetry>=1.6.8",
|
|
18
|
+
"truststore>=0.10.1"
|
|
18
19
|
]
|
|
19
20
|
classifiers = [
|
|
20
21
|
"Development Status :: 3 - Alpha",
|
|
@@ -48,6 +49,9 @@ dev = [
|
|
|
48
49
|
"ruff>=0.9.4",
|
|
49
50
|
"rust-just>=1.39.0",
|
|
50
51
|
"pytest>=7.4.0",
|
|
52
|
+
"pytest-asyncio>=1.0.0",
|
|
53
|
+
"pytest-httpx>=0.35.0",
|
|
54
|
+
"pytest-trio>=0.8.0",
|
|
51
55
|
"pytest-cov>=4.1.0",
|
|
52
56
|
"pytest-mock>=3.11.1",
|
|
53
57
|
"pre-commit>=4.1.0",
|
|
@@ -57,12 +61,9 @@ dev = [
|
|
|
57
61
|
"termynal>=0.13.0",
|
|
58
62
|
"mkdocs-simple-hooks>=0.1.5",
|
|
59
63
|
"mkdocs-click>=0.9.0",
|
|
60
|
-
"pytest-asyncio>=0.26.0",
|
|
61
64
|
"mkdocs-open-in-new-tab>=1.0.8",
|
|
62
65
|
"toml>=0.10.2",
|
|
63
66
|
"inflection>=0.5.1",
|
|
64
|
-
"pytest-httpx>=0.35.0",
|
|
65
|
-
"pytest-trio>=0.8.0",
|
|
66
67
|
"types-toml>=0.10.8",
|
|
67
68
|
]
|
|
68
69
|
|
|
@@ -122,6 +123,7 @@ testpaths = ["tests"]
|
|
|
122
123
|
python_files = "test_*.py"
|
|
123
124
|
addopts = "-ra -q --cov"
|
|
124
125
|
asyncio_default_fixture_loop_scope = "function"
|
|
126
|
+
asyncio_mode = "auto"
|
|
125
127
|
|
|
126
128
|
[tool.coverage.report]
|
|
127
129
|
show_missing = true
|
|
@@ -3,6 +3,7 @@ from urllib.parse import urlparse
|
|
|
3
3
|
|
|
4
4
|
import httpx
|
|
5
5
|
|
|
6
|
+
from ..._utils._ssl_context import get_httpx_client_kwargs
|
|
6
7
|
from .._utils._console import ConsoleLogger
|
|
7
8
|
from ._models import TokenData
|
|
8
9
|
from ._utils import parse_access_token, update_env_file
|
|
@@ -91,13 +92,11 @@ class ClientCredentialsService:
|
|
|
91
92
|
}
|
|
92
93
|
|
|
93
94
|
try:
|
|
94
|
-
with httpx.Client(
|
|
95
|
+
with httpx.Client(**get_httpx_client_kwargs()) as client:
|
|
95
96
|
response = client.post(token_url, data=data)
|
|
96
|
-
|
|
97
97
|
match response.status_code:
|
|
98
98
|
case 200:
|
|
99
99
|
token_data = response.json()
|
|
100
|
-
# Convert to our TokenData format
|
|
101
100
|
return {
|
|
102
101
|
"access_token": token_data["access_token"],
|
|
103
102
|
"token_type": token_data.get("token_type", "Bearer"),
|
|
@@ -5,6 +5,7 @@ from typing import Optional
|
|
|
5
5
|
import click
|
|
6
6
|
import httpx
|
|
7
7
|
|
|
8
|
+
from ..._utils._ssl_context import get_httpx_client_kwargs
|
|
8
9
|
from .._utils._console import ConsoleLogger
|
|
9
10
|
from ._models import TenantsAndOrganizationInfoResponse, TokenData
|
|
10
11
|
from ._oidc_utils import get_auth_config
|
|
@@ -16,7 +17,6 @@ from ._utils import (
|
|
|
16
17
|
)
|
|
17
18
|
|
|
18
19
|
console = ConsoleLogger()
|
|
19
|
-
client = httpx.Client(follow_redirects=True, timeout=30.0)
|
|
20
20
|
|
|
21
21
|
|
|
22
22
|
class PortalService:
|
|
@@ -27,6 +27,8 @@ class PortalService:
|
|
|
27
27
|
domain: Optional[str] = None
|
|
28
28
|
selected_tenant: Optional[str] = None
|
|
29
29
|
|
|
30
|
+
_client: Optional[httpx.Client] = None
|
|
31
|
+
|
|
30
32
|
_tenants_and_organizations: Optional[TenantsAndOrganizationInfoResponse] = None
|
|
31
33
|
|
|
32
34
|
def __init__(
|
|
@@ -39,13 +41,32 @@ class PortalService:
|
|
|
39
41
|
self.access_token = access_token
|
|
40
42
|
self.prt_id = prt_id
|
|
41
43
|
|
|
44
|
+
self._client = httpx.Client(**get_httpx_client_kwargs())
|
|
45
|
+
|
|
46
|
+
def close(self):
|
|
47
|
+
"""Explicitly close the HTTP client."""
|
|
48
|
+
if self._client:
|
|
49
|
+
self._client.close()
|
|
50
|
+
self._client = None
|
|
51
|
+
|
|
52
|
+
def __enter__(self):
|
|
53
|
+
"""Enter the runtime context related to this object."""
|
|
54
|
+
return self
|
|
55
|
+
|
|
56
|
+
def __exit__(self, exc_type, exc_value, traceback):
|
|
57
|
+
"""Exit the runtime context and close the HTTP client."""
|
|
58
|
+
self.close()
|
|
59
|
+
|
|
42
60
|
def update_token_data(self, token_data: TokenData):
|
|
43
61
|
self.access_token = token_data["access_token"]
|
|
44
62
|
self.prt_id = get_parsed_token_data(token_data).get("prt_id")
|
|
45
63
|
|
|
46
64
|
def get_tenants_and_organizations(self) -> TenantsAndOrganizationInfoResponse:
|
|
65
|
+
if self._client is None:
|
|
66
|
+
raise RuntimeError("HTTP client is not initialized")
|
|
67
|
+
|
|
47
68
|
url = f"https://{self.domain}.uipath.com/{self.prt_id}/portal_/api/filtering/leftnav/tenantsAndOrganizationInfo"
|
|
48
|
-
response =
|
|
69
|
+
response = self._client.get(
|
|
49
70
|
url, headers={"Authorization": f"Bearer {self.access_token}"}
|
|
50
71
|
)
|
|
51
72
|
if response.status_code < 400:
|
|
@@ -72,6 +93,9 @@ class PortalService:
|
|
|
72
93
|
return f"https://{self.domain}.uipath.com/{account_name}/{self.selected_tenant}/orchestrator_"
|
|
73
94
|
|
|
74
95
|
def post_refresh_token_request(self, refresh_token: str) -> TokenData:
|
|
96
|
+
if self._client is None:
|
|
97
|
+
raise RuntimeError("HTTP client is not initialized")
|
|
98
|
+
|
|
75
99
|
url = f"https://{self.domain}.uipath.com/identity_/connect/token"
|
|
76
100
|
client_id = get_auth_config().get("client_id")
|
|
77
101
|
|
|
@@ -83,7 +107,7 @@ class PortalService:
|
|
|
83
107
|
|
|
84
108
|
headers = {"Content-Type": "application/x-www-form-urlencoded"}
|
|
85
109
|
|
|
86
|
-
response =
|
|
110
|
+
response = self._client.post(url, data=data, headers=headers)
|
|
87
111
|
if response.status_code < 400:
|
|
88
112
|
return response.json()
|
|
89
113
|
elif response.status_code == 401:
|
|
@@ -137,6 +161,9 @@ class PortalService:
|
|
|
137
161
|
update_env_file(updated_env_contents)
|
|
138
162
|
|
|
139
163
|
def post_auth(self, base_url: str) -> None:
|
|
164
|
+
if self._client is None:
|
|
165
|
+
raise RuntimeError("HTTP client is not initialized")
|
|
166
|
+
|
|
140
167
|
or_base_url = (
|
|
141
168
|
f"{base_url}/orchestrator_"
|
|
142
169
|
if base_url
|
|
@@ -148,7 +175,7 @@ class PortalService:
|
|
|
148
175
|
|
|
149
176
|
try:
|
|
150
177
|
[try_enable_first_run_response, acquire_license_response] = [
|
|
151
|
-
|
|
178
|
+
self._client.post(
|
|
152
179
|
url,
|
|
153
180
|
headers={"Authorization": f"Bearer {self.access_token}"},
|
|
154
181
|
)
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
from typing import Optional, Tuple
|
|
2
|
+
|
|
3
|
+
import httpx
|
|
4
|
+
|
|
5
|
+
from ..._utils._ssl_context import get_httpx_client_kwargs
|
|
6
|
+
from ._console import ConsoleLogger
|
|
7
|
+
|
|
8
|
+
console = ConsoleLogger()
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def get_personal_workspace_info(
|
|
12
|
+
base_url: str, token: str
|
|
13
|
+
) -> Tuple[Optional[str], Optional[str]]:
|
|
14
|
+
user_url = f"{base_url}/orchestrator_/odata/Users/UiPath.Server.Configuration.OData.GetCurrentUserExtended?$expand=PersonalWorkspace"
|
|
15
|
+
|
|
16
|
+
with httpx.Client(**get_httpx_client_kwargs()) as client:
|
|
17
|
+
user_response = client.get(
|
|
18
|
+
user_url, headers={"Authorization": f"Bearer {token}"}
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
if user_response.status_code != 200:
|
|
22
|
+
console.error(
|
|
23
|
+
"Error: Failed to fetch user info. Please try reauthenticating."
|
|
24
|
+
)
|
|
25
|
+
return None, None
|
|
26
|
+
|
|
27
|
+
user_data = user_response.json()
|
|
28
|
+
feed_id = user_data.get("PersonalWorskpaceFeedId")
|
|
29
|
+
personal_workspace = user_data.get("PersonalWorkspace")
|
|
30
|
+
|
|
31
|
+
if not personal_workspace or not feed_id or "Id" not in personal_workspace:
|
|
32
|
+
return None, None
|
|
33
|
+
|
|
34
|
+
folder_id = personal_workspace.get("Id")
|
|
35
|
+
return feed_id, folder_id
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import urllib.parse
|
|
3
|
+
from typing import Any
|
|
4
|
+
|
|
5
|
+
import httpx
|
|
6
|
+
|
|
7
|
+
from ..._utils._ssl_context import get_httpx_client_kwargs
|
|
8
|
+
from ._console import ConsoleLogger
|
|
9
|
+
|
|
10
|
+
console = ConsoleLogger()
|
|
11
|
+
odata_top_filter = 25
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def get_release_info(
|
|
15
|
+
base_url: str,
|
|
16
|
+
token: str,
|
|
17
|
+
package_name: str,
|
|
18
|
+
package_version: str,
|
|
19
|
+
folder_id: str,
|
|
20
|
+
) -> None | tuple[Any, Any] | tuple[None, None]:
|
|
21
|
+
headers = {
|
|
22
|
+
"Authorization": f"Bearer {token}",
|
|
23
|
+
"x-uipath-organizationunitid": str(folder_id),
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
release_url = f"{base_url}/orchestrator_/odata/Releases/UiPath.Server.Configuration.OData.ListReleases?$select=Id,Key,ProcessVersion&$top={odata_top_filter}&$filter=ProcessKey%20eq%20%27{urllib.parse.quote(package_name)}%27"
|
|
27
|
+
|
|
28
|
+
with httpx.Client(**get_httpx_client_kwargs()) as client:
|
|
29
|
+
response = client.get(release_url, headers=headers)
|
|
30
|
+
|
|
31
|
+
if response.status_code == 200:
|
|
32
|
+
try:
|
|
33
|
+
data = json.loads(response.text)
|
|
34
|
+
process = next(
|
|
35
|
+
process
|
|
36
|
+
for process in data["value"]
|
|
37
|
+
if process["ProcessVersion"] == package_version
|
|
38
|
+
)
|
|
39
|
+
release_id = process["Id"]
|
|
40
|
+
release_key = process["Key"]
|
|
41
|
+
return release_id, release_key
|
|
42
|
+
except KeyError:
|
|
43
|
+
console.warning("Warning: Failed to deserialize release data")
|
|
44
|
+
return None, None
|
|
45
|
+
except StopIteration:
|
|
46
|
+
console.error(
|
|
47
|
+
f"Error: No process with name '{package_name}' found in your workspace. Please publish the process first."
|
|
48
|
+
)
|
|
49
|
+
return None, None
|
|
50
|
+
else:
|
|
51
|
+
console.warning(
|
|
52
|
+
f"Warning: Failed to fetch release info {response.status_code}"
|
|
53
|
+
)
|
|
54
|
+
return None, None
|
|
@@ -92,6 +92,11 @@ def auth(
|
|
|
92
92
|
|
|
93
93
|
Interactive mode (default): Opens browser for OAuth authentication.
|
|
94
94
|
Unattended mode: Use --client-id, --client-secret and --base-url for client credentials flow.
|
|
95
|
+
|
|
96
|
+
Network options:
|
|
97
|
+
- Set HTTP_PROXY/HTTPS_PROXY/NO_PROXY environment variables for proxy configuration
|
|
98
|
+
- Set REQUESTS_CA_BUNDLE to specify a custom CA bundle for SSL verification
|
|
99
|
+
- Set UIPATH_DISABLE_SSL_VERIFY to disable SSL verification (not recommended)
|
|
95
100
|
"""
|
|
96
101
|
# Check if client credentials are provided for unattended authentication
|
|
97
102
|
if client_id and client_secret:
|
|
@@ -102,7 +107,6 @@ def auth(
|
|
|
102
107
|
return
|
|
103
108
|
|
|
104
109
|
with console.spinner("Authenticating with client credentials ..."):
|
|
105
|
-
# Create service instance
|
|
106
110
|
credentials_service = ClientCredentialsService(domain)
|
|
107
111
|
|
|
108
112
|
# If base_url is provided, extract domain from it to override the CLI domain parameter
|
|
@@ -127,56 +131,57 @@ def auth(
|
|
|
127
131
|
|
|
128
132
|
# Interactive authentication flow (existing logic)
|
|
129
133
|
with console.spinner("Authenticating with UiPath ..."):
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
134
|
+
with PortalService(domain) as portal_service:
|
|
135
|
+
if not force:
|
|
136
|
+
if (
|
|
137
|
+
os.getenv("UIPATH_URL")
|
|
138
|
+
and os.getenv("UIPATH_TENANT_ID")
|
|
139
|
+
and os.getenv("UIPATH_ORGANIZATION_ID")
|
|
140
|
+
):
|
|
141
|
+
try:
|
|
142
|
+
portal_service.ensure_valid_token()
|
|
143
|
+
console.success(
|
|
144
|
+
"Authentication successful.",
|
|
145
|
+
)
|
|
146
|
+
return
|
|
147
|
+
except Exception:
|
|
148
|
+
console.info(
|
|
149
|
+
"Authentication token is invalid. Please reauthenticate.",
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
auth_url, code_verifier, state = get_auth_url(domain)
|
|
153
|
+
|
|
154
|
+
webbrowser.open(auth_url, 1)
|
|
155
|
+
auth_config = get_auth_config()
|
|
156
|
+
|
|
157
|
+
console.link(
|
|
158
|
+
"If a browser window did not open, please open the following URL in your browser:",
|
|
159
|
+
auth_url,
|
|
160
|
+
)
|
|
161
|
+
|
|
162
|
+
server = HTTPServer(port=auth_config["port"])
|
|
163
|
+
token_data = server.start(state, code_verifier, domain)
|
|
164
|
+
|
|
165
|
+
if token_data:
|
|
166
|
+
portal_service.update_token_data(token_data)
|
|
167
|
+
update_auth_file(token_data)
|
|
168
|
+
access_token = token_data["access_token"]
|
|
169
|
+
update_env_file({"UIPATH_ACCESS_TOKEN": access_token})
|
|
170
|
+
|
|
171
|
+
tenants_and_organizations = (
|
|
172
|
+
portal_service.get_tenants_and_organizations()
|
|
173
|
+
)
|
|
174
|
+
base_url = select_tenant(domain, tenants_and_organizations)
|
|
138
175
|
try:
|
|
139
|
-
portal_service.
|
|
176
|
+
portal_service.post_auth(base_url)
|
|
140
177
|
console.success(
|
|
141
178
|
"Authentication successful.",
|
|
142
179
|
)
|
|
143
|
-
return
|
|
144
180
|
except Exception:
|
|
145
|
-
console.
|
|
146
|
-
"
|
|
181
|
+
console.error(
|
|
182
|
+
"Could not prepare the environment. Please try again.",
|
|
147
183
|
)
|
|
148
|
-
|
|
149
|
-
auth_url, code_verifier, state = get_auth_url(domain)
|
|
150
|
-
|
|
151
|
-
webbrowser.open(auth_url, 1)
|
|
152
|
-
auth_config = get_auth_config()
|
|
153
|
-
|
|
154
|
-
console.link(
|
|
155
|
-
"If a browser window did not open, please open the following URL in your browser:",
|
|
156
|
-
auth_url,
|
|
157
|
-
)
|
|
158
|
-
|
|
159
|
-
server = HTTPServer(port=auth_config["port"])
|
|
160
|
-
token_data = server.start(state, code_verifier, domain)
|
|
161
|
-
|
|
162
|
-
if token_data:
|
|
163
|
-
portal_service.update_token_data(token_data)
|
|
164
|
-
update_auth_file(token_data)
|
|
165
|
-
access_token = token_data["access_token"]
|
|
166
|
-
update_env_file({"UIPATH_ACCESS_TOKEN": access_token})
|
|
167
|
-
|
|
168
|
-
tenants_and_organizations = portal_service.get_tenants_and_organizations()
|
|
169
|
-
base_url = select_tenant(domain, tenants_and_organizations)
|
|
170
|
-
try:
|
|
171
|
-
portal_service.post_auth(base_url)
|
|
172
|
-
console.success(
|
|
173
|
-
"Authentication successful.",
|
|
174
|
-
)
|
|
175
|
-
except Exception:
|
|
184
|
+
else:
|
|
176
185
|
console.error(
|
|
177
|
-
"
|
|
186
|
+
"Authentication failed. Please try again.",
|
|
178
187
|
)
|
|
179
|
-
else:
|
|
180
|
-
console.error(
|
|
181
|
-
"Authentication failed. Please try again.",
|
|
182
|
-
)
|