testit-cli 2.10.3__tar.gz → 2.10.4.post600__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 (242) hide show
  1. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/PKG-INFO +92 -1
  2. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/README.md +91 -0
  3. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/setup.py +1 -1
  4. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/custom_attribute_api_result.py +11 -17
  5. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/layer_source.py +5 -4
  6. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/apiclient.py +1 -0
  7. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/click_commands.py +114 -11
  8. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/converter.py +43 -17
  9. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/filter_factory.py +12 -10
  10. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/importer.py +2 -2
  11. testit_cli-2.10.4.post600/src/testit_cli/launch_filter.py +57 -0
  12. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/models/config.py +4 -0
  13. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/service.py +48 -1
  14. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/service_factory.py +3 -1
  15. testit_cli-2.10.4.post600/src/testit_cli/v2_client.py +207 -0
  16. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/validation.py +7 -0
  17. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli.egg-info/PKG-INFO +92 -1
  18. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli.egg-info/SOURCES.txt +5 -0
  19. testit_cli-2.10.4.post600/tests/test_autotest_layer.py +44 -0
  20. testit_cli-2.10.4.post600/tests/test_launch.py +204 -0
  21. testit_cli-2.10.4.post600/tests/test_launch_filter.py +68 -0
  22. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/LICENSE +0 -0
  23. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/setup.cfg +0 -0
  24. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/__init__.py +0 -0
  25. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/__main__.py +0 -0
  26. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/__init__.py +0 -0
  27. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/api/__init__.py +0 -0
  28. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/api/attachments_api.py +0 -0
  29. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/api/auto_tests_api.py +0 -0
  30. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/api/configurations_api.py +0 -0
  31. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/api/custom_attributes_api.py +0 -0
  32. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/api/parameters_api.py +0 -0
  33. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/api/project_attributes_api.py +0 -0
  34. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/api/project_sections_api.py +0 -0
  35. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/api/project_work_items_api.py +0 -0
  36. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/api/projects_api.py +0 -0
  37. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/api/sections_api.py +0 -0
  38. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/api/test_results_api.py +0 -0
  39. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/api/test_runs_api.py +0 -0
  40. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/api/work_items_api.py +0 -0
  41. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/api/workflows_api.py +0 -0
  42. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/api_client.py +0 -0
  43. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/apis/__init__.py +0 -0
  44. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/configuration.py +0 -0
  45. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/exceptions.py +0 -0
  46. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/__init__.py +0 -0
  47. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/adapters_auto_tests_id_work_items_post_request.py +0 -0
  48. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/adapters_auto_tests_post_request.py +0 -0
  49. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/adapters_auto_tests_put_request.py +0 -0
  50. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/adapters_auto_tests_search_post_request.py +0 -0
  51. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/adapters_configurations_search_post_request.py +0 -0
  52. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/adapters_custom_attributes_global_id_put_request.py +0 -0
  53. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/adapters_custom_attributes_global_post_request.py +0 -0
  54. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/adapters_custom_attributes_search_post_request.py +0 -0
  55. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/adapters_parameters_post_request.py +0 -0
  56. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/adapters_parameters_search_post_request.py +0 -0
  57. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/adapters_projects_post_request.py +0 -0
  58. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/adapters_projects_project_id_attributes_put_request.py +0 -0
  59. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/adapters_projects_project_id_attributes_search_post_request.py +0 -0
  60. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/adapters_projects_project_id_work_items_search_post_request.py +0 -0
  61. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/adapters_projects_search_post_request.py +0 -0
  62. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/adapters_sections_post_request.py +0 -0
  63. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/adapters_test_results_id_put_request.py +0 -0
  64. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/adapters_test_results_search_post_request.py +0 -0
  65. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/adapters_test_runs_id_reruns_post_request.py +0 -0
  66. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/adapters_test_runs_post_request.py +0 -0
  67. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/adapters_test_runs_put_request.py +0 -0
  68. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/adapters_work_items_post_request.py +0 -0
  69. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/assign_attachment_api_model.py +0 -0
  70. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/assign_auto_test_case_id_api_model.py +0 -0
  71. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/assign_iteration_api_model.py +0 -0
  72. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/attachment_api_result.py +0 -0
  73. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/attachment_model.py +0 -0
  74. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/attachment_put_model.py +0 -0
  75. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/attachment_put_model_auto_test_step_results_model.py +0 -0
  76. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/attachment_update_request.py +0 -0
  77. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/auto_test.py +0 -0
  78. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/auto_test_api_result.py +0 -0
  79. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/auto_test_api_result_layer.py +0 -0
  80. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/auto_test_case_api_model.py +0 -0
  81. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/auto_test_create_api_model.py +0 -0
  82. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/auto_test_create_api_model_layer.py +0 -0
  83. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/auto_test_filter_api_model.py +0 -0
  84. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/auto_test_id_model.py +0 -0
  85. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/auto_test_model.py +0 -0
  86. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/auto_test_model_last_test_result_configuration.py +0 -0
  87. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/auto_test_model_last_test_result_status.py +0 -0
  88. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/auto_test_result_reason_short.py +0 -0
  89. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/auto_test_results_for_test_run_model.py +0 -0
  90. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/auto_test_search_api_model.py +0 -0
  91. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/auto_test_search_api_model_filter.py +0 -0
  92. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/auto_test_search_api_model_includes.py +0 -0
  93. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/auto_test_search_include_api_model.py +0 -0
  94. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/auto_test_step.py +0 -0
  95. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/auto_test_step_api_model.py +0 -0
  96. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/auto_test_step_api_result.py +0 -0
  97. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/auto_test_step_model.py +0 -0
  98. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/auto_test_step_result.py +0 -0
  99. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/auto_test_step_result_update_request.py +0 -0
  100. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/auto_test_update_api_model.py +0 -0
  101. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/auto_test_work_item_identifier_api_result.py +0 -0
  102. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/available_test_result_outcome.py +0 -0
  103. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/configuration_filter_model.py +0 -0
  104. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/configuration_model.py +0 -0
  105. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/configuration_short_model.py +0 -0
  106. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/create_empty_test_run_api_model.py +0 -0
  107. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/create_link_api_model.py +0 -0
  108. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/create_parameter_api_model.py +0 -0
  109. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/create_project_api_model.py +0 -0
  110. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/create_step_api_model.py +0 -0
  111. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/create_work_item_api_model.py +0 -0
  112. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/custom_attribute_model.py +0 -0
  113. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/custom_attribute_option_api_result.py +0 -0
  114. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/custom_attribute_option_model.py +0 -0
  115. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/custom_attribute_option_post_api_model.py +0 -0
  116. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/custom_attribute_option_update_api_model.py +0 -0
  117. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/custom_attribute_put_model.py +0 -0
  118. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/custom_attribute_search_api_model.py +0 -0
  119. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/custom_attribute_search_api_result.py +0 -0
  120. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/custom_attribute_type.py +0 -0
  121. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/custom_attribute_types_enum.py +0 -0
  122. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/date_time_range_selector_model.py +0 -0
  123. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/deletion_state.py +0 -0
  124. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/detailed_project_api_result.py +0 -0
  125. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/detailed_project_api_result_workflow.py +0 -0
  126. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/failure_category_model.py +0 -0
  127. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/global_custom_attribute_post_api_model.py +0 -0
  128. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/global_custom_attribute_update_api_model.py +0 -0
  129. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/guid_extraction_model.py +0 -0
  130. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/image_resize_type.py +0 -0
  131. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/int32_range_selector_model.py +0 -0
  132. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/int64_range_selector_model.py +0 -0
  133. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/iteration_api_result.py +0 -0
  134. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/iteration_model.py +0 -0
  135. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/label_api_model.py +0 -0
  136. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/label_api_result.py +0 -0
  137. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/label_short_model.py +0 -0
  138. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/layer_api_model.py +0 -0
  139. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/layer_api_result.py +0 -0
  140. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/link_api_result.py +0 -0
  141. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/link_create_api_model.py +0 -0
  142. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/link_model.py +0 -0
  143. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/link_post_model.py +0 -0
  144. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/link_put_model.py +0 -0
  145. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/link_short_api_result.py +0 -0
  146. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/link_type.py +0 -0
  147. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/link_update_api_model.py +0 -0
  148. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/manual_rerun_api_result.py +0 -0
  149. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/manual_rerun_select_test_results_api_model.py +0 -0
  150. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/manual_rerun_select_test_results_api_model_extraction_model.py +0 -0
  151. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/manual_rerun_select_test_results_api_model_filter.py +0 -0
  152. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/manual_rerun_test_result_api_model.py +0 -0
  153. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/manual_rerun_test_result_api_model_test_result_ids.py +0 -0
  154. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/operation.py +0 -0
  155. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/parameter_api_result.py +0 -0
  156. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/parameter_iteration_model.py +0 -0
  157. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/parameter_short_api_result.py +0 -0
  158. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/parameter_short_model.py +0 -0
  159. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/parameters_filter_api_model.py +0 -0
  160. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/problem_details.py +0 -0
  161. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/project_api_result.py +0 -0
  162. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/project_attributes_filter_model.py +0 -0
  163. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/project_shortest_api_result.py +0 -0
  164. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/project_type_model.py +0 -0
  165. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/projects_filter_model.py +0 -0
  166. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/projects_filter_model_autotests_count.py +0 -0
  167. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/projects_filter_model_checklists_count.py +0 -0
  168. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/projects_filter_model_created_date.py +0 -0
  169. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/projects_filter_model_shared_steps_count.py +0 -0
  170. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/projects_filter_model_test_cases_count.py +0 -0
  171. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/section_model.py +0 -0
  172. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/section_post_model.py +0 -0
  173. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/section_shared_step.py +0 -0
  174. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/section_with_steps_model.py +0 -0
  175. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/shared_step_model.py +0 -0
  176. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/shared_step_result_api_model.py +0 -0
  177. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/step_comment_api_model.py +0 -0
  178. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/step_model.py +0 -0
  179. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/step_post_model.py +0 -0
  180. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/step_result_api_model.py +0 -0
  181. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/tag_model.py +0 -0
  182. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/test_result_link_api_result.py +0 -0
  183. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/test_result_outcome.py +0 -0
  184. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/test_result_response.py +0 -0
  185. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/test_result_short_response.py +0 -0
  186. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/test_result_short_response_status.py +0 -0
  187. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/test_result_step_comment_update_request.py +0 -0
  188. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/test_result_update_request.py +0 -0
  189. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/test_results_filter_api_model.py +0 -0
  190. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/test_results_filter_api_model_duration.py +0 -0
  191. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/test_run_api_result.py +0 -0
  192. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/test_run_api_result_status.py +0 -0
  193. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/test_run_state.py +0 -0
  194. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/test_status_api_result.py +0 -0
  195. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/test_status_api_type.py +0 -0
  196. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/test_status_model.py +0 -0
  197. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/test_status_type.py +0 -0
  198. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/update_empty_test_run_api_model.py +0 -0
  199. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/update_link_api_model.py +0 -0
  200. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/validation_problem_details.py +0 -0
  201. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/work_item_api_result.py +0 -0
  202. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/work_item_entity_type_api_model.py +0 -0
  203. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/work_item_filter_api_model.py +0 -0
  204. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/work_item_filter_api_model_duration.py +0 -0
  205. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/work_item_id_api_model.py +0 -0
  206. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/work_item_parameter_key_api_model.py +0 -0
  207. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/work_item_parameter_key_api_result.py +0 -0
  208. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/work_item_priority_api_model.py +0 -0
  209. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/work_item_priority_model.py +0 -0
  210. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/work_item_select_api_model.py +0 -0
  211. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/work_item_select_api_model_filter.py +0 -0
  212. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/work_item_short_api_result.py +0 -0
  213. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/work_item_source_type_model.py +0 -0
  214. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/work_item_state_api_model.py +0 -0
  215. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/work_item_states.py +0 -0
  216. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/work_item_type_model.py +0 -0
  217. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/workflow_api_result.py +0 -0
  218. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model/workflow_status_api_result.py +0 -0
  219. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/model_utils.py +0 -0
  220. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/models/__init__.py +0 -0
  221. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/adapters_api/rest.py +0 -0
  222. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/autotests_filter.py +0 -0
  223. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/dir_worker.py +0 -0
  224. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/file_worker.py +0 -0
  225. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/html_escape_utils.py +0 -0
  226. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/http_retry.py +0 -0
  227. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/logger.py +0 -0
  228. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/models/__init__.py +0 -0
  229. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/models/mode.py +0 -0
  230. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/models/status_type.py +0 -0
  231. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/models/testcase.py +0 -0
  232. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/models/testrun.py +0 -0
  233. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/models/testrun_link.py +0 -0
  234. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/parser.py +0 -0
  235. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli/testrun_metadata.py +0 -0
  236. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli.egg-info/dependency_links.txt +0 -0
  237. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli.egg-info/entry_points.txt +0 -0
  238. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli.egg-info/requires.txt +0 -0
  239. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/src/testit_cli.egg-info/top_level.txt +0 -0
  240. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/tests/test_click.py +0 -0
  241. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/tests/test_service.py +0 -0
  242. {testit_cli-2.10.3 → testit_cli-2.10.4.post600}/tests/test_testrun_metadata.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: testit-cli
3
- Version: 2.10.3
3
+ Version: 2.10.4.post600
4
4
  Summary: This tool is the command line wrapper of Test IT allowing you to upload the test results in real time to Test IT
5
5
  Home-page: https://pypi.org/project/testit-cli/
6
6
  Author: Integration team
@@ -59,12 +59,75 @@ You can see more information in [official documentation](https://docs.testit.sof
59
59
  | 5.6 | 2.8.1.post560 |
60
60
  | 5.7 | 2.9.1.post570 |
61
61
  | 5.8 | 2.10.0.post580 |
62
+ | 6.0 | 2.10.4.post600 |
62
63
  | Cloud | 2.8.0 + |
63
64
 
64
65
  1. For current versions, see the releases tab.
65
66
  2. Starting with 5.2, we have added a TMS postscript, which means that the utility is compatible with a specific enterprise version.
66
67
  3. If you are in doubt about which version to use, check with the support staff. support@yoonion.ru
67
68
 
69
+ ## Launch a filled test run (`testrun create launch`)
70
+
71
+ Unlike `testrun create` (empty run), `testrun create launch` creates a **filled** test run.
72
+
73
+ Provide **exactly one** source:
74
+
75
+ | Source | Flag | Behaviour |
76
+ |-------------------|----------------------------------------|---------------------------------------------------|
77
+ | Test plan | `--test-plan-id` / `-tpi` | Search automated test points in the TMS test plan |
78
+ | Tags | `--filter tags=smoke,nightly` | Search autotests in TMS |
79
+ | External IDs file | `--autotest-external-ids-file` / `-af` | One external ID per line in file |
80
+
81
+ Required: `--url`, `--token`, `--project-id`, `--configuration-id`. Optional: `--testrun-name`, `--output` (also write ID to a file).
82
+
83
+ The command prints `testRunId` to **stdout** (suitable for `export TMS_TEST_RUN_ID=$(...)`).
84
+
85
+ ```bash
86
+ export TMS_TEST_RUN_ID=$(testit testrun create launch \
87
+ --url "$TMS_URL" \
88
+ --token "$TMS_TOKEN" \
89
+ --project-id "$TMS_PROJECT_ID" \
90
+ --configuration-id "$TMS_CONFIGURATION_ID" \
91
+ --filter tags=smoke \
92
+ --testrun-name "CI smoke")
93
+ ```
94
+
95
+ From a test plan:
96
+
97
+ ```bash
98
+ testit testrun create launch \
99
+ -u "$TMS_URL" -t "$TMS_TOKEN" \
100
+ -pi "$TMS_PROJECT_ID" -ci "$TMS_CONFIGURATION_ID" \
101
+ --test-plan-id "$TMS_TEST_PLAN_ID" \
102
+ -o ./testrun.id
103
+ ```
104
+
105
+ ### Autotest external IDs file
106
+
107
+ `--autotest-external-ids-file` / `-af` expects a plain-text file of **autotest external IDs** (the same values as in TMS / `autoTestExternalIds`, not internal UUIDs or global IDs):
108
+
109
+ - one external ID per line;
110
+ - empty lines are ignored;
111
+ - lines starting with `#` are comments;
112
+ - duplicate IDs are ignored.
113
+
114
+ Example `autotest-external-ids.txt`:
115
+
116
+ ```text
117
+ # smoke suite
118
+ login-test-ext-id
119
+ checkout-test-ext-id
120
+
121
+ payment-test-ext-id
122
+ ```
123
+
124
+ ```bash
125
+ testit testrun create launch \
126
+ -u "$TMS_URL" -t "$TMS_TOKEN" \
127
+ -pi "$TMS_PROJECT_ID" -ci "$TMS_CONFIGURATION_ID" \
128
+ -af ./autotest-external-ids.txt
129
+ ```
130
+
68
131
  ## Test run tags and links
69
132
 
70
133
  You can attach **test run** tags and links (for example a CI job URL) via CLI flags or environment variables.
@@ -145,3 +208,31 @@ Notes:
145
208
  - Test run tags/links are independent from autotest/result tags and links.
146
209
  - On an existing run, new tags/links are **merged** (existing values are kept; duplicates by tag name / link URL are skipped).
147
210
  - Empty or omitted values mean “do not change tags/links”.
211
+
212
+ ## Autotest layer (test pyramid)
213
+
214
+ When importing XML results, CLI can set the **autotest** pyramid layer for every upserted autotest (create/update).
215
+ This is a **run-level default** for file-based import; adapters still read layer from test code annotations.
216
+
217
+ | Intent | CLI | Env |
218
+ |--------|-----|-----|
219
+ | Default autotest layer | `--autotest-layer` / `-al` | `TMS_AUTOTEST_LAYER` |
220
+
221
+ Supported commands: `results import`, `results upload`.
222
+
223
+ Recommended values: `E2E`, `UI`, `API`, `Contract`, `Integration`, `Component`, `Unit`. Any other non-empty string is accepted.
224
+
225
+ ```bash
226
+ export TMS_AUTOTEST_LAYER=API
227
+ testit results import \
228
+ --url "$TMS_URL" \
229
+ --token "$TMS_TOKEN" \
230
+ --project-id "$TMS_PROJECT_ID" \
231
+ --configuration-id "$TMS_CONFIGURATION_ID" \
232
+ --results ./results
233
+ ```
234
+
235
+ Behaviour (aligned with adapters API):
236
+
237
+ - Layer set → send `layer: { name, source: Run }` on create/update.
238
+ - Layer not set → do not send `layer`; on update always send `resetLayer: false`.
@@ -25,12 +25,75 @@ You can see more information in [official documentation](https://docs.testit.sof
25
25
  | 5.6 | 2.8.1.post560 |
26
26
  | 5.7 | 2.9.1.post570 |
27
27
  | 5.8 | 2.10.0.post580 |
28
+ | 6.0 | 2.10.4.post600 |
28
29
  | Cloud | 2.8.0 + |
29
30
 
30
31
  1. For current versions, see the releases tab.
31
32
  2. Starting with 5.2, we have added a TMS postscript, which means that the utility is compatible with a specific enterprise version.
32
33
  3. If you are in doubt about which version to use, check with the support staff. support@yoonion.ru
33
34
 
35
+ ## Launch a filled test run (`testrun create launch`)
36
+
37
+ Unlike `testrun create` (empty run), `testrun create launch` creates a **filled** test run.
38
+
39
+ Provide **exactly one** source:
40
+
41
+ | Source | Flag | Behaviour |
42
+ |-------------------|----------------------------------------|---------------------------------------------------|
43
+ | Test plan | `--test-plan-id` / `-tpi` | Search automated test points in the TMS test plan |
44
+ | Tags | `--filter tags=smoke,nightly` | Search autotests in TMS |
45
+ | External IDs file | `--autotest-external-ids-file` / `-af` | One external ID per line in file |
46
+
47
+ Required: `--url`, `--token`, `--project-id`, `--configuration-id`. Optional: `--testrun-name`, `--output` (also write ID to a file).
48
+
49
+ The command prints `testRunId` to **stdout** (suitable for `export TMS_TEST_RUN_ID=$(...)`).
50
+
51
+ ```bash
52
+ export TMS_TEST_RUN_ID=$(testit testrun create launch \
53
+ --url "$TMS_URL" \
54
+ --token "$TMS_TOKEN" \
55
+ --project-id "$TMS_PROJECT_ID" \
56
+ --configuration-id "$TMS_CONFIGURATION_ID" \
57
+ --filter tags=smoke \
58
+ --testrun-name "CI smoke")
59
+ ```
60
+
61
+ From a test plan:
62
+
63
+ ```bash
64
+ testit testrun create launch \
65
+ -u "$TMS_URL" -t "$TMS_TOKEN" \
66
+ -pi "$TMS_PROJECT_ID" -ci "$TMS_CONFIGURATION_ID" \
67
+ --test-plan-id "$TMS_TEST_PLAN_ID" \
68
+ -o ./testrun.id
69
+ ```
70
+
71
+ ### Autotest external IDs file
72
+
73
+ `--autotest-external-ids-file` / `-af` expects a plain-text file of **autotest external IDs** (the same values as in TMS / `autoTestExternalIds`, not internal UUIDs or global IDs):
74
+
75
+ - one external ID per line;
76
+ - empty lines are ignored;
77
+ - lines starting with `#` are comments;
78
+ - duplicate IDs are ignored.
79
+
80
+ Example `autotest-external-ids.txt`:
81
+
82
+ ```text
83
+ # smoke suite
84
+ login-test-ext-id
85
+ checkout-test-ext-id
86
+
87
+ payment-test-ext-id
88
+ ```
89
+
90
+ ```bash
91
+ testit testrun create launch \
92
+ -u "$TMS_URL" -t "$TMS_TOKEN" \
93
+ -pi "$TMS_PROJECT_ID" -ci "$TMS_CONFIGURATION_ID" \
94
+ -af ./autotest-external-ids.txt
95
+ ```
96
+
34
97
  ## Test run tags and links
35
98
 
36
99
  You can attach **test run** tags and links (for example a CI job URL) via CLI flags or environment variables.
@@ -111,3 +174,31 @@ Notes:
111
174
  - Test run tags/links are independent from autotest/result tags and links.
112
175
  - On an existing run, new tags/links are **merged** (existing values are kept; duplicates by tag name / link URL are skipped).
113
176
  - Empty or omitted values mean “do not change tags/links”.
177
+
178
+ ## Autotest layer (test pyramid)
179
+
180
+ When importing XML results, CLI can set the **autotest** pyramid layer for every upserted autotest (create/update).
181
+ This is a **run-level default** for file-based import; adapters still read layer from test code annotations.
182
+
183
+ | Intent | CLI | Env |
184
+ |--------|-----|-----|
185
+ | Default autotest layer | `--autotest-layer` / `-al` | `TMS_AUTOTEST_LAYER` |
186
+
187
+ Supported commands: `results import`, `results upload`.
188
+
189
+ Recommended values: `E2E`, `UI`, `API`, `Contract`, `Integration`, `Component`, `Unit`. Any other non-empty string is accepted.
190
+
191
+ ```bash
192
+ export TMS_AUTOTEST_LAYER=API
193
+ testit results import \
194
+ --url "$TMS_URL" \
195
+ --token "$TMS_TOKEN" \
196
+ --project-id "$TMS_PROJECT_ID" \
197
+ --configuration-id "$TMS_CONFIGURATION_ID" \
198
+ --results ./results
199
+ ```
200
+
201
+ Behaviour (aligned with adapters API):
202
+
203
+ - Layer set → send `layer: { name, source: Run }` on create/update.
204
+ - Layer not set → do not send `layer`; on update always send `resetLayer: false`.
@@ -1,6 +1,6 @@
1
1
  from setuptools import find_packages, setup
2
2
 
3
- VERSION = "2.10.3"
3
+ VERSION = "2.10.4.post600"
4
4
 
5
5
  ADAPTERS_ROOT = "src/testit_cli/adapters_api"
6
6
  ADAPTERS_PACKAGES = ["adapters_api"] + [
@@ -90,9 +90,9 @@ class CustomAttributeApiResult(ModelNormal):
90
90
  'is_enabled': (bool,), # noqa: E501
91
91
  'is_required': (bool,), # noqa: E501
92
92
  'is_global': (bool,), # noqa: E501
93
- 'is_read_only': (bool, none_type,), # noqa: E501
94
- 'is_system': (bool, none_type,), # noqa: E501
95
- 'targets': ([str], none_type,), # noqa: E501
93
+ 'is_read_only': (bool,), # noqa: E501
94
+ 'is_system': (bool,), # noqa: E501
95
+ 'targets': ([str],), # noqa: E501
96
96
  'code': (str, none_type,), # noqa: E501
97
97
  }
98
98
 
@@ -123,7 +123,7 @@ class CustomAttributeApiResult(ModelNormal):
123
123
 
124
124
  @classmethod
125
125
  @convert_js_args_to_python_args
126
- def _from_openapi_data(cls, id, options, type, is_deleted, name, is_enabled, is_required, is_global, *args, **kwargs): # noqa: E501
126
+ def _from_openapi_data(cls, id, options, type, is_deleted, name, is_enabled, is_required, is_global, is_read_only, is_system, targets, *args, **kwargs): # noqa: E501
127
127
  """CustomAttributeApiResult - a model defined in OpenAPI
128
128
 
129
129
  Args:
@@ -135,11 +135,11 @@ class CustomAttributeApiResult(ModelNormal):
135
135
  is_enabled (bool): Indicates if the attribute is enabled
136
136
  is_required (bool): Indicates if the attribute value is mandatory to specify
137
137
  is_global (bool): Indicates if the attribute is available across all projects
138
+ is_read_only (bool): Indicates if the attribute is read-only
139
+ is_system (bool): Indicates if the attribute is system
140
+ targets ([str]): Collection of the attribute targets Defines where the attribute can be used (e.g., TestCases, AutoTestCases, TestPlans)
138
141
 
139
142
  Keyword Args:
140
- is_read_only (bool): Indicates if the attribute is read-only. [optional] # noqa: E501
141
- is_system (bool): Indicates if the attribute is system. [optional] # noqa: E501
142
- targets ([str]): Collection of the attribute targets. [optional] # noqa: E501
143
143
  _check_type (bool): if True, values for parameters in openapi_types
144
144
  will be type checked and a TypeError will be
145
145
  raised if the wrong type is input.
@@ -178,9 +178,6 @@ class CustomAttributeApiResult(ModelNormal):
178
178
  _path_to_item = kwargs.pop('_path_to_item', ())
179
179
  _configuration = kwargs.pop('_configuration', None)
180
180
  _visited_composed_classes = kwargs.pop('_visited_composed_classes', ())
181
- is_read_only = kwargs.pop('is_read_only', False)
182
- is_system = kwargs.pop('is_system', False)
183
- targets = kwargs.pop('targets', None)
184
181
 
185
182
  self = super(OpenApiModel, cls).__new__(cls)
186
183
 
@@ -236,7 +233,7 @@ class CustomAttributeApiResult(ModelNormal):
236
233
  ])
237
234
 
238
235
  @convert_js_args_to_python_args
239
- def __init__(self, id, options, type, is_deleted, name, is_enabled, is_required, is_global, *args, **kwargs): # noqa: E501
236
+ def __init__(self, id, options, type, is_deleted, name, is_enabled, is_required, is_global, is_read_only, is_system, targets, *args, **kwargs): # noqa: E501
240
237
  """CustomAttributeApiResult - a model defined in OpenAPI
241
238
 
242
239
  Args:
@@ -248,11 +245,11 @@ class CustomAttributeApiResult(ModelNormal):
248
245
  is_enabled (bool): Indicates if the attribute is enabled
249
246
  is_required (bool): Indicates if the attribute value is mandatory to specify
250
247
  is_global (bool): Indicates if the attribute is available across all projects
248
+ is_read_only (bool): Indicates if the attribute is read-only
249
+ is_system (bool): Indicates if the attribute is system
250
+ targets ([str]): Collection of the attribute targets Defines where the attribute can be used (e.g., TestCases, AutoTestCases, TestPlans)
251
251
 
252
252
  Keyword Args:
253
- is_read_only (bool): Indicates if the attribute is read-only. [optional] # noqa: E501
254
- is_system (bool): Indicates if the attribute is system. [optional] # noqa: E501
255
- targets ([str]): Collection of the attribute targets. [optional] # noqa: E501
256
253
  _check_type (bool): if True, values for parameters in openapi_types
257
254
  will be type checked and a TypeError will be
258
255
  raised if the wrong type is input.
@@ -291,9 +288,6 @@ class CustomAttributeApiResult(ModelNormal):
291
288
  _path_to_item = kwargs.pop('_path_to_item', ())
292
289
  _configuration = kwargs.pop('_configuration', None)
293
290
  _visited_composed_classes = kwargs.pop('_visited_composed_classes', ())
294
- is_read_only = kwargs.pop('is_read_only', False)
295
- is_system = kwargs.pop('is_system', False)
296
- targets = kwargs.pop('targets', None)
297
291
 
298
292
  if args:
299
293
  for arg in args:
@@ -53,6 +53,7 @@ class LayerSource(ModelSimple):
53
53
  allowed_values = {
54
54
  ('value',): {
55
55
  'MANUAL': "Manual",
56
+ 'REPORT': "Report",
56
57
  'RUN': "Run",
57
58
  'RULE': "Rule",
58
59
  },
@@ -106,10 +107,10 @@ class LayerSource(ModelSimple):
106
107
  Note that value can be passed either in args or in kwargs, but not in both.
107
108
 
108
109
  Args:
109
- args[0] (str):, must be one of ["Manual", "Run", "Rule", ] # noqa: E501
110
+ args[0] (str):, must be one of ["Manual", "Report", "Run", "Rule", ] # noqa: E501
110
111
 
111
112
  Keyword Args:
112
- value (str):, must be one of ["Manual", "Run", "Rule", ] # noqa: E501
113
+ value (str):, must be one of ["Manual", "Report", "Run", "Rule", ] # noqa: E501
113
114
  _check_type (bool): if True, values for parameters in openapi_types
114
115
  will be type checked and a TypeError will be
115
116
  raised if the wrong type is input.
@@ -200,10 +201,10 @@ class LayerSource(ModelSimple):
200
201
  Note that value can be passed either in args or in kwargs, but not in both.
201
202
 
202
203
  Args:
203
- args[0] (str):, must be one of ["Manual", "Run", "Rule", ] # noqa: E501
204
+ args[0] (str):, must be one of ["Manual", "Report", "Run", "Rule", ] # noqa: E501
204
205
 
205
206
  Keyword Args:
206
- value (str):, must be one of ["Manual", "Run", "Rule", ] # noqa: E501
207
+ value (str):, must be one of ["Manual", "Report", "Run", "Rule", ] # noqa: E501
207
208
  _check_type (bool): if True, values for parameters in openapi_types
208
209
  will be type checked and a TypeError will be
209
210
  raised if the wrong type is input.
@@ -212,6 +212,7 @@ class ApiClient:
212
212
  def update_autotest(self, model: AdaptersAutoTestsPutRequest) -> None:
213
213
  """Function updates autotest"""
214
214
  try:
215
+ model.reset_layer = False
215
216
  escaped_model: AdaptersAutoTestsPutRequest = HtmlEscapeUtils.escape_html_in_object(model)
216
217
 
217
218
  logging.debug(f"Updating autotest {escaped_model}")
@@ -1,11 +1,13 @@
1
+ import typing
1
2
  from itertools import chain
2
3
 
3
4
  import click
4
5
 
6
+ from .launch_filter import LaunchFilterError, parse_launch_filter, read_autotest_external_ids_file
5
7
  from .models.config import Config
6
8
  from .service_factory import ServiceFactory
7
9
  from .testrun_metadata import parse_testrun_links, parse_testrun_tags
8
- from .validation import validate_url, validate_uuid
10
+ from .validation import validate_url, validate_url_optional, validate_uuid
9
11
 
10
12
 
11
13
  @click.group()
@@ -71,6 +73,16 @@ _TESTRUN_LINKS_HELP = (
71
73
  '([{"url":"https://ci.example/jobs/1","title":"CI Job","type":"Related"}]). '
72
74
  "Types: Related, BlockedBy, Defect, Issue, Requirement, Repository"
73
75
  )
76
+ _AUTOTEST_LAYER_HELP = (
77
+ "Default autotest pyramid layer for all imported tests "
78
+ "(E2E, UI, API, Contract, Integration, Component, Unit, or any string)"
79
+ )
80
+
81
+
82
+ def _parse_autotest_layer(raw: typing.Optional[str]) -> typing.Optional[str]:
83
+ if raw is None or not str(raw).strip():
84
+ return None
85
+ return str(raw).strip()
74
86
 
75
87
 
76
88
  @results.command("upload")
@@ -88,7 +100,8 @@ _TESTRUN_LINKS_HELP = (
88
100
  @click.option("-d", "--debug", is_flag=True, help="Set debug logs")
89
101
  @click.option("-dcv", "--disable-cert-validation", is_flag=True, help="Disables certificate validation")
90
102
  @click.option("-iff", "--ignore-flaky-failure", is_flag=True, help="Ignore status flakyFailure in results")
91
- def upload_results(url, token, configuration_id, testrun_id, testruntags, testrunlinks, separator, namespace, classname, results, debug, attachments, disable_cert_validation, ignore_flaky_failure):
103
+ @click.option("-al", "--autotest-layer", type=str, envvar='TMS_AUTOTEST_LAYER', default=None, help=_AUTOTEST_LAYER_HELP)
104
+ def upload_results(url, token, configuration_id, testrun_id, testruntags, testrunlinks, separator, namespace, classname, results, debug, attachments, disable_cert_validation, ignore_flaky_failure, autotest_layer):
92
105
  """Uploading results from different streams"""
93
106
  config = Config(
94
107
  url=url,
@@ -105,6 +118,7 @@ def upload_results(url, token, configuration_id, testrun_id, testruntags, testru
105
118
  paths_to_attachments=list(chain.from_iterable(attachments)),
106
119
  disable_cert_validation=disable_cert_validation,
107
120
  ignore_flaky_failure=ignore_flaky_failure,
121
+ autotest_layer=_parse_autotest_layer(autotest_layer),
108
122
  )
109
123
  service = ServiceFactory().get(config)
110
124
 
@@ -128,8 +142,9 @@ def upload_results(url, token, configuration_id, testrun_id, testruntags, testru
128
142
  @click.option("-d", "--debug", is_flag=True, help="Set debug logs")
129
143
  @click.option("-dcv", "--disable-cert-validation", is_flag=True, help="Disables certificate validation")
130
144
  @click.option("-iff", "--ignore-flaky-failure", is_flag=True, help="Ignore status flakyFailure in results")
145
+ @click.option("-al", "--autotest-layer", type=str, envvar='TMS_AUTOTEST_LAYER', default=None, help=_AUTOTEST_LAYER_HELP)
131
146
  def import_results(url, token, project_id, configuration_id, testrun_id, testrun_name, testruntags, testrunlinks, separator, namespace, classname, results, debug,
132
- attachments, disable_cert_validation, ignore_flaky_failure):
147
+ attachments, disable_cert_validation, ignore_flaky_failure, autotest_layer):
133
148
  """Uploading the first test results"""
134
149
  if testrun_id is not None and testrun_name is not None:
135
150
  click.echo("Illegal usage: `{}` are mutually exclusive arguments.".format(', '.join(["--testrun-id", "--testrun-name"])), err=True)
@@ -151,6 +166,7 @@ def import_results(url, token, project_id, configuration_id, testrun_id, testrun
151
166
  paths_to_attachments=list(chain.from_iterable(attachments)),
152
167
  disable_cert_validation=disable_cert_validation,
153
168
  ignore_flaky_failure=ignore_flaky_failure,
169
+ autotest_layer=_parse_autotest_layer(autotest_layer),
154
170
  )
155
171
  service = ServiceFactory().get(config)
156
172
 
@@ -163,19 +179,71 @@ def testrun():
163
179
  pass
164
180
 
165
181
 
166
- @testrun.command("create")
167
- @click.option("-u", "--url", type=str, envvar='TMS_URL', required=True, help="Set url address of the Test IT instance (https://demo.testit.software)", callback=validate_url)
168
- @click.option("-t", "--token", type=str, envvar='TMS_TOKEN', required=True, help="Set API token (T2lKd2pLZGI4WHRhaVZUejNl)")
169
- @click.option("-pi", "--project-id", type=str, envvar='TMS_PROJECT_ID', required=True, help="Set project id (5236eb3f-7c05-46f9-a609-dc0278896464)", callback=validate_uuid)
170
- @click.option("-tn", "--testrun-name", type=str, envvar='TMS_TEST_RUN_NAME', help="Set test run name (TestRun01)", default=None)
182
+ def _require_create_options(**required_options):
183
+ """Validate empty-create required options when no subcommand is invoked."""
184
+ for flag, value in required_options.items():
185
+ if value is None or value == "":
186
+ raise click.UsageError(f"Missing option '{flag}'.")
187
+
188
+
189
+ def _require_exactly_one_launch_source(
190
+ test_plan_id: typing.Optional[str],
191
+ launch_filter: typing.Optional[str],
192
+ autotest_external_ids_file: typing.Optional[str],
193
+ ) -> None:
194
+ sources = [
195
+ bool(test_plan_id),
196
+ bool(launch_filter),
197
+ bool(autotest_external_ids_file),
198
+ ]
199
+ if sum(sources) != 1:
200
+ raise click.UsageError(
201
+ "Provide exactly one of: --test-plan-id, --filter, or --autotest-external-ids-file"
202
+ )
203
+
204
+
205
+ def _parse_launch_tags(launch_filter: typing.Optional[str]) -> typing.Optional[typing.List[str]]:
206
+ if not launch_filter:
207
+ return None
208
+ try:
209
+ return parse_launch_filter(launch_filter)
210
+ except LaunchFilterError as exc:
211
+ raise click.BadParameter(str(exc), param_hint="--filter") from exc
212
+
213
+
214
+ def _load_autotest_external_ids(path: typing.Optional[str]) -> typing.Optional[typing.List[str]]:
215
+ if not path:
216
+ return None
217
+ autotest_external_ids = read_autotest_external_ids_file(path)
218
+ if not autotest_external_ids:
219
+ raise click.BadParameter(
220
+ "Autotest external ids file is empty (no external IDs)",
221
+ param_hint="--autotest-external-ids-file",
222
+ )
223
+ return autotest_external_ids
224
+
225
+
226
+ @testrun.group("create", invoke_without_command=True)
227
+ @click.pass_context
228
+ @click.option("-u", "--url", type=str, envvar='TMS_URL', default=None, help="Set url address of the Test IT instance (https://demo.testit.software)", callback=validate_url_optional)
229
+ @click.option("-t", "--token", type=str, envvar='TMS_TOKEN', default=None, help="Set API token (T2lKd2pLZGI4WHRhaVZUejNl)")
230
+ @click.option("-pi", "--project-id", type=str, envvar='TMS_PROJECT_ID', default=None, help="Set project id (5236eb3f-7c05-46f9-a609-dc0278896464)", callback=validate_uuid)
231
+ @click.option("-tn", "--testrun-name", type=str, envvar='TMS_TEST_RUN_NAME', default=None, help="Set test run name (TestRun01)")
171
232
  @click.option("-trt", "--testruntags", type=str, envvar='TMS_TEST_RUN_TAGS', default=None, help=_TESTRUN_TAGS_HELP)
172
233
  @click.option("-trl", "--testrunlinks", type=str, envvar='TMS_TEST_RUN_LINKS', default=None, help=_TESTRUN_LINKS_HELP)
173
- @click.option("-o", "--output", type=str, required=True, help="Set file path for output (FILE)")
234
+ @click.option("-o", "--output", type=str, default=None, help="Set file path for output (FILE)")
174
235
  @click.option("-a", "--attachments", multiple=True, type=list, help="Path to attachments for test run (multiple)", default=[], cls=ExtraArgsForOption)
175
236
  @click.option("-d", "--debug", is_flag=True, help="Set debug logs")
176
237
  @click.option("-dcv", "--disable-cert-validation", is_flag=True, help="Disables certificate validation")
177
- def create_test_run(url, token, project_id, testrun_name, testruntags, testrunlinks, output, debug, attachments, disable_cert_validation):
238
+ def create_test_run(ctx, url, token, project_id, testrun_name, testruntags, testrunlinks, output, debug, attachments, disable_cert_validation):
178
239
  """Creating a new test run"""
240
+ if ctx.invoked_subcommand is not None:
241
+ return
242
+
243
+ _require_create_options(
244
+ **{"--url": url, "--token": token, "--project-id": project_id, "--output": output}
245
+ )
246
+
179
247
  config = Config(
180
248
  url=url,
181
249
  token=token,
@@ -193,6 +261,41 @@ def create_test_run(url, token, project_id, testrun_name, testruntags, testrunli
193
261
  service.create_test_run()
194
262
 
195
263
 
264
+ @create_test_run.command("launch")
265
+ @click.option("-u", "--url", type=str, envvar='TMS_URL', required=True, help="Set url address of the Test IT instance (https://demo.testit.software)", callback=validate_url)
266
+ @click.option("-t", "--token", type=str, envvar='TMS_TOKEN', required=True, help="Set API token (T2lKd2pLZGI4WHRhaVZUejNl)")
267
+ @click.option("-pi", "--project-id", type=str, envvar='TMS_PROJECT_ID', required=True, help="Set project id (5236eb3f-7c05-46f9-a609-dc0278896464)", callback=validate_uuid)
268
+ @click.option("-ci", "--configuration-id", type=str, envvar='TMS_CONFIGURATION_ID', required=True, help="Set configuration id (15dbb164-c1aa-4cbf-830c-8c01ae14f4fb)", callback=validate_uuid)
269
+ @click.option("-tpi", "--test-plan-id", type=str, envvar='TMS_TEST_PLAN_ID', default=None, help="Create run from test plan (UUID)", callback=validate_uuid)
270
+ @click.option("-f", "--filter", "launch_filter", type=str, default=None, help="TMS filter, e.g. tags=smoke,nightly")
271
+ @click.option("-af", "--autotest-external-ids-file", type=click.Path(exists=True, dir_okay=False, readable=True), default=None, help="File with autotest external IDs (one per line)")
272
+ @click.option("-tn", "--testrun-name", type=str, envvar='TMS_TEST_RUN_NAME', help="Set test run name (TestRun01)", default=None)
273
+ @click.option("-o", "--output", type=str, default=None, help="Optional file path to write test run id")
274
+ @click.option("-d", "--debug", is_flag=True, help="Set debug logs")
275
+ @click.option("-dcv", "--disable-cert-validation", is_flag=True, help="Disables certificate validation")
276
+ def create_launch(url, token, project_id, configuration_id, test_plan_id, launch_filter, autotest_external_ids_file, testrun_name, output, debug, disable_cert_validation):
277
+ """Create and fill a test run (by plan, tags, or external IDs)"""
278
+ _require_exactly_one_launch_source(test_plan_id, launch_filter, autotest_external_ids_file)
279
+ launch_tags = _parse_launch_tags(launch_filter)
280
+ autotest_external_ids = _load_autotest_external_ids(autotest_external_ids_file)
281
+
282
+ config = Config(
283
+ url=url,
284
+ token=token,
285
+ project_id=project_id,
286
+ configuration_id=configuration_id,
287
+ test_plan_id=test_plan_id,
288
+ launch_tags=launch_tags,
289
+ autotest_external_ids=autotest_external_ids,
290
+ testrun_name=testrun_name,
291
+ is_debug=debug,
292
+ output=output or "",
293
+ disable_cert_validation=disable_cert_validation,
294
+ )
295
+ service = ServiceFactory().get(config)
296
+ service.launch_test_run()
297
+
298
+
196
299
  @testrun.command("complete")
197
300
  @click.option("-u", "--url", type=str, envvar='TMS_URL', required=True, help="Set url address of the Test IT instance (https://demo.testit.software)", callback=validate_url)
198
301
  @click.option("-t", "--token", type=str, envvar='TMS_TOKEN', required=True, help="Set API token (T2lKd2pLZGI4WHRhaVZUejNl)")
@@ -282,7 +385,7 @@ def rerun_test_run(url, token, testrun_id, configuration_id, status_code, failur
282
385
 
283
386
 
284
387
  PYTHON_FRAMEWORKS = ['pytest', 'robotframework', 'behave', 'nose']
285
- JAVA_FRAMEWORKS = ['gradle-testng', 'gradle-junit5', 'gradle-junit4', 'gradle-cucumber', 'maven-testng', 'maven-junit5', 'maven-junit4', 'maven-cucumber']
388
+ JAVA_FRAMEWORKS = ['gradle-testng', 'gradle-junit6', 'gradle-junit5', 'gradle-junit4', 'gradle-cucumber', 'maven-testng', 'maven-junit6', 'maven-junit5', 'maven-junit4', 'maven-cucumber']
286
389
  KOTLIN_FRAMEWORKS = ['kotest']
287
390
  JAVASCRIPT_FRAMEWORKS = ['cucumberjs', 'codeceptjs', 'jest', 'mocha', 'playwright', 'testcafe', 'cypress']
288
391
  DOTNET_FRAMEWORKS = ['mstest', 'nunit', 'xunit', 'specflow']
@@ -9,9 +9,11 @@ from adapters_api.model.assign_attachment_api_model import AssignAttachmentApiMo
9
9
  from adapters_api.model.attachment_api_result import AttachmentApiResult
10
10
  from adapters_api.model.attachment_put_model import AttachmentPutModel
11
11
  from adapters_api.model.auto_test_api_result import AutoTestApiResult
12
+ from adapters_api.model.auto_test_create_api_model_layer import AutoTestCreateApiModelLayer
12
13
  from adapters_api.model.auto_test_results_for_test_run_model import AutoTestResultsForTestRunModel
13
14
  from adapters_api.model.auto_test_search_api_model_filter import AutoTestSearchApiModelFilter
14
15
  from adapters_api.model.auto_test_search_api_model_includes import AutoTestSearchApiModelIncludes
16
+ from adapters_api.model.layer_source import LayerSource
15
17
  from adapters_api.model.link_api_result import LinkApiResult
16
18
  from adapters_api.model.test_result_short_response import TestResultShortResponse
17
19
  from adapters_api.model.test_run_api_result import TestRunApiResult
@@ -23,6 +25,15 @@ from .models.testrun import TestRun
23
25
 
24
26
 
25
27
  class Converter:
28
+ @staticmethod
29
+ def layer_to_api_model(layer_name: typing.Optional[str]) -> typing.Optional[AutoTestCreateApiModelLayer]:
30
+ if layer_name is None or not str(layer_name).strip():
31
+ return None
32
+ return AutoTestCreateApiModelLayer(
33
+ name=str(layer_name).strip(),
34
+ source=LayerSource("Run"),
35
+ )
36
+
26
37
  @staticmethod
27
38
  def project_id_and_external_id_to_autotests_search_post_request(
28
39
  project_id: str, external_id: str) -> AdaptersAutoTestsSearchPostRequest:
@@ -85,26 +96,41 @@ class Converter:
85
96
 
86
97
  @staticmethod
87
98
  def test_result_to_create_autotest_request(
88
- result: TestCase, external_id: str, project_id: str) -> AdaptersAutoTestsPostRequest:
89
- return AdaptersAutoTestsPostRequest(
90
- external_id=external_id,
91
- project_id=project_id,
92
- name=result.get_name(),
93
- namespace=result.get_name_space(),
94
- classname=result.get_class_name(),
95
- )
99
+ result: TestCase,
100
+ external_id: str,
101
+ project_id: str,
102
+ layer: typing.Optional[str] = None) -> AdaptersAutoTestsPostRequest:
103
+ request_kwargs = {
104
+ "external_id": external_id,
105
+ "project_id": project_id,
106
+ "name": result.get_name(),
107
+ "namespace": result.get_name_space(),
108
+ "classname": result.get_class_name(),
109
+ }
110
+ api_layer = Converter.layer_to_api_model(layer)
111
+ if api_layer is not None:
112
+ request_kwargs["layer"] = api_layer
113
+ return AdaptersAutoTestsPostRequest(**request_kwargs)
96
114
 
97
115
  @staticmethod
98
116
  def test_result_to_update_autotest_request(
99
- result: TestCase, external_id: str, project_id: str) -> AdaptersAutoTestsPutRequest:
100
- return AdaptersAutoTestsPutRequest(
101
- external_id=external_id,
102
- project_id=project_id,
103
- name=result.get_name(),
104
- namespace=result.get_name_space(),
105
- classname=result.get_class_name(),
106
- is_flaky=result.get_is_flaky()
107
- )
117
+ result: TestCase,
118
+ external_id: str,
119
+ project_id: str,
120
+ layer: typing.Optional[str] = None) -> AdaptersAutoTestsPutRequest:
121
+ request_kwargs = {
122
+ "external_id": external_id,
123
+ "project_id": project_id,
124
+ "name": result.get_name(),
125
+ "namespace": result.get_name_space(),
126
+ "classname": result.get_class_name(),
127
+ "is_flaky": result.get_is_flaky(),
128
+ "reset_layer": False,
129
+ }
130
+ api_layer = Converter.layer_to_api_model(layer)
131
+ if api_layer is not None:
132
+ request_kwargs["layer"] = api_layer
133
+ return AdaptersAutoTestsPutRequest(**request_kwargs)
108
134
 
109
135
  @staticmethod
110
136
  def test_result_to_testrun_result_post_model(