uipath 2.1.62__tar.gz → 2.1.64__tar.gz

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