uipath 2.1.6__tar.gz → 2.1.8__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.
Files changed (219) hide show
  1. {uipath-2.1.6 → uipath-2.1.8}/PKG-INFO +1 -1
  2. {uipath-2.1.6 → uipath-2.1.8}/pyproject.toml +1 -1
  3. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_cli/__init__.py +2 -0
  4. uipath-2.1.8/src/uipath/_cli/_auth/auth_config.json +6 -0
  5. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_cli/_utils/_common.py +19 -2
  6. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_cli/_utils/_studio_project.py +61 -1
  7. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_cli/cli_pack.py +3 -1
  8. uipath-2.1.8/src/uipath/_cli/cli_pull.py +215 -0
  9. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_cli/cli_push.py +3 -1
  10. uipath-2.1.8/tests/cli/test_pull.py +399 -0
  11. {uipath-2.1.6 → uipath-2.1.8}/tests/cli/test_push.py +14 -5
  12. uipath-2.1.8/tests/cli/utils/common.py +7 -0
  13. {uipath-2.1.6 → uipath-2.1.8}/uv.lock +1 -1
  14. uipath-2.1.6/src/uipath/_cli/_auth/auth_config.json +0 -6
  15. {uipath-2.1.6 → uipath-2.1.8}/.cursorrules +0 -0
  16. {uipath-2.1.6 → uipath-2.1.8}/.editorconfig +0 -0
  17. {uipath-2.1.6 → uipath-2.1.8}/.gitattributes +0 -0
  18. {uipath-2.1.6 → uipath-2.1.8}/.github/workflows/cd.yml +0 -0
  19. {uipath-2.1.6 → uipath-2.1.8}/.github/workflows/ci.yml +0 -0
  20. {uipath-2.1.6 → uipath-2.1.8}/.github/workflows/commitlint.yml +0 -0
  21. {uipath-2.1.6 → uipath-2.1.8}/.github/workflows/lint.yml +0 -0
  22. {uipath-2.1.6 → uipath-2.1.8}/.github/workflows/publish-dev.yml +0 -0
  23. {uipath-2.1.6 → uipath-2.1.8}/.github/workflows/publish-docs.yml +0 -0
  24. {uipath-2.1.6 → uipath-2.1.8}/.github/workflows/slack.yml +0 -0
  25. {uipath-2.1.6 → uipath-2.1.8}/.github/workflows/test.yml +0 -0
  26. {uipath-2.1.6 → uipath-2.1.8}/.gitignore +0 -0
  27. {uipath-2.1.6 → uipath-2.1.8}/.pre-commit-config.yaml +0 -0
  28. {uipath-2.1.6 → uipath-2.1.8}/.python-version +0 -0
  29. {uipath-2.1.6 → uipath-2.1.8}/.vscode/extensions.json +0 -0
  30. {uipath-2.1.6 → uipath-2.1.8}/.vscode/launch.json +0 -0
  31. {uipath-2.1.6 → uipath-2.1.8}/.vscode/settings.json +0 -0
  32. {uipath-2.1.6 → uipath-2.1.8}/CONTRIBUTING.md +0 -0
  33. {uipath-2.1.6 → uipath-2.1.8}/LICENSE +0 -0
  34. {uipath-2.1.6 → uipath-2.1.8}/README.md +0 -0
  35. {uipath-2.1.6 → uipath-2.1.8}/docs/CONTRIBUTING.md +0 -0
  36. {uipath-2.1.6 → uipath-2.1.8}/docs/FAQ.md +0 -0
  37. {uipath-2.1.6 → uipath-2.1.8}/docs/assets/env-preparation-failed-dark.png +0 -0
  38. {uipath-2.1.6 → uipath-2.1.8}/docs/assets/env-preparation-failed-light.png +0 -0
  39. {uipath-2.1.6 → uipath-2.1.8}/docs/assets/favicon.png +0 -0
  40. {uipath-2.1.6 → uipath-2.1.8}/docs/assets/logo-dark.svg +0 -0
  41. {uipath-2.1.6 → uipath-2.1.8}/docs/assets/logo-light.svg +0 -0
  42. {uipath-2.1.6 → uipath-2.1.8}/docs/cli/index.md +0 -0
  43. {uipath-2.1.6 → uipath-2.1.8}/docs/core/actions.md +0 -0
  44. {uipath-2.1.6 → uipath-2.1.8}/docs/core/assets/cloud_env_var_dark.gif +0 -0
  45. {uipath-2.1.6 → uipath-2.1.8}/docs/core/assets/cloud_env_var_light.gif +0 -0
  46. {uipath-2.1.6 → uipath-2.1.8}/docs/core/assets/cloud_env_var_secret_dark.png +0 -0
  47. {uipath-2.1.6 → uipath-2.1.8}/docs/core/assets/cloud_env_var_secret_light.png +0 -0
  48. {uipath-2.1.6 → uipath-2.1.8}/docs/core/assets/copy_path_dark.png +0 -0
  49. {uipath-2.1.6 → uipath-2.1.8}/docs/core/assets/copy_path_light.png +0 -0
  50. {uipath-2.1.6 → uipath-2.1.8}/docs/core/assets.md +0 -0
  51. {uipath-2.1.6 → uipath-2.1.8}/docs/core/attachments.md +0 -0
  52. {uipath-2.1.6 → uipath-2.1.8}/docs/core/buckets.md +0 -0
  53. {uipath-2.1.6 → uipath-2.1.8}/docs/core/connections.md +0 -0
  54. {uipath-2.1.6 → uipath-2.1.8}/docs/core/context_grounding.md +0 -0
  55. {uipath-2.1.6 → uipath-2.1.8}/docs/core/environment_variables.md +0 -0
  56. {uipath-2.1.6 → uipath-2.1.8}/docs/core/getting_started.md +0 -0
  57. {uipath-2.1.6 → uipath-2.1.8}/docs/core/jobs.md +0 -0
  58. {uipath-2.1.6 → uipath-2.1.8}/docs/core/llm_gateway.md +0 -0
  59. {uipath-2.1.6 → uipath-2.1.8}/docs/core/processes.md +0 -0
  60. {uipath-2.1.6 → uipath-2.1.8}/docs/core/queues.md +0 -0
  61. {uipath-2.1.6 → uipath-2.1.8}/docs/core/traced.md +0 -0
  62. {uipath-2.1.6 → uipath-2.1.8}/docs/hooks.py +0 -0
  63. {uipath-2.1.6 → uipath-2.1.8}/docs/index.md +0 -0
  64. {uipath-2.1.6 → uipath-2.1.8}/docs/javascripts/extra.js +0 -0
  65. {uipath-2.1.6 → uipath-2.1.8}/docs/overrides/main.html +0 -0
  66. {uipath-2.1.6 → uipath-2.1.8}/docs/overrides/partials/actions.html +0 -0
  67. {uipath-2.1.6 → uipath-2.1.8}/docs/overrides/partials/logo.html +0 -0
  68. {uipath-2.1.6 → uipath-2.1.8}/docs/release_policy.md +0 -0
  69. {uipath-2.1.6 → uipath-2.1.8}/docs/sample_images/google-ADK-agent/agent-output.png +0 -0
  70. {uipath-2.1.6 → uipath-2.1.8}/docs/stylesheets/extra.css +0 -0
  71. {uipath-2.1.6 → uipath-2.1.8}/justfile +0 -0
  72. {uipath-2.1.6 → uipath-2.1.8}/mkdocs.yml +0 -0
  73. {uipath-2.1.6 → uipath-2.1.8}/py.typed +0 -0
  74. {uipath-2.1.6 → uipath-2.1.8}/samples/google-ADK-agent/.env.example +0 -0
  75. {uipath-2.1.6 → uipath-2.1.8}/samples/google-ADK-agent/README.md +0 -0
  76. {uipath-2.1.6 → uipath-2.1.8}/samples/google-ADK-agent/input.json +0 -0
  77. {uipath-2.1.6 → uipath-2.1.8}/samples/google-ADK-agent/multi_tool_agent/__init__.py +0 -0
  78. {uipath-2.1.6 → uipath-2.1.8}/samples/google-ADK-agent/multi_tool_agent/agent.py +0 -0
  79. {uipath-2.1.6 → uipath-2.1.8}/samples/google-ADK-agent/pyproject.toml +0 -0
  80. {uipath-2.1.6 → uipath-2.1.8}/samples/google-ADK-agent/uv.lock +0 -0
  81. {uipath-2.1.6 → uipath-2.1.8}/scripts/debug_test.py +0 -0
  82. {uipath-2.1.6 → uipath-2.1.8}/scripts/lint_httpx_client.py +0 -0
  83. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/__init__.py +0 -0
  84. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_cli/README.md +0 -0
  85. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_cli/_auth/_auth_server.py +0 -0
  86. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_cli/_auth/_client_credentials.py +0 -0
  87. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_cli/_auth/_models.py +0 -0
  88. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_cli/_auth/_oidc_utils.py +0 -0
  89. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_cli/_auth/_portal_service.py +0 -0
  90. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_cli/_auth/_utils.py +0 -0
  91. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_cli/_auth/index.html +0 -0
  92. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_cli/_auth/localhost.crt +0 -0
  93. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_cli/_auth/localhost.key +0 -0
  94. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_cli/_runtime/_contracts.py +0 -0
  95. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_cli/_runtime/_escalation.py +0 -0
  96. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_cli/_runtime/_hitl.py +0 -0
  97. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_cli/_runtime/_logging.py +0 -0
  98. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_cli/_runtime/_runtime.py +0 -0
  99. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_cli/_templates/.psmdcp.template +0 -0
  100. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_cli/_templates/.rels.template +0 -0
  101. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_cli/_templates/[Content_Types].xml.template +0 -0
  102. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_cli/_templates/main.py.template +0 -0
  103. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_cli/_templates/package.nuspec.template +0 -0
  104. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_cli/_utils/_console.py +0 -0
  105. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_cli/_utils/_constants.py +0 -0
  106. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_cli/_utils/_debug.py +0 -0
  107. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_cli/_utils/_folders.py +0 -0
  108. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_cli/_utils/_input_args.py +0 -0
  109. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_cli/_utils/_parse_ast.py +0 -0
  110. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_cli/_utils/_processes.py +0 -0
  111. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_cli/_utils/_project_files.py +0 -0
  112. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_cli/_utils/_tracing.py +0 -0
  113. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_cli/_utils/_uv_helpers.py +0 -0
  114. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_cli/cli_auth.py +0 -0
  115. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_cli/cli_deploy.py +0 -0
  116. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_cli/cli_init.py +0 -0
  117. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_cli/cli_invoke.py +0 -0
  118. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_cli/cli_new.py +0 -0
  119. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_cli/cli_publish.py +0 -0
  120. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_cli/cli_run.py +0 -0
  121. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_cli/middlewares.py +0 -0
  122. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_cli/spinner.py +0 -0
  123. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_config.py +0 -0
  124. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_execution_context.py +0 -0
  125. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_folder_context.py +0 -0
  126. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_services/__init__.py +0 -0
  127. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_services/_base_service.py +0 -0
  128. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_services/actions_service.py +0 -0
  129. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_services/api_client.py +0 -0
  130. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_services/assets_service.py +0 -0
  131. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_services/attachments_service.py +0 -0
  132. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_services/buckets_service.py +0 -0
  133. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_services/connections_service.py +0 -0
  134. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_services/context_grounding_service.py +0 -0
  135. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_services/folder_service.py +0 -0
  136. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_services/jobs_service.py +0 -0
  137. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_services/llm_gateway_service.py +0 -0
  138. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_services/processes_service.py +0 -0
  139. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_services/queues_service.py +0 -0
  140. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_uipath.py +0 -0
  141. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_utils/__init__.py +0 -0
  142. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_utils/_endpoint.py +0 -0
  143. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_utils/_infer_bindings.py +0 -0
  144. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_utils/_logs.py +0 -0
  145. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_utils/_read_overwrites.py +0 -0
  146. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_utils/_request_override.py +0 -0
  147. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_utils/_request_spec.py +0 -0
  148. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_utils/_ssl_context.py +0 -0
  149. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_utils/_url.py +0 -0
  150. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_utils/_user_agent.py +0 -0
  151. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/_utils/constants.py +0 -0
  152. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/models/__init__.py +0 -0
  153. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/models/action_schema.py +0 -0
  154. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/models/actions.py +0 -0
  155. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/models/assets.py +0 -0
  156. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/models/attachment.py +0 -0
  157. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/models/buckets.py +0 -0
  158. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/models/connections.py +0 -0
  159. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/models/context_grounding.py +0 -0
  160. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/models/context_grounding_index.py +0 -0
  161. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/models/errors.py +0 -0
  162. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/models/exceptions.py +0 -0
  163. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/models/interrupt_models.py +0 -0
  164. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/models/job.py +0 -0
  165. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/models/llm_gateway.py +0 -0
  166. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/models/processes.py +0 -0
  167. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/models/queues.py +0 -0
  168. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/py.typed +0 -0
  169. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/telemetry/__init__.py +0 -0
  170. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/telemetry/_constants.py +0 -0
  171. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/telemetry/_track.py +0 -0
  172. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/tracing/__init__.py +0 -0
  173. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/tracing/_otel_exporters.py +0 -0
  174. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/tracing/_traced.py +0 -0
  175. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/tracing/_utils.py +0 -0
  176. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/utils/__init__.py +0 -0
  177. {uipath-2.1.6 → uipath-2.1.8}/src/uipath/utils/_endpoints_manager.py +0 -0
  178. {uipath-2.1.6 → uipath-2.1.8}/tests/__init__.py +0 -0
  179. {uipath-2.1.6 → uipath-2.1.8}/tests/cli/conftest.py +0 -0
  180. {uipath-2.1.6 → uipath-2.1.8}/tests/cli/mocks/bindings_script.py +0 -0
  181. {uipath-2.1.6 → uipath-2.1.8}/tests/cli/mocks/pyproject.toml +0 -0
  182. {uipath-2.1.6 → uipath-2.1.8}/tests/cli/mocks/simple_script.py +0 -0
  183. {uipath-2.1.6 → uipath-2.1.8}/tests/cli/mocks/uipath-mock.json +0 -0
  184. {uipath-2.1.6 → uipath-2.1.8}/tests/cli/mocks/uipath-simple-script-mock.json +0 -0
  185. {uipath-2.1.6 → uipath-2.1.8}/tests/cli/test_hitl.py +0 -0
  186. {uipath-2.1.6 → uipath-2.1.8}/tests/cli/test_init.py +0 -0
  187. {uipath-2.1.6 → uipath-2.1.8}/tests/cli/test_invoke.py +0 -0
  188. {uipath-2.1.6 → uipath-2.1.8}/tests/cli/test_new.py +0 -0
  189. {uipath-2.1.6 → uipath-2.1.8}/tests/cli/test_pack.py +0 -0
  190. {uipath-2.1.6 → uipath-2.1.8}/tests/cli/test_publish.py +0 -0
  191. {uipath-2.1.6 → uipath-2.1.8}/tests/cli/test_run.py +0 -0
  192. {uipath-2.1.6 → uipath-2.1.8}/tests/cli/test_utils.py +0 -0
  193. {uipath-2.1.6 → uipath-2.1.8}/tests/cli/utils/project_details.py +0 -0
  194. {uipath-2.1.6 → uipath-2.1.8}/tests/cli/utils/uipath_json.py +0 -0
  195. {uipath-2.1.6 → uipath-2.1.8}/tests/conftest.py +0 -0
  196. {uipath-2.1.6 → uipath-2.1.8}/tests/sdk/services/conftest.py +0 -0
  197. {uipath-2.1.6 → uipath-2.1.8}/tests/sdk/services/test_actions_service.py +0 -0
  198. {uipath-2.1.6 → uipath-2.1.8}/tests/sdk/services/test_api_client.py +0 -0
  199. {uipath-2.1.6 → uipath-2.1.8}/tests/sdk/services/test_assets_service.py +0 -0
  200. {uipath-2.1.6 → uipath-2.1.8}/tests/sdk/services/test_attachments_service.py +0 -0
  201. {uipath-2.1.6 → uipath-2.1.8}/tests/sdk/services/test_base_service.py +0 -0
  202. {uipath-2.1.6 → uipath-2.1.8}/tests/sdk/services/test_buckets_service.py +0 -0
  203. {uipath-2.1.6 → uipath-2.1.8}/tests/sdk/services/test_connections_service.py +0 -0
  204. {uipath-2.1.6 → uipath-2.1.8}/tests/sdk/services/test_context_grounding_service.py +0 -0
  205. {uipath-2.1.6 → uipath-2.1.8}/tests/sdk/services/test_folder_service.py +0 -0
  206. {uipath-2.1.6 → uipath-2.1.8}/tests/sdk/services/test_jobs_service.py +0 -0
  207. {uipath-2.1.6 → uipath-2.1.8}/tests/sdk/services/test_llm_integration.py +0 -0
  208. {uipath-2.1.6 → uipath-2.1.8}/tests/sdk/services/test_llm_schema_cleanup.py +0 -0
  209. {uipath-2.1.6 → uipath-2.1.8}/tests/sdk/services/test_llm_service.py +0 -0
  210. {uipath-2.1.6 → uipath-2.1.8}/tests/sdk/services/test_processes_service.py +0 -0
  211. {uipath-2.1.6 → uipath-2.1.8}/tests/sdk/services/test_queues_service.py +0 -0
  212. {uipath-2.1.6 → uipath-2.1.8}/tests/sdk/services/test_uipath_llm_integration.py +0 -0
  213. {uipath-2.1.6 → uipath-2.1.8}/tests/sdk/test_bindings_inference.py +0 -0
  214. {uipath-2.1.6 → uipath-2.1.8}/tests/sdk/test_config.py +0 -0
  215. {uipath-2.1.6 → uipath-2.1.8}/tests/sdk/test_overwrites.py +0 -0
  216. {uipath-2.1.6 → uipath-2.1.8}/tests/tracing/test_otel_exporters.py +0 -0
  217. {uipath-2.1.6 → uipath-2.1.8}/tests/tracing/test_span_utils.py +0 -0
  218. {uipath-2.1.6 → uipath-2.1.8}/tests/tracing/test_traced.py +0 -0
  219. {uipath-2.1.6 → uipath-2.1.8}/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.6
3
+ Version: 2.1.8
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.6"
3
+ version = "2.1.8"
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"
@@ -10,6 +10,7 @@ from .cli_invoke import invoke as invoke # type: ignore
10
10
  from .cli_new import new as new # type: ignore
11
11
  from .cli_pack import pack as pack # type: ignore
12
12
  from .cli_publish import publish as publish # type: ignore
13
+ from .cli_pull import pull as pull # type: ignore
13
14
  from .cli_push import push as push # type: ignore
14
15
  from .cli_run import run as run # type: ignore
15
16
 
@@ -65,3 +66,4 @@ cli.add_command(deploy)
65
66
  cli.add_command(auth)
66
67
  cli.add_command(invoke)
67
68
  cli.add_command(push)
69
+ cli.add_command(pull)
@@ -0,0 +1,6 @@
1
+ {
2
+ "client_id": "36dea5b8-e8bb-423d-8e7b-c808df8f1c00",
3
+ "redirect_uri": "http://localhost:__PY_REPLACE_PORT__/oidc/login",
4
+ "scope": "offline_access ProcessMining OrchestratorApiUserAccess StudioWebBackend IdentityServerApi ConnectionService DataService DocumentUnderstanding EnterpriseContextService Directory JamJamApi LLMGateway LLMOps OMS RCS.FolderAuthorization TM.Projects TM.TestCases TM.Requirements TM.TestSets",
5
+ "port": 8104
6
+ }
@@ -1,5 +1,6 @@
1
1
  import os
2
2
  from typing import Optional
3
+ from urllib.parse import urlparse
3
4
 
4
5
  import click
5
6
 
@@ -29,7 +30,7 @@ def environment_options(function):
29
30
  return function
30
31
 
31
32
 
32
- def get_env_vars(spinner: Optional[Spinner] = None) -> list[str | None]:
33
+ def get_env_vars(spinner: Optional[Spinner] = None) -> list[str]:
33
34
  base_url = os.environ.get("UIPATH_URL")
34
35
  token = os.environ.get("UIPATH_ACCESS_TOKEN")
35
36
 
@@ -42,7 +43,8 @@ def get_env_vars(spinner: Optional[Spinner] = None) -> list[str | None]:
42
43
  click.echo("UIPATH_URL, UIPATH_ACCESS_TOKEN")
43
44
  click.get_current_context().exit(1)
44
45
 
45
- return [base_url, token]
46
+ # at this step we know for sure that both base_url and token exist. type checking can be disabled
47
+ return [base_url, token] # type: ignore
46
48
 
47
49
 
48
50
  def serialize_object(obj):
@@ -69,3 +71,18 @@ def serialize_object(obj):
69
71
  # Return primitive types as is
70
72
  else:
71
73
  return obj
74
+
75
+
76
+ def get_org_scoped_url(base_url: str) -> str:
77
+ """Get organization scoped URL from base URL.
78
+
79
+ Args:
80
+ base_url: The base URL to scope
81
+
82
+ Returns:
83
+ str: The organization scoped URL
84
+ """
85
+ parsed = urlparse(base_url)
86
+ org_name, *_ = parsed.path.strip("/").split("/")
87
+ org_scoped_url = f"{parsed.scheme}://{parsed.netloc}/{org_name}"
88
+ return org_scoped_url
@@ -1,5 +1,6 @@
1
- from typing import List, Optional, Union
1
+ from typing import Any, List, Optional, Union
2
2
 
3
+ import httpx
3
4
  from pydantic import BaseModel, ConfigDict, Field, field_validator
4
5
 
5
6
 
@@ -136,3 +137,62 @@ class ProjectStructure(BaseModel):
136
137
  if isinstance(v, int):
137
138
  return str(v)
138
139
  return v
140
+
141
+
142
+ def get_project_structure(
143
+ project_id: str,
144
+ base_url: str,
145
+ token: str,
146
+ client: httpx.Client,
147
+ ) -> ProjectStructure:
148
+ """Retrieve the project's file structure from UiPath Cloud.
149
+
150
+ Makes an API call to fetch the complete file structure of a project,
151
+ including all files and folders. The response is validated against
152
+ the ProjectStructure model.
153
+
154
+ Args:
155
+ project_id: The ID of the project
156
+ base_url: The base URL for the API
157
+ token: Authentication token
158
+ client: HTTP client to use for requests
159
+
160
+ Returns:
161
+ ProjectStructure: The complete project structure
162
+
163
+ Raises:
164
+ httpx.HTTPError: If the API request fails
165
+ """
166
+ headers = {"Authorization": f"Bearer {token}"}
167
+ url = (
168
+ f"{base_url}/studio_/backend/api/Project/{project_id}/FileOperations/Structure"
169
+ )
170
+
171
+ response = client.get(url, headers=headers)
172
+ response.raise_for_status()
173
+ return ProjectStructure.model_validate(response.json())
174
+
175
+
176
+ def download_file(base_url: str, file_id: str, client: httpx.Client, token: str) -> Any:
177
+ file_url = f"{base_url}/File/{file_id}"
178
+ response = client.get(file_url, headers={"Authorization": f"Bearer {token}"})
179
+ response.raise_for_status()
180
+ return response
181
+
182
+
183
+ def get_folder_by_name(
184
+ structure: ProjectStructure, folder_name: str
185
+ ) -> Optional[ProjectFolder]:
186
+ """Get a folder from the project structure by name.
187
+
188
+ Args:
189
+ structure: The project structure
190
+ folder_name: Name of the folder to find
191
+
192
+ Returns:
193
+ Optional[ProjectFolder]: The found folder or None
194
+ """
195
+ for folder in structure.folders:
196
+ if folder.name == folder_name:
197
+ return folder
198
+ return None
@@ -276,7 +276,9 @@ def display_project_info(config):
276
276
 
277
277
 
278
278
  @click.command()
279
- @click.argument("root", type=str, default="./")
279
+ @click.argument(
280
+ "root", type=click.Path(exists=True, file_okay=False, dir_okay=True), default="."
281
+ )
280
282
  @click.option(
281
283
  "--nolock",
282
284
  is_flag=True,
@@ -0,0 +1,215 @@
1
+ # type: ignore
2
+ """CLI command for pulling remote project files from UiPath StudioWeb solution.
3
+
4
+ This module provides functionality to pull remote project files from a UiPath StudioWeb solution.
5
+ It handles:
6
+ - File downloads from source_code and evals folders
7
+ - Maintaining folder structure locally
8
+ - File comparison using hashes
9
+ - Interactive confirmation for overwriting files
10
+ """
11
+
12
+ # type: ignore
13
+ import hashlib
14
+ import json
15
+ import os
16
+ from typing import Dict, Set
17
+
18
+ import click
19
+ import httpx
20
+ from dotenv import load_dotenv
21
+
22
+ from .._utils._ssl_context import get_httpx_client_kwargs
23
+ from ..telemetry import track
24
+ from ._utils._common import get_env_vars, get_org_scoped_url
25
+ from ._utils._console import ConsoleLogger
26
+ from ._utils._studio_project import (
27
+ ProjectFile,
28
+ ProjectFolder,
29
+ download_file,
30
+ get_folder_by_name,
31
+ get_project_structure,
32
+ )
33
+
34
+ console = ConsoleLogger()
35
+ load_dotenv(override=True)
36
+
37
+
38
+ def compute_normalized_hash(content: str) -> str:
39
+ """Compute hash of normalized content.
40
+
41
+ Args:
42
+ content: Content to hash
43
+
44
+ Returns:
45
+ str: SHA256 hash of the normalized content
46
+ """
47
+ try:
48
+ # Try to parse as JSON to handle formatting
49
+ json_content = json.loads(content)
50
+ normalized = json.dumps(json_content, indent=2)
51
+ except json.JSONDecodeError:
52
+ # Not JSON, normalize line endings
53
+ normalized = content.replace("\r\n", "\n").replace("\r", "\n")
54
+
55
+ return hashlib.sha256(normalized.encode("utf-8")).hexdigest()
56
+
57
+
58
+ def collect_files_from_folder(
59
+ folder: ProjectFolder, base_path: str, files_dict: Dict[str, ProjectFile]
60
+ ) -> None:
61
+ """Recursively collect all files from a folder and its subfolders.
62
+
63
+ Args:
64
+ folder: The folder to collect files from
65
+ base_path: Base path for file paths
66
+ files_dict: Dictionary to store collected files
67
+ """
68
+ # Add files from current folder
69
+ for file in folder.files:
70
+ file_path = os.path.join(base_path, file.name)
71
+ files_dict[file_path] = file
72
+
73
+ # Recursively process subfolders
74
+ for subfolder in folder.folders:
75
+ subfolder_path = os.path.join(base_path, subfolder.name)
76
+ collect_files_from_folder(subfolder, subfolder_path, files_dict)
77
+
78
+
79
+ def download_folder_files(
80
+ folder: ProjectFolder,
81
+ base_path: str,
82
+ base_url: str,
83
+ token: str,
84
+ client: httpx.Client,
85
+ processed_files: Set[str],
86
+ ) -> None:
87
+ """Download files from a folder recursively.
88
+
89
+ Args:
90
+ folder: The folder to download files from
91
+ base_path: Base path for local file storage
92
+ base_url: Base URL for API requests
93
+ token: Authentication token
94
+ client: HTTP client
95
+ processed_files: Set to track processed files
96
+ """
97
+ files_dict: Dict[str, ProjectFile] = {}
98
+ collect_files_from_folder(folder, "", files_dict)
99
+
100
+ for file_path, remote_file in files_dict.items():
101
+ local_path = os.path.join(base_path, file_path)
102
+ local_dir = os.path.dirname(local_path)
103
+
104
+ # Create directory if it doesn't exist
105
+ if not os.path.exists(local_dir):
106
+ os.makedirs(local_dir)
107
+
108
+ # Download remote file
109
+ response = download_file(base_url, remote_file.id, client, token)
110
+ remote_content = response.read().decode("utf-8")
111
+ remote_hash = compute_normalized_hash(remote_content)
112
+
113
+ if os.path.exists(local_path):
114
+ # Read and hash local file
115
+ with open(local_path, "r", encoding="utf-8") as f:
116
+ local_content = f.read()
117
+ local_hash = compute_normalized_hash(local_content)
118
+
119
+ # Compare hashes
120
+ if local_hash != remote_hash:
121
+ styled_path = click.style(str(file_path), fg="cyan")
122
+ console.warning(f"File {styled_path}" + " differs from remote version.")
123
+ response = click.prompt("Do you want to override it? (y/n)", type=str)
124
+ if response.lower() == "y":
125
+ with open(local_path, "w", encoding="utf-8", newline="\n") as f:
126
+ f.write(remote_content)
127
+ console.success(f"Updated {click.style(str(file_path), fg='cyan')}")
128
+ else:
129
+ console.info(f"Skipped {click.style(str(file_path), fg='cyan')}")
130
+ else:
131
+ console.info(
132
+ f"File {click.style(str(file_path), fg='cyan')} is up to date"
133
+ )
134
+ else:
135
+ # File doesn't exist locally, create it
136
+ with open(local_path, "w", encoding="utf-8", newline="\n") as f:
137
+ f.write(remote_content)
138
+ console.success(f"Downloaded {click.style(str(file_path), fg='cyan')}")
139
+
140
+ processed_files.add(file_path)
141
+
142
+
143
+ @click.command()
144
+ @click.argument(
145
+ "root", type=click.Path(exists=True, file_okay=False, dir_okay=True), default="."
146
+ )
147
+ @track
148
+ def pull(root: str) -> None:
149
+ """Pull remote project files from Studio Web Project.
150
+
151
+ This command pulls the remote project files from a UiPath Studio Web project.
152
+ It downloads files from the source_code and evals folders, maintaining the
153
+ folder structure locally. Files are compared using hashes before overwriting,
154
+ and user confirmation is required for differing files.
155
+
156
+ Args:
157
+ root: The root directory to pull files into
158
+
159
+ Environment Variables:
160
+ UIPATH_PROJECT_ID: Required. The ID of the UiPath Studio Web project
161
+
162
+ Example:
163
+ $ uipath pull
164
+ $ uipath pull /path/to/project
165
+ """
166
+ if not os.getenv("UIPATH_PROJECT_ID", False):
167
+ console.error("UIPATH_PROJECT_ID environment variable not found.")
168
+
169
+ [base_url, token] = get_env_vars()
170
+ base_api_url = f"{get_org_scoped_url(base_url)}/studio_/backend/api/Project/{os.getenv('UIPATH_PROJECT_ID')}/FileOperations"
171
+
172
+ with console.spinner("Pulling UiPath project files..."):
173
+ try:
174
+ with httpx.Client(**get_httpx_client_kwargs()) as client:
175
+ # Get project structure
176
+ structure = get_project_structure(
177
+ os.getenv("UIPATH_PROJECT_ID"), # type: ignore
178
+ get_org_scoped_url(base_url),
179
+ token,
180
+ client,
181
+ )
182
+
183
+ processed_files: Set[str] = set()
184
+
185
+ # Process source_code folder
186
+ source_code_folder = get_folder_by_name(structure, "source_code")
187
+ if source_code_folder:
188
+ download_folder_files(
189
+ source_code_folder,
190
+ root,
191
+ base_api_url,
192
+ token,
193
+ client,
194
+ processed_files,
195
+ )
196
+ else:
197
+ console.warning("No source_code folder found in remote project")
198
+
199
+ # Process evals folder
200
+ evals_folder = get_folder_by_name(structure, "evals")
201
+ if evals_folder:
202
+ evals_path = os.path.join(root, "evals")
203
+ download_folder_files(
204
+ evals_folder,
205
+ evals_path,
206
+ base_api_url,
207
+ token,
208
+ client,
209
+ processed_files,
210
+ )
211
+ else:
212
+ console.warning("No evals folder found in remote project")
213
+
214
+ except Exception as e:
215
+ console.error(f"Failed to pull UiPath project: {str(e)}")
@@ -492,7 +492,9 @@ def upload_source_files_to_project(
492
492
 
493
493
 
494
494
  @click.command()
495
- @click.argument("root", type=str, default="./")
495
+ @click.argument(
496
+ "root", type=click.Path(exists=True, file_okay=False, dir_okay=True), default="."
497
+ )
496
498
  @click.option(
497
499
  "--nolock",
498
500
  is_flag=True,