artefacts-cli 0.16.2__tar.gz → 0.17.0__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 (184) hide show
  1. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/CHANGELOG.md +12 -0
  2. {artefacts_cli-0.16.2/artefacts_cli.egg-info → artefacts_cli-0.17.0}/PKG-INFO +3 -1
  3. artefacts_cli-0.17.0/artefacts/api/api/job/trigger_platform_launch.py +196 -0
  4. artefacts_cli-0.17.0/artefacts/api/api/organization/post_create_organization.py +185 -0
  5. artefacts_cli-0.17.0/artefacts/api/api/user/__init__.py +1 -0
  6. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/models/__init__.py +6 -0
  7. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/models/create_new_job.py +40 -0
  8. artefacts_cli-0.17.0/artefacts/api/models/create_organization.py +51 -0
  9. artefacts_cli-0.17.0/artefacts/api/models/create_organization_errors.py +46 -0
  10. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/models/job.py +40 -0
  11. artefacts_cli-0.17.0/artefacts/api/models/organization.py +51 -0
  12. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/cli/__init__.py +6 -1
  13. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/cli/app.py +97 -61
  14. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/cli/app_project.py +251 -35
  15. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/cli/blob/__init__.py +101 -50
  16. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/cli/blob/helpers.py +0 -9
  17. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/cli/config.py +6 -2
  18. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/cli/core/code_environment.py +31 -0
  19. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/cli/locales/art.pot +116 -15
  20. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/cli/locales/base.pot +137 -24
  21. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/cli/locales/click.pot +2 -2
  22. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/cli/locales/ja_JP/LC_MESSAGES/artefacts.po +109 -7
  23. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/cli/version.py +3 -3
  24. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0/artefacts_cli.egg-info}/PKG-INFO +3 -1
  25. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts_cli.egg-info/SOURCES.txt +6 -0
  26. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts_cli.egg-info/requires.txt +2 -0
  27. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/pyproject.toml +2 -0
  28. artefacts_cli-0.17.0/scripts/dev_version.py +34 -0
  29. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/tests/cli/core/test_code_environment.py +48 -0
  30. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/tests/cli/test_app_auth.py +21 -2
  31. artefacts_cli-0.17.0/tests/cli/test_app_project.py +546 -0
  32. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/tests/cli/test_cli.py +4 -2
  33. artefacts_cli-0.16.2/scripts/dev_version.py +0 -28
  34. artefacts_cli-0.16.2/tests/cli/test_app_project.py +0 -262
  35. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/.coveragerc +0 -0
  36. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/.pyre_configuration +0 -0
  37. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/README.md +0 -0
  38. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/README_INTERNAL.md +0 -0
  39. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/__init__.py +0 -0
  40. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/__init__.py +0 -0
  41. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/api/__init__.py +0 -0
  42. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/api/default/__init__.py +0 -0
  43. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/api/default/get_artifact.py +0 -0
  44. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/api/framework/__init__.py +0 -0
  45. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/api/framework/list_frameworks.py +0 -0
  46. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/api/framework/list_simulators.py +0 -0
  47. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/api/job/__init__.py +0 -0
  48. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/api/job/api_project_new_job.py +0 -0
  49. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/api/job/get_artifact_downloads.py +0 -0
  50. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/api/job/get_job_by_commit.py +0 -0
  51. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/api/job/get_job_test_results.py +0 -0
  52. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/api/job/post_update_job_results.py +0 -0
  53. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/api/job/put_update_job_results.py +0 -0
  54. {artefacts_cli-0.16.2/artefacts/api/api/project → artefacts_cli-0.17.0/artefacts/api/api/organization}/__init__.py +0 -0
  55. {artefacts_cli-0.16.2/artefacts/api/api/projects → artefacts_cli-0.17.0/artefacts/api/api/project}/__init__.py +0 -0
  56. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/api/project/api_project_info.py +0 -0
  57. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/api/project/create_remote.py +0 -0
  58. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/api/project/get_badge.py +0 -0
  59. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/api/project/get_config.py +0 -0
  60. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/api/project/get_last_jobs.py +0 -0
  61. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/api/project/upload_source.py +0 -0
  62. {artefacts_cli-0.16.2/artefacts/api/api/run → artefacts_cli-0.17.0/artefacts/api/api/projects}/__init__.py +0 -0
  63. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/api/projects/api_create_project.py +0 -0
  64. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/api/projects/api_list_projects.py +0 -0
  65. {artefacts_cli-0.16.2/artefacts/api/api/user → artefacts_cli-0.17.0/artefacts/api/api/run}/__init__.py +0 -0
  66. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/api/run/create_job_run.py +0 -0
  67. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/api/run/submit_run_results.py +0 -0
  68. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/api/user/get_user_organizations.py +0 -0
  69. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/client.py +0 -0
  70. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/errors.py +0 -0
  71. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/models/artifact_response.py +0 -0
  72. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/models/blob.py +0 -0
  73. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/models/create_project.py +0 -0
  74. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/models/create_remote.py +0 -0
  75. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/models/create_remote_response.py +0 -0
  76. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/models/create_remote_response_blob_upload_urls.py +0 -0
  77. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/models/create_remote_response_upload_urls.py +0 -0
  78. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/models/error.py +0 -0
  79. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/models/error_errors.py +0 -0
  80. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/models/framework.py +0 -0
  81. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/models/frameworks_list.py +0 -0
  82. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/models/get_artifact_downloads_response.py +0 -0
  83. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/models/last_jobs_response.py +0 -0
  84. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/models/list_projects_response.py +0 -0
  85. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/models/presigned_url.py +0 -0
  86. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/models/presigned_url_fields.py +0 -0
  87. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/models/project.py +0 -0
  88. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/models/register_run.py +0 -0
  89. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/models/register_run_tests_item.py +0 -0
  90. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/models/scenario_map_response.py +0 -0
  91. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/models/simulator.py +0 -0
  92. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/models/simulators_list.py +0 -0
  93. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/models/submit_run_results.py +0 -0
  94. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/models/submit_run_results_metrics.py +0 -0
  95. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/models/submit_run_results_response.py +0 -0
  96. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/models/submit_run_results_response_upload_urls.py +0 -0
  97. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/models/submit_run_results_tests_item.py +0 -0
  98. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/models/submit_run_results_uploads.py +0 -0
  99. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/models/update_job_results.py +0 -0
  100. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/models/upload_source_response.py +0 -0
  101. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/models/upload_source_response_upload_urls.py +0 -0
  102. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/models/user_organizations_response.py +0 -0
  103. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/api/types.py +0 -0
  104. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/cli/app_auth.py +0 -0
  105. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/cli/app_containers.py +0 -0
  106. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/cli/app_containers.pyi +0 -0
  107. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/cli/app_experimental.py +0 -0
  108. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/cli/blob/filetree_classifyer.py +0 -0
  109. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/cli/blob/hash_cache.py +0 -0
  110. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/cli/blob/types.py +0 -0
  111. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/cli/constants.py +0 -0
  112. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/cli/containers/__init__.py +0 -0
  113. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/cli/containers/docker_cm.py +0 -0
  114. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/cli/containers/docker_utils.py +0 -0
  115. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/cli/containers/utils.py +0 -0
  116. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/cli/core/__init__.py +0 -0
  117. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/cli/doctor.py +0 -0
  118. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/cli/download.py +0 -0
  119. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/cli/errors.py +0 -0
  120. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/cli/i18n.py +0 -0
  121. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/cli/logger.py +0 -0
  122. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/cli/reporter.py +0 -0
  123. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/cli/runners/__init__.py +0 -0
  124. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/cli/runners/base_runner.py +0 -0
  125. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/cli/runners/launch_test_runner.py +0 -0
  126. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/cli/runners/pytest_runner.py +0 -0
  127. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/cli/shell_completion.py +0 -0
  128. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/cli/templates/sample_config.yaml +0 -0
  129. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/cli/utils/__init__.py +0 -0
  130. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/cli/utils/api.py +0 -0
  131. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/cli/utils/auth.py +0 -0
  132. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/cli/utils/click_net_watch.py +0 -0
  133. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/cli/utils/common.py +0 -0
  134. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/cli/utils/config.py +0 -0
  135. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/cli/utils/formatting.py +0 -0
  136. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/cli/utils/junit.py +0 -0
  137. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/cli/utils/parameters.py +0 -0
  138. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/cli/utils/proc_tree_tracker.py +0 -0
  139. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/cli/utils/ros/__init__.py +0 -0
  140. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/cli/utils/ros/bagparser.py +0 -0
  141. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/cli/utils/ros/rosbags.py +0 -0
  142. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts/copava/__init__.py +0 -0
  143. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts.yaml +0 -0
  144. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts_cli.egg-info/dependency_links.txt +0 -0
  145. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts_cli.egg-info/entry_points.txt +0 -0
  146. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/artefacts_cli.egg-info/top_level.txt +0 -0
  147. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/bin/release +0 -0
  148. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/infra-tests/test_run_remote.yaml +0 -0
  149. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/infra-tests/turtlesim2/launch_turtle.py +0 -0
  150. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/infra-tests/turtlesim2/sample_node.py +0 -0
  151. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/pytest.ini +0 -0
  152. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/scripts/whats_latest.rb +0 -0
  153. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/setup.cfg +0 -0
  154. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/tests/__init__.py +0 -0
  155. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/tests/cli/__init__.py +0 -0
  156. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/tests/cli/blob/__init__.py +0 -0
  157. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/tests/cli/blob/test_compression.py +0 -0
  158. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/tests/cli/blob/test_dir_crawl.py +0 -0
  159. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/tests/cli/containers/__init__.py +0 -0
  160. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/tests/cli/containers/test_docker.py +0 -0
  161. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/tests/cli/containers/test_utils.py +0 -0
  162. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/tests/cli/test_app_containers.py +0 -0
  163. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/tests/cli/test_config.py +0 -0
  164. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/tests/cli/test_config_validation.py +0 -0
  165. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/tests/cli/test_download.py +0 -0
  166. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/tests/cli/test_init.py +0 -0
  167. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/tests/cli/test_other.py +0 -0
  168. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/tests/cli/test_parameters.py +0 -0
  169. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/tests/cli/test_pytest.py +0 -0
  170. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/tests/cli/test_reporter.py +0 -0
  171. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/tests/cli/test_ros2.py +0 -0
  172. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/tests/cli/test_signals.py +0 -0
  173. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/tests/cli/test_utils.py +0 -0
  174. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/tests/cli/test_utils_ros.py +0 -0
  175. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/tests/cli/test_warp.py +0 -0
  176. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/tests/cli/test_warp_run.py +0 -0
  177. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/tests/conftest.py +0 -0
  178. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/tests/fixtures/artefacts-env-param.yaml +0 -0
  179. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/tests/fixtures/artefacts.yaml.template +0 -0
  180. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/tests/fixtures/artefacts_deprecated.yaml +0 -0
  181. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/tests/fixtures/bad_launch_test.py +0 -0
  182. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/tests/fixtures/sample_pytest_file.py +0 -0
  183. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/tests/fixtures/test_junit.xml +0 -0
  184. {artefacts_cli-0.16.2 → artefacts_cli-0.17.0}/tests/utils/docker_mock.py +0 -0
@@ -7,6 +7,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ### Changed
11
+
12
+ - Show a link to the dashboard when project commands miss arguments (#534)
13
+ - Fail fast on remote runs if some problems found with the configuration file (invalid org or project), to avoid expensive preps and uploads and improve UX (#525)
14
+ - New compact output on remote run submission (#527)
15
+
16
+ ### Added
17
+
18
+ - Create organizations from the CLI with `artefacts organization create` (#497)
19
+ - Fall back to `artefacts.yaml` or the logged-in account for missing arguments in `project info` and `project list` (#526, #535)
20
+ - Auto-generate job descriptions from git diff on `artefacts run` and `artefacts run-remote` when `--description` is omitted (#411)
21
+
10
22
  ## [0.16.0] - 2026-04-08
11
23
 
12
24
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: artefacts_cli
3
- Version: 0.16.2
3
+ Version: 0.17.0
4
4
  Author-email: FD <fabian@artefacts.com>, AGC <alejandro@artefacts.com>, TN <tomo@artefacts.com>, EP <eric@artefacts.com>
5
5
  License-Expression: Apache-2.0
6
6
  Project-URL: Homepage, https://github.com/art-e-fact/artefacts-client
@@ -14,6 +14,7 @@ Requires-Dist: artefacts-c2d>=1.8.11
14
14
  Requires-Dist: artefacts-copava>=0.2.0
15
15
  Requires-Dist: artefacts-click==0.2.0
16
16
  Requires-Dist: artefacts-xray>=0.2.0
17
+ Requires-Dist: bitmath==1.4.0.1
17
18
  Requires-Dist: docker==7.1.0
18
19
  Requires-Dist: gitignore_parser>=0.1.11
19
20
  Requires-Dist: junitparser>=2.5
@@ -44,6 +45,7 @@ Requires-Dist: pyre-check; extra == "dev"
44
45
  Requires-Dist: pytest; extra == "dev"
45
46
  Requires-Dist: pytest-cov; extra == "dev"
46
47
  Requires-Dist: pytest-env; extra == "dev"
48
+ Requires-Dist: pytest-httpx; extra == "dev"
47
49
  Requires-Dist: pytest-mock; extra == "dev"
48
50
  Requires-Dist: python-markdown-math; extra == "dev"
49
51
  Requires-Dist: ruff>=0.9.2; extra == "dev"
@@ -0,0 +1,196 @@
1
+ from http import HTTPStatus
2
+ from typing import Any, cast
3
+ from urllib.parse import quote
4
+
5
+ import httpx
6
+
7
+ from ...client import AuthenticatedClient, Client
8
+ from ...types import Response
9
+ from ... import errors
10
+
11
+ from ...models.error import Error
12
+
13
+
14
+ def _get_kwargs(
15
+ organization_slug: str,
16
+ project_name: str,
17
+ job_uuid: str,
18
+ ) -> dict[str, Any]:
19
+ _kwargs: dict[str, Any] = {
20
+ "method": "post",
21
+ "url": "/{organization_slug}/{project_name}/job/{job_uuid}/start".format(
22
+ organization_slug=quote(str(organization_slug), safe=""),
23
+ project_name=quote(str(project_name), safe=""),
24
+ job_uuid=quote(str(job_uuid), safe=""),
25
+ ),
26
+ }
27
+
28
+ return _kwargs
29
+
30
+
31
+ def _parse_response(
32
+ *, client: AuthenticatedClient | Client, response: httpx.Response
33
+ ) -> Any | Error | None:
34
+ if response.status_code == 200:
35
+ response_200 = cast(Any, None)
36
+ return response_200
37
+
38
+ if response.status_code == 401:
39
+ response_401 = Error.from_dict(response.json())
40
+
41
+ return response_401
42
+
43
+ if response.status_code == 403:
44
+ response_403 = Error.from_dict(response.json())
45
+
46
+ return response_403
47
+
48
+ if response.status_code == 404:
49
+ response_404 = cast(Any, None)
50
+ return response_404
51
+
52
+ if client.raise_on_unexpected_status:
53
+ raise errors.UnexpectedStatus(response.status_code, response.content)
54
+ else:
55
+ return None
56
+
57
+
58
+ def _build_response(
59
+ *, client: AuthenticatedClient | Client, response: httpx.Response
60
+ ) -> Response[Any | Error]:
61
+ return Response(
62
+ status_code=HTTPStatus(response.status_code),
63
+ content=response.content,
64
+ headers=response.headers,
65
+ parsed=_parse_response(client=client, response=response),
66
+ )
67
+
68
+
69
+ def sync_detailed(
70
+ organization_slug: str,
71
+ project_name: str,
72
+ job_uuid: str,
73
+ *,
74
+ client: AuthenticatedClient | Client,
75
+ ) -> Response[Any | Error]:
76
+ """Triggers a job to start running in our infrastructure. Requires the job to not already be running
77
+
78
+ Args:
79
+ organization_slug (str):
80
+ project_name (str):
81
+ job_uuid (str):
82
+
83
+ Raises:
84
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
85
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
86
+
87
+ Returns:
88
+ Response[Any | Error]
89
+ """
90
+
91
+ kwargs = _get_kwargs(
92
+ organization_slug=organization_slug,
93
+ project_name=project_name,
94
+ job_uuid=job_uuid,
95
+ )
96
+
97
+ response = client.get_httpx_client().request(
98
+ **kwargs,
99
+ )
100
+
101
+ return _build_response(client=client, response=response)
102
+
103
+
104
+ def sync(
105
+ organization_slug: str,
106
+ project_name: str,
107
+ job_uuid: str,
108
+ *,
109
+ client: AuthenticatedClient | Client,
110
+ ) -> Any | Error | None:
111
+ """Triggers a job to start running in our infrastructure. Requires the job to not already be running
112
+
113
+ Args:
114
+ organization_slug (str):
115
+ project_name (str):
116
+ job_uuid (str):
117
+
118
+ Raises:
119
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
120
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
121
+
122
+ Returns:
123
+ Any | Error
124
+ """
125
+
126
+ return sync_detailed(
127
+ organization_slug=organization_slug,
128
+ project_name=project_name,
129
+ job_uuid=job_uuid,
130
+ client=client,
131
+ ).parsed
132
+
133
+
134
+ async def asyncio_detailed(
135
+ organization_slug: str,
136
+ project_name: str,
137
+ job_uuid: str,
138
+ *,
139
+ client: AuthenticatedClient | Client,
140
+ ) -> Response[Any | Error]:
141
+ """Triggers a job to start running in our infrastructure. Requires the job to not already be running
142
+
143
+ Args:
144
+ organization_slug (str):
145
+ project_name (str):
146
+ job_uuid (str):
147
+
148
+ Raises:
149
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
150
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
151
+
152
+ Returns:
153
+ Response[Any | Error]
154
+ """
155
+
156
+ kwargs = _get_kwargs(
157
+ organization_slug=organization_slug,
158
+ project_name=project_name,
159
+ job_uuid=job_uuid,
160
+ )
161
+
162
+ response = await client.get_async_httpx_client().request(**kwargs)
163
+
164
+ return _build_response(client=client, response=response)
165
+
166
+
167
+ async def asyncio(
168
+ organization_slug: str,
169
+ project_name: str,
170
+ job_uuid: str,
171
+ *,
172
+ client: AuthenticatedClient | Client,
173
+ ) -> Any | Error | None:
174
+ """Triggers a job to start running in our infrastructure. Requires the job to not already be running
175
+
176
+ Args:
177
+ organization_slug (str):
178
+ project_name (str):
179
+ job_uuid (str):
180
+
181
+ Raises:
182
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
183
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
184
+
185
+ Returns:
186
+ Any | Error
187
+ """
188
+
189
+ return (
190
+ await asyncio_detailed(
191
+ organization_slug=organization_slug,
192
+ project_name=project_name,
193
+ job_uuid=job_uuid,
194
+ client=client,
195
+ )
196
+ ).parsed
@@ -0,0 +1,185 @@
1
+ from http import HTTPStatus
2
+ from typing import Any
3
+
4
+ import httpx
5
+
6
+ from ...client import AuthenticatedClient, Client
7
+ from ...types import Response, UNSET
8
+ from ... import errors
9
+
10
+ from ...models.create_organization import CreateOrganization
11
+ from ...models.create_organization_errors import CreateOrganizationErrors
12
+ from ...models.error import Error
13
+ from ...models.organization import Organization
14
+ from ...types import Unset
15
+
16
+
17
+ def _get_kwargs(
18
+ *,
19
+ body: CreateOrganization | Unset = UNSET,
20
+ ) -> dict[str, Any]:
21
+ headers: dict[str, Any] = {}
22
+
23
+ _kwargs: dict[str, Any] = {
24
+ "method": "post",
25
+ "url": "/organization/",
26
+ }
27
+
28
+ if not isinstance(body, Unset):
29
+ _kwargs["json"] = body.to_dict()
30
+
31
+ headers["Content-Type"] = "application/json"
32
+
33
+ _kwargs["headers"] = headers
34
+ return _kwargs
35
+
36
+
37
+ def _parse_response(
38
+ *, client: AuthenticatedClient | Client, response: httpx.Response
39
+ ) -> CreateOrganizationErrors | Error | Organization | None:
40
+ if response.status_code == 200:
41
+ response_200 = Organization.from_dict(response.json())
42
+
43
+ return response_200
44
+
45
+ if response.status_code == 400:
46
+ response_400 = CreateOrganizationErrors.from_dict(response.json())
47
+
48
+ return response_400
49
+
50
+ if response.status_code == 401:
51
+ response_401 = Error.from_dict(response.json())
52
+
53
+ return response_401
54
+
55
+ if response.status_code == 403:
56
+ response_403 = Error.from_dict(response.json())
57
+
58
+ return response_403
59
+
60
+ if response.status_code == 409:
61
+ response_409 = Error.from_dict(response.json())
62
+
63
+ return response_409
64
+
65
+ if client.raise_on_unexpected_status:
66
+ raise errors.UnexpectedStatus(response.status_code, response.content)
67
+ else:
68
+ return None
69
+
70
+
71
+ def _build_response(
72
+ *, client: AuthenticatedClient | Client, response: httpx.Response
73
+ ) -> Response[CreateOrganizationErrors | Error | Organization]:
74
+ return Response(
75
+ status_code=HTTPStatus(response.status_code),
76
+ content=response.content,
77
+ headers=response.headers,
78
+ parsed=_parse_response(client=client, response=response),
79
+ )
80
+
81
+
82
+ def sync_detailed(
83
+ *,
84
+ client: AuthenticatedClient | Client,
85
+ body: CreateOrganization | Unset = UNSET,
86
+ ) -> Response[CreateOrganizationErrors | Error | Organization]:
87
+ """Create a new organization for the authenticated user.
88
+
89
+ Args:
90
+ body (CreateOrganization | Unset):
91
+
92
+ Raises:
93
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
94
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
95
+
96
+ Returns:
97
+ Response[CreateOrganizationErrors | Error | Organization]
98
+ """
99
+
100
+ kwargs = _get_kwargs(
101
+ body=body,
102
+ )
103
+
104
+ response = client.get_httpx_client().request(
105
+ **kwargs,
106
+ )
107
+
108
+ return _build_response(client=client, response=response)
109
+
110
+
111
+ def sync(
112
+ *,
113
+ client: AuthenticatedClient | Client,
114
+ body: CreateOrganization | Unset = UNSET,
115
+ ) -> CreateOrganizationErrors | Error | Organization | None:
116
+ """Create a new organization for the authenticated user.
117
+
118
+ Args:
119
+ body (CreateOrganization | Unset):
120
+
121
+ Raises:
122
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
123
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
124
+
125
+ Returns:
126
+ CreateOrganizationErrors | Error | Organization
127
+ """
128
+
129
+ return sync_detailed(
130
+ client=client,
131
+ body=body,
132
+ ).parsed
133
+
134
+
135
+ async def asyncio_detailed(
136
+ *,
137
+ client: AuthenticatedClient | Client,
138
+ body: CreateOrganization | Unset = UNSET,
139
+ ) -> Response[CreateOrganizationErrors | Error | Organization]:
140
+ """Create a new organization for the authenticated user.
141
+
142
+ Args:
143
+ body (CreateOrganization | Unset):
144
+
145
+ Raises:
146
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
147
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
148
+
149
+ Returns:
150
+ Response[CreateOrganizationErrors | Error | Organization]
151
+ """
152
+
153
+ kwargs = _get_kwargs(
154
+ body=body,
155
+ )
156
+
157
+ response = await client.get_async_httpx_client().request(**kwargs)
158
+
159
+ return _build_response(client=client, response=response)
160
+
161
+
162
+ async def asyncio(
163
+ *,
164
+ client: AuthenticatedClient | Client,
165
+ body: CreateOrganization | Unset = UNSET,
166
+ ) -> CreateOrganizationErrors | Error | Organization | None:
167
+ """Create a new organization for the authenticated user.
168
+
169
+ Args:
170
+ body (CreateOrganization | Unset):
171
+
172
+ Raises:
173
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
174
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
175
+
176
+ Returns:
177
+ CreateOrganizationErrors | Error | Organization
178
+ """
179
+
180
+ return (
181
+ await asyncio_detailed(
182
+ client=client,
183
+ body=body,
184
+ )
185
+ ).parsed
@@ -0,0 +1 @@
1
+ """Contains endpoint functions for accessing the API"""
@@ -3,6 +3,8 @@
3
3
  from .artifact_response import ArtifactResponse
4
4
  from .blob import Blob
5
5
  from .create_new_job import CreateNewJob
6
+ from .create_organization import CreateOrganization
7
+ from .create_organization_errors import CreateOrganizationErrors
6
8
  from .create_project import CreateProject
7
9
  from .create_remote import CreateRemote
8
10
  from .create_remote_response import CreateRemoteResponse
@@ -16,6 +18,7 @@ from .get_artifact_downloads_response import GetArtifactDownloadsResponse
16
18
  from .job import Job
17
19
  from .last_jobs_response import LastJobsResponse
18
20
  from .list_projects_response import ListProjectsResponse
21
+ from .organization import Organization
19
22
  from .presigned_url import PresignedUrl
20
23
  from .presigned_url_fields import PresignedUrlFields
21
24
  from .project import Project
@@ -39,6 +42,8 @@ __all__ = (
39
42
  "ArtifactResponse",
40
43
  "Blob",
41
44
  "CreateNewJob",
45
+ "CreateOrganization",
46
+ "CreateOrganizationErrors",
42
47
  "CreateProject",
43
48
  "CreateRemote",
44
49
  "CreateRemoteResponse",
@@ -52,6 +57,7 @@ __all__ = (
52
57
  "Job",
53
58
  "LastJobsResponse",
54
59
  "ListProjectsResponse",
60
+ "Organization",
55
61
  "PresignedUrl",
56
62
  "PresignedUrlFields",
57
63
  "Project",
@@ -26,6 +26,8 @@ class CreateNewJob:
26
26
  message (None | str | Unset):
27
27
  commit (None | str | Unset):
28
28
  ref (None | str | Unset):
29
+ extras (None | str | Unset):
30
+ untracked_count (int | None | Unset):
29
31
  project (None | str | Unset):
30
32
  project_id (None | str | Unset):
31
33
  """
@@ -39,6 +41,8 @@ class CreateNewJob:
39
41
  message: None | str | Unset = UNSET
40
42
  commit: None | str | Unset = UNSET
41
43
  ref: None | str | Unset = UNSET
44
+ extras: None | str | Unset = UNSET
45
+ untracked_count: int | None | Unset = UNSET
42
46
  project: None | str | Unset = UNSET
43
47
  project_id: None | str | Unset = UNSET
44
48
 
@@ -73,6 +77,18 @@ class CreateNewJob:
73
77
  else:
74
78
  ref = self.ref
75
79
 
80
+ extras: None | str | Unset
81
+ if isinstance(self.extras, Unset):
82
+ extras = UNSET
83
+ else:
84
+ extras = self.extras
85
+
86
+ untracked_count: int | None | Unset
87
+ if isinstance(self.untracked_count, Unset):
88
+ untracked_count = UNSET
89
+ else:
90
+ untracked_count = self.untracked_count
91
+
76
92
  project: None | str | Unset
77
93
  if isinstance(self.project, Unset):
78
94
  project = UNSET
@@ -104,6 +120,10 @@ class CreateNewJob:
104
120
  field_dict["commit"] = commit
105
121
  if ref is not UNSET:
106
122
  field_dict["ref"] = ref
123
+ if extras is not UNSET:
124
+ field_dict["extras"] = extras
125
+ if untracked_count is not UNSET:
126
+ field_dict["untracked_count"] = untracked_count
107
127
  if project is not UNSET:
108
128
  field_dict["project"] = project
109
129
  if project_id is not UNSET:
@@ -153,6 +173,24 @@ class CreateNewJob:
153
173
 
154
174
  ref = _parse_ref(d.pop("ref", UNSET))
155
175
 
176
+ def _parse_extras(data: object) -> None | str | Unset:
177
+ if data is None:
178
+ return data
179
+ if isinstance(data, Unset):
180
+ return data
181
+ return cast(None | str | Unset, data)
182
+
183
+ extras = _parse_extras(d.pop("extras", UNSET))
184
+
185
+ def _parse_untracked_count(data: object) -> int | None | Unset:
186
+ if data is None:
187
+ return data
188
+ if isinstance(data, Unset):
189
+ return data
190
+ return cast(int | None | Unset, data)
191
+
192
+ untracked_count = _parse_untracked_count(d.pop("untracked_count", UNSET))
193
+
156
194
  def _parse_project(data: object) -> None | str | Unset:
157
195
  if data is None:
158
196
  return data
@@ -181,6 +219,8 @@ class CreateNewJob:
181
219
  message=message,
182
220
  commit=commit,
183
221
  ref=ref,
222
+ extras=extras,
223
+ untracked_count=untracked_count,
184
224
  project=project,
185
225
  project_id=project_id,
186
226
  )
@@ -0,0 +1,51 @@
1
+ from __future__ import annotations
2
+
3
+ from collections.abc import Mapping
4
+ from typing import Any, TypeVar
5
+
6
+ from attrs import define as _attrs_define
7
+
8
+
9
+ T = TypeVar("T", bound="CreateOrganization")
10
+
11
+
12
+ @_attrs_define
13
+ class CreateOrganization:
14
+ """
15
+ Attributes:
16
+ name (str):
17
+ slug (str):
18
+ """
19
+
20
+ name: str
21
+ slug: str
22
+
23
+ def to_dict(self) -> dict[str, Any]:
24
+ name = self.name
25
+
26
+ slug = self.slug
27
+
28
+ field_dict: dict[str, Any] = {}
29
+
30
+ field_dict.update(
31
+ {
32
+ "name": name,
33
+ "slug": slug,
34
+ }
35
+ )
36
+
37
+ return field_dict
38
+
39
+ @classmethod
40
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
41
+ d = dict(src_dict)
42
+ name = d.pop("name")
43
+
44
+ slug = d.pop("slug")
45
+
46
+ create_organization = cls(
47
+ name=name,
48
+ slug=slug,
49
+ )
50
+
51
+ return create_organization
@@ -0,0 +1,46 @@
1
+ from __future__ import annotations
2
+
3
+ from collections.abc import Mapping
4
+ from typing import Any, TypeVar
5
+
6
+ from attrs import define as _attrs_define
7
+
8
+
9
+ from typing import cast
10
+
11
+
12
+ T = TypeVar("T", bound="CreateOrganizationErrors")
13
+
14
+
15
+ @_attrs_define
16
+ class CreateOrganizationErrors:
17
+ """
18
+ Attributes:
19
+ errors (list[str]):
20
+ """
21
+
22
+ errors: list[str]
23
+
24
+ def to_dict(self) -> dict[str, Any]:
25
+ errors = self.errors
26
+
27
+ field_dict: dict[str, Any] = {}
28
+
29
+ field_dict.update(
30
+ {
31
+ "errors": errors,
32
+ }
33
+ )
34
+
35
+ return field_dict
36
+
37
+ @classmethod
38
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
39
+ d = dict(src_dict)
40
+ errors = cast(list[str], d.pop("errors"))
41
+
42
+ create_organization_errors = cls(
43
+ errors=errors,
44
+ )
45
+
46
+ return create_organization_errors