codemagic-cli-tools 0.47.4__tar.gz → 0.48.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 (402) hide show
  1. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/PKG-INFO +1 -1
  2. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/pyproject.toml +1 -1
  3. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/__version__.py +1 -1
  4. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/__version__.py-e +1 -1
  5. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/resource_manager.py +2 -7
  6. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/versioning/review_submissions.py +9 -0
  7. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/error_response.py +19 -0
  8. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/simulator/simulator.py +3 -7
  9. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/abstract_base_action.py +1 -0
  10. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/action_groups/app_store_versions_action_group.py +34 -0
  11. codemagic_cli_tools-0.48.0/src/codemagic/tools/_app_store_connect/action_groups/review_submission_items_actions_group.py +123 -0
  12. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/action_groups/review_submissions_actions_group.py +20 -0
  13. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/arguments.py +18 -0
  14. codemagic_cli_tools-0.48.0/src/codemagic/tools/_app_store_connect/errors.py +15 -0
  15. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/resource_manager_mixin.py +32 -7
  16. codemagic_cli_tools-0.48.0/src/codemagic/utilities/case_conversion.py +9 -0
  17. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/test_resource_manager.py +0 -17
  18. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/resources/conftest.py +6 -0
  19. codemagic_cli_tools-0.48.0/tests/apple/resources/mocks/error_response_entity_state_invalid.json +47 -0
  20. codemagic_cli_tools-0.48.0/tests/apple/resources/test_error_response.py +22 -0
  21. codemagic_cli_tools-0.48.0/tests/utilities/test_case_conversion.py +37 -0
  22. codemagic_cli_tools-0.47.4/src/codemagic/tools/_app_store_connect/action_groups/review_submission_items_actions_group.py +0 -49
  23. codemagic_cli_tools-0.47.4/src/codemagic/tools/_app_store_connect/errors.py +0 -5
  24. codemagic_cli_tools-0.47.4/tests/apple/resources/test_error_response.py +0 -13
  25. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/LICENSE +0 -0
  26. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/README.md +0 -0
  27. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/__init__.py +0 -0
  28. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/__init__.py +0 -0
  29. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/__init__.py +0 -0
  30. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/api_client.py +0 -0
  31. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/api_error.py +0 -0
  32. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/api_session.py +0 -0
  33. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/apps/__init__.py +0 -0
  34. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/apps/apps.py +0 -0
  35. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/builds/__init__.py +0 -0
  36. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/builds/builds.py +0 -0
  37. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/json_web_token_manager.py +0 -0
  38. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/provisioning/__init__.py +0 -0
  39. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/provisioning/bundle_id_capabilities.py +0 -0
  40. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/provisioning/bundle_ids.py +0 -0
  41. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/provisioning/devices.py +0 -0
  42. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/provisioning/profiles.py +0 -0
  43. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/provisioning/signing_certificates.py +0 -0
  44. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/testflight/__init__.py +0 -0
  45. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/testflight/beta_groups.py +0 -0
  46. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/type_declarations.py +0 -0
  47. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/versioning/__init__.py +0 -0
  48. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/versioning/app_store_version_localizations.py +0 -0
  49. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/versioning/app_store_version_submissions.py +0 -0
  50. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/versioning/app_store_versions.py +0 -0
  51. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/versioning/beta_app_review_submissions.py +0 -0
  52. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/versioning/beta_build_localizations.py +0 -0
  53. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/versioning/pre_release_versions.py +0 -0
  54. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/versioning/review_submission_items.py +0 -0
  55. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/__init__.py +0 -0
  56. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/app.py +0 -0
  57. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/app_store_version.py +0 -0
  58. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/app_store_version_localization.py +0 -0
  59. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/app_store_version_submission.py +0 -0
  60. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/beta_app_localization.py +0 -0
  61. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/beta_app_review_detail.py +0 -0
  62. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/beta_app_review_submission.py +0 -0
  63. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/beta_build_localization.py +0 -0
  64. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/beta_group.py +0 -0
  65. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/build.py +0 -0
  66. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/build_beta_detail.py +0 -0
  67. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/bundle_id.py +0 -0
  68. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/bundle_id_capability.py +0 -0
  69. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/device.py +0 -0
  70. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/enums.py +0 -0
  71. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/pre_release_version.py +0 -0
  72. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/profile.py +0 -0
  73. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/resource.py +0 -0
  74. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/review_submission.py +0 -0
  75. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/review_submission_item.py +0 -0
  76. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/signing_certificate.py +0 -0
  77. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/__init__.py +0 -0
  78. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/action_group.py +0 -0
  79. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/argument/__init__.py +0 -0
  80. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/argument/action_callable.py +0 -0
  81. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/argument/argument.py +0 -0
  82. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/argument/argument_formatter.py +0 -0
  83. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/argument/argument_parser_builder.py +0 -0
  84. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/argument/argument_properties.py +0 -0
  85. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/argument/common_argument_types.py +0 -0
  86. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/argument/typed_cli_argument.py +0 -0
  87. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/cli_app.py +0 -0
  88. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/cli_help_formatter.py +0 -0
  89. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/cli_process.py +0 -0
  90. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/cli_process_stream.py +0 -0
  91. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/cli_types.py +0 -0
  92. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/colors.py +0 -0
  93. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/environment.py +0 -0
  94. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/data/jars/bundletool-all-1.13.1.jar +0 -0
  95. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/google/__init__.py +0 -0
  96. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/google/errors.py +0 -0
  97. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/google/firebase_client.py +0 -0
  98. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/google/google_client.py +0 -0
  99. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/google/resource_managers/__init__.py +0 -0
  100. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/google/resource_managers/mixins/__init__.py +0 -0
  101. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/google/resource_managers/mixins/acting_manager_mixin.py +0 -0
  102. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/google/resource_managers/mixins/listing_manager_mixin.py +0 -0
  103. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/google/resource_managers/release_manager.py +0 -0
  104. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/google/resource_managers/resource_manager.py +0 -0
  105. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/google/resources/__init__.py +0 -0
  106. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/google/resources/identifiers/__init__.py +0 -0
  107. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/google/resources/identifiers/app_identifier.py +0 -0
  108. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/google/resources/identifiers/resource_identifier.py +0 -0
  109. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/google/resources/release.py +0 -0
  110. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/google/resources/release_notes.py +0 -0
  111. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/google/resources/resource.py +0 -0
  112. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/google_play/__init__.py +0 -0
  113. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/google_play/api_client.py +0 -0
  114. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/google_play/api_error.py +0 -0
  115. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/google_play/resources/__init__.py +0 -0
  116. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/google_play/resources/edit.py +0 -0
  117. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/google_play/resources/enums.py +0 -0
  118. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/google_play/resources/resource.py +0 -0
  119. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/google_play/resources/track.py +0 -0
  120. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/mixins/__init__.py +0 -0
  121. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/mixins/path_finder.py +0 -0
  122. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/mixins/running_cli_app.py +0 -0
  123. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/mixins/str_converter.py +0 -0
  124. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/__init__.py +0 -0
  125. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/altool/__init__.py +0 -0
  126. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/altool/altool.py +0 -0
  127. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/altool/altool_result.py +0 -0
  128. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/altool/enums.py +0 -0
  129. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/android_signing_info.py +0 -0
  130. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/application_package/__init__.py +0 -0
  131. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/application_package/abstract_package.py +0 -0
  132. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/application_package/ipa.py +0 -0
  133. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/application_package/macos_package.py +0 -0
  134. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/bundle_id_detector.py +0 -0
  135. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/certificate.py +0 -0
  136. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/certificate_attributes.py +0 -0
  137. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/certificate_p12_exporter.py +0 -0
  138. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/code_sign_entitlements.py +0 -0
  139. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/code_signing_settings_manager.py +0 -0
  140. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/enums.py +0 -0
  141. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/export_options.py +0 -0
  142. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/json_serializable.py +0 -0
  143. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/junit/__init__.py +0 -0
  144. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/junit/definitions.py +0 -0
  145. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/junit/printer.py +0 -0
  146. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/keystore.py +0 -0
  147. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/pbx_project.py +0 -0
  148. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/private_key.py +0 -0
  149. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/provisioning_profile.py +0 -0
  150. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/simulator/__init__.py +0 -0
  151. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/simulator/core_simulator_service.py +0 -0
  152. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/simulator/runtime.py +0 -0
  153. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/table/__init__.py +0 -0
  154. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/table/line.py +0 -0
  155. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/table/table.py +0 -0
  156. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/xcode.py +0 -0
  157. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/xcodebuild.py +0 -0
  158. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/xcpretty.py +0 -0
  159. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/xctests/__init__.py +0 -0
  160. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/xctests/collector.py +0 -0
  161. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/xctests/converter.py +0 -0
  162. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/xctests/xcresult.py +0 -0
  163. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/xctests/xcresulttool.py +0 -0
  164. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/py.typed +0 -0
  165. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/scripts/code_signing_manager.rb +0 -0
  166. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/shell_tools/__init__.py +0 -0
  167. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/shell_tools/abstract_shell_tool.py +0 -0
  168. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/shell_tools/keytool.py +0 -0
  169. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/__init__.py +0 -0
  170. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/__init__.py +0 -0
  171. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/action_group.py +0 -0
  172. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/action_groups/__init__.py +0 -0
  173. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/action_groups/app_store_version_localizations_action_group.py +0 -0
  174. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/action_groups/app_store_version_submissions_action_group.py +0 -0
  175. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/action_groups/apps_action_group.py +0 -0
  176. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/action_groups/beta_app_review_submissions_action_group.py +0 -0
  177. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/action_groups/beta_build_localizations_action_group.py +0 -0
  178. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/action_groups/beta_groups_action_group.py +0 -0
  179. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/action_groups/builds_action_group.py +0 -0
  180. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/actions/__init__.py +0 -0
  181. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/actions/publish_action.py +0 -0
  182. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/resource_printer.py +0 -0
  183. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_xcode_project/__init__.py +0 -0
  184. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_xcode_project/arguments.py +0 -0
  185. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/android_app_bundle.py +0 -0
  186. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/android_keystore/__init__.py +0 -0
  187. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/android_keystore/__main__.py +0 -0
  188. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/android_keystore/android_keystore.py +0 -0
  189. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/android_keystore/argument_types.py +0 -0
  190. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/android_keystore/arguments.py +0 -0
  191. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/app_store_connect.py +0 -0
  192. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/codemagic_cli_tools.py +0 -0
  193. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/firebase_app_distribution/__init__.py +0 -0
  194. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/firebase_app_distribution/__main__.py +0 -0
  195. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/firebase_app_distribution/action_groups/__init__.py +0 -0
  196. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/firebase_app_distribution/action_groups/firebase_action_groups.py +0 -0
  197. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/firebase_app_distribution/action_groups/releases_action_group.py +0 -0
  198. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/firebase_app_distribution/actions/__init__.py +0 -0
  199. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/firebase_app_distribution/actions/get_latest_build_version_action.py +0 -0
  200. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/firebase_app_distribution/argument_types.py +0 -0
  201. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/firebase_app_distribution/arguments.py +0 -0
  202. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/firebase_app_distribution/errors.py +0 -0
  203. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/firebase_app_distribution/firebase_app_distribution.py +0 -0
  204. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/firebase_app_distribution/firebase_app_distribution_action.py +0 -0
  205. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/firebase_app_distribution/resource_printer.py +0 -0
  206. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/git_changelog.py +0 -0
  207. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/google_play/__init__.py +0 -0
  208. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/google_play/__main__.py +0 -0
  209. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/google_play/action_groups/__init__.py +0 -0
  210. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/google_play/action_groups/google_play_action_groups.py +0 -0
  211. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/google_play/action_groups/tracks_action_group.py +0 -0
  212. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/google_play/actions/__init__.py +0 -0
  213. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/google_play/actions/get_latest_build_number_action.py +0 -0
  214. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/google_play/argument_types.py +0 -0
  215. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/google_play/arguments.py +0 -0
  216. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/google_play/errors.py +0 -0
  217. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/google_play/google_play.py +0 -0
  218. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/google_play/google_play_base_action.py +0 -0
  219. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/keychain.py +0 -0
  220. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/universal_apk_generator.py +0 -0
  221. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/xcode_project.py +0 -0
  222. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/utilities/__init__.py +0 -0
  223. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/utilities/auditing/__init__.py +0 -0
  224. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/utilities/auditing/base_auditor.py +0 -0
  225. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/utilities/auditing/exception_auditor.py +0 -0
  226. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/utilities/auditing/http_request_auditor.py +0 -0
  227. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/utilities/backwards_file_reader.py +0 -0
  228. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/utilities/decorators.py +0 -0
  229. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/utilities/levenshtein_distance.py +0 -0
  230. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/utilities/log.py +0 -0
  231. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/utilities/versions.py +0 -0
  232. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/__init__.py +0 -0
  233. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/__init__.py +0 -0
  234. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/__init__.py +0 -0
  235. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/apps/__init__.py +0 -0
  236. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/apps/test_apps.py +0 -0
  237. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/builds/__init__.py +0 -0
  238. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/builds/test_builds.py +0 -0
  239. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/provisioning/__init__.py +0 -0
  240. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/provisioning/conftest.py +0 -0
  241. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/provisioning/test_bundle_id_capabilities.py +0 -0
  242. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/provisioning/test_bundle_ids.py +0 -0
  243. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/provisioning/test_devices.py +0 -0
  244. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/provisioning/test_profiles.py +0 -0
  245. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/provisioning/test_signing_certificates.py +0 -0
  246. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/resource_manager_test_base.py +0 -0
  247. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/test_api_client.py +0 -0
  248. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/test_api_session.py +0 -0
  249. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/test_json_web_token_manager.py +0 -0
  250. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/testflight/__init__.py +0 -0
  251. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/testflight/test_beta_groups.py +0 -0
  252. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/versioning/test_app_store_version_localizations.py +0 -0
  253. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/versioning/test_app_store_version_submissions.py +0 -0
  254. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/versioning/test_app_store_versions.py +0 -0
  255. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/versioning/test_beta_app_review_submissions.py +0 -0
  256. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/versioning/test_beta_build_localizations.py +0 -0
  257. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/versioning/test_pre_release_versions.py +0 -0
  258. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/versioning/test_review_submission_items.py +0 -0
  259. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/versioning/test_review_submissions.py +0 -0
  260. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/resources/__init__.py +0 -0
  261. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/resources/enums/__init__.py +0 -0
  262. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/resources/enums/test_certificate_type.py +0 -0
  263. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/resources/enums/test_profile_type.py +0 -0
  264. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/resources/mocks/app_store_version.json +0 -0
  265. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/resources/mocks/build.json +0 -0
  266. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/resources/mocks/bundle_id.json +0 -0
  267. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/resources/mocks/bundle_id_capability.json +0 -0
  268. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/resources/mocks/certificate.json +0 -0
  269. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/resources/mocks/device.json +0 -0
  270. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/resources/mocks/error_response.json +0 -0
  271. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/resources/mocks/error_response_with_links.json +0 -0
  272. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/resources/mocks/mock_resource.json +0 -0
  273. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/resources/mocks/pre_release_version.json +0 -0
  274. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/resources/mocks/profile.json +0 -0
  275. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/resources/test_app_store_version_resource.py +0 -0
  276. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/resources/test_build_resource.py +0 -0
  277. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/resources/test_bundle_id_capability_resource.py +0 -0
  278. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/resources/test_bundle_id_resource.py +0 -0
  279. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/resources/test_device_resource.py +0 -0
  280. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/resources/test_pre_release_version_resource.py +0 -0
  281. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/resources/test_profile_resource.py +0 -0
  282. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/resources/test_resource.py +0 -0
  283. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/resources/test_signing_certificate_resource.py +0 -0
  284. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/resources/test_undefined_resource_fields.py +0 -0
  285. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/cli/__init__.py +0 -0
  286. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/cli/argument/__init__.py +0 -0
  287. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/cli/argument/common_argument_types/__init__.py +0 -0
  288. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/cli/argument/common_argument_types/test_bounded_number.py +0 -0
  289. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/cli/argument/common_argument_types/test_iso_8601_datetime.py +0 -0
  290. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/cli/argument/common_argument_types/test_maybe_dir.py +0 -0
  291. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/cli/argument/test_argument.py +0 -0
  292. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/cli/mocks/utf-8-sample.txt +0 -0
  293. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/cli/test_cli_process.py +0 -0
  294. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/cli/test_decorators.py +0 -0
  295. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/conftest.py +0 -0
  296. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/google/__init__.py +0 -0
  297. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/google/conftest.py +0 -0
  298. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/google/test_firebase_client.py +0 -0
  299. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/google/test_live_firebase_client.py +0 -0
  300. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/google_play/__init__.py +0 -0
  301. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/google_play/resources/__init__.py +0 -0
  302. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/google_play/resources/conftest.py +0 -0
  303. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/google_play/resources/mocks/edit.json +0 -0
  304. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/google_play/resources/mocks/track.json +0 -0
  305. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/google_play/resources/test_edit_resource.py +0 -0
  306. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/google_play/resources/test_resource_print.py +0 -0
  307. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/google_play/resources/test_track_resource.py +0 -0
  308. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/google_play/test_api_client.py +0 -0
  309. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/mixins/__init__.py +0 -0
  310. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/mixins/test_string_converter.py +0 -0
  311. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/mocks/certificate.asn1 +0 -0
  312. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/mocks/encrypted.pem +0 -0
  313. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/mocks/encrypted.pem.pub +0 -0
  314. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/mocks/unencrypted.pem +0 -0
  315. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/mocks/unencrypted.pem.pub +0 -0
  316. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/__init__.py +0 -0
  317. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/altool/__init__.py +0 -0
  318. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/altool/mocks/mock_failure_auth.txt +0 -0
  319. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/altool/mocks/mock_failure_other.txt +0 -0
  320. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/altool/mocks/mock_upload_success.json +0 -0
  321. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/altool/mocks/mock_validation_failure.json +0 -0
  322. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/altool/test_altool_result.py +0 -0
  323. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/altool/test_altool_retrying.py +0 -0
  324. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/conftest.py +0 -0
  325. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/enums/__init__.py +0 -0
  326. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/enums/test_resource_enum.py +0 -0
  327. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/junit/__init__.py +0 -0
  328. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/junit/mocks/testsuite.xml +0 -0
  329. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/junit/test_xml_generation.py +0 -0
  330. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/mocks/certificate-no-password.p12 +0 -0
  331. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/mocks/certificate.p12 +0 -0
  332. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/mocks/codemagic_io_wildcard_development.mobileprovision +0 -0
  333. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/mocks/export_options.plist +0 -0
  334. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/mocks/mock.ipa +0 -0
  335. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/mocks/mock.xcarchive/Products/Applications/Capybara App.app/Capybara App +0 -0
  336. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/mocks/mock_0_icloud_container_environments.plist +0 -0
  337. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/mocks/mock_1_icloud_container_environments.plist +0 -0
  338. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/mocks/mock_2_icloud_container_environments.plist +0 -0
  339. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/mocks/mock_openssh_private_key +0 -0
  340. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/mocks/mock_rsa_private_key +0 -0
  341. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/mocks/mock_xcode/Contents/version.plist +0 -0
  342. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/simulator/__init__.py +0 -0
  343. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/simulator/mocks/devices.json +0 -0
  344. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/simulator/mocks/simulator.json +0 -0
  345. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/simulator/test_runtime.py +0 -0
  346. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/simulator/test_simulator.py +0 -0
  347. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/test_certificate.py +0 -0
  348. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/test_certificate_attributes.py +0 -0
  349. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/test_code_sign_entitlements.py +0 -0
  350. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/test_export_options.py +0 -0
  351. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/test_private_key.py +0 -0
  352. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/test_provisioning_profile.py +0 -0
  353. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/test_table.py +0 -0
  354. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/test_xcode.py +0 -0
  355. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/xctests/__init__.py +0 -0
  356. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/xctests/conftest.py +0 -0
  357. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/xctests/mocks/0_1NtPgUPcB1A83X977l5Q91ElstUeVDnqAhumk_VJG8DIS4GA1sb8ElPPHZZGYEHmNvnHU1VVaPDCw1tI8n3uXg__.json +0 -0
  358. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/xctests/mocks/0_5rAUs3HknUI7DU8Jyc5RlFcosqCXTOV-qwOaOE1Mul_ppK8QCta-NSxxCdtVg6i12km4zTR5l0SjgzfHGUNxog__.json +0 -0
  359. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/xctests/mocks/0_97T9qQZ3dEI1oDS6NvYTPcFk_jUXFJ0NRwyd5FZ2S585JGMtlqbF28Hc85yeifgKEnNoInoW93Za9c5QJCspeQ__.json +0 -0
  360. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/xctests/mocks/0_DVcJZnHFaQQlzl8czovv7RuDRQIToEr5_3lLe-Mn1Sm6VreJ5xoXEFqBaWNv0XRmSg00NJ77XzQKgddhfkuk7w__.json +0 -0
  361. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/xctests/mocks/0_FZMbIp5VAUEiJv1wUUM-K78Dtmb4o-titbTusDJqRuarbS9OatzAykygXo4NUqEoR9sxCIoeu8VDioQmbba6mw__.json +0 -0
  362. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/xctests/mocks/0_Hj6SOUxY1APmxdQEA2HdqbA52GD3WJE571nqr_Z-w8vi_buxP-GUjNxCsGYQvnKnnwlyykwxY-KJmjqKYmPyXQ__.json +0 -0
  363. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/xctests/mocks/0_NnCmQ8rMqVyUBgL3ZDjfjJ9Vt1AMGeMzZPkDH30rGMYer0pFDpp4UDZlCEHRImO-48LdC_KdcbjP70IZA6zKUQ__.json +0 -0
  364. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/xctests/mocks/0_YK9aPHVT-grv_ZVooRT79GBO9n82BNogkuWVzFO6itJEtbtsRTQpK2-0ZDLot1JpCfPb26aZwEZjeb9G4GHiBQ__.json +0 -0
  365. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/xctests/mocks/0__H1_RrdBT9b-ZhkWCQiRKpHlwURmyWUudeOhj5UslLXhXl8mr9w5CGqdobi9A5wCVEIRMsO4yuFyzx2gMPr-_Q__.json +0 -0
  366. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/xctests/mocks/0_evvkuGf92MVrmIvhr07911LuRTiPBKDjIQ0q_7L-mPGGYkWVKMBPQ5pB5lbjoaOnvr0fpC9k003EunfwSdss2g__.json +0 -0
  367. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/xctests/mocks/actions_invocation_record.json +0 -0
  368. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/xctests/test_collector.py +0 -0
  369. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/xctests/test_converter.py +0 -0
  370. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/xctests/test_xcresult.py +0 -0
  371. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/shell_tools/__init__.py +0 -0
  372. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/shell_tools/keytool/__init__.py +0 -0
  373. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/shell_tools/keytool/conftest.py +0 -0
  374. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/shell_tools/keytool/mocks/android.ks +0 -0
  375. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/shell_tools/keytool/mocks/non-rfc-cert-keystore.jks +0 -0
  376. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/shell_tools/keytool/mocks/non-rfc-cert-keystore.p12 +0 -0
  377. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/shell_tools/keytool/mocks/rfc-cert-keystore.jks +0 -0
  378. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/shell_tools/keytool/mocks/rfc-cert-keystore.p12 +0 -0
  379. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/shell_tools/keytool/test_get_certificate.py +0 -0
  380. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/shell_tools/keytool/test_get_certificates.py +0 -0
  381. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/shell_tools/keytool/test_validate.py +0 -0
  382. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/tools/__init__.py +0 -0
  383. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/tools/app_store_connect/__init__.py +0 -0
  384. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/tools/app_store_connect/arguments/__init__.py +0 -0
  385. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/tools/app_store_connect/arguments/test_beta_build_localizations.py +0 -0
  386. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/tools/app_store_connect/conftest.py +0 -0
  387. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/tools/app_store_connect/mocks/AuthKeyMock.p8 +0 -0
  388. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/tools/app_store_connect/test_from_cli_args.py +0 -0
  389. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/tools/app_store_connect/test_publish_action.py +0 -0
  390. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/tools/mocks/firebase_releases.json +0 -0
  391. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/tools/mocks/google_play_tracks.json +0 -0
  392. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/tools/test_android_app_bundle.py +0 -0
  393. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/tools/test_firebase_app_distribution.py +0 -0
  394. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/tools/test_google_play.py +0 -0
  395. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/tools/test_keychain.py +0 -0
  396. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/tools/test_universal_apk_generator.py +0 -0
  397. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/utilities/__init__.py +0 -0
  398. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/utilities/decorators/__init__.py +0 -0
  399. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/utilities/decorators/test_deprecated.py +0 -0
  400. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/utilities/test_backwards_file_reader.py +0 -0
  401. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/utilities/test_levenshtein_distance.py +0 -0
  402. {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/utilities/test_versions.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: codemagic-cli-tools
3
- Version: 0.47.4
3
+ Version: 0.48.0
4
4
  Summary: CLI tools used in Codemagic builds
5
5
  Home-page: https://github.com/codemagic-ci-cd/cli-tools
6
6
  License: GPL-3.0-or-later
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "codemagic-cli-tools"
3
- version = "0.47.4"
3
+ version = "0.48.0"
4
4
  description = "CLI tools used in Codemagic builds"
5
5
  readme = "README.md"
6
6
  authors = [
@@ -1,5 +1,5 @@
1
1
  __title__ = "codemagic-cli-tools"
2
2
  __description__ = "CLI tools used in Codemagic builds"
3
- __version__ = '0.47.4'
3
+ __version__ = '0.48.0'
4
4
  __url__ = "https://github.com/codemagic-ci-cd/cli-tools"
5
5
  __licence__ = "GNU General Public License v3.0"
@@ -1,5 +1,5 @@
1
1
  __title__ = "codemagic-cli-tools"
2
2
  __description__ = "CLI tools used in Codemagic builds"
3
- __version__ = "0.47.4.dev"
3
+ __version__ = "0.48.0.dev"
4
4
  __url__ = "https://github.com/codemagic-ci-cd/cli-tools"
5
5
  __licence__ = "GNU General Public License v3.0"
@@ -2,7 +2,6 @@ from __future__ import annotations
2
2
 
3
3
  import abc
4
4
  import enum
5
- import re
6
5
  import shlex
7
6
  from typing import TYPE_CHECKING
8
7
  from typing import Any
@@ -18,6 +17,7 @@ from codemagic.apple.resources import LinkedResourceData
18
17
  from codemagic.apple.resources import Resource
19
18
  from codemagic.apple.resources import ResourceId
20
19
  from codemagic.apple.resources import ResourceType
20
+ from codemagic.utilities import case_conversion
21
21
 
22
22
  if TYPE_CHECKING:
23
23
  from codemagic.apple import AppStoreConnectApiClient
@@ -30,12 +30,7 @@ class ResourceManager(Generic[R], metaclass=abc.ABCMeta):
30
30
  class Filter:
31
31
  @classmethod
32
32
  def _get_field_name(cls, field_name) -> str:
33
- return cls._snake_to_camel(field_name)
34
-
35
- @classmethod
36
- def _snake_to_camel(cls, field_name: str) -> str:
37
- patt = re.compile(r"_(\w)")
38
- return patt.sub(lambda m: m.group(1).upper(), field_name)
33
+ return case_conversion.snake_to_camel(field_name)
39
34
 
40
35
  @classmethod
41
36
  def _get_param_value(cls, field_value) -> str:
@@ -12,6 +12,7 @@ from codemagic.apple.resources import Platform
12
12
  from codemagic.apple.resources import ResourceId
13
13
  from codemagic.apple.resources import ResourceType
14
14
  from codemagic.apple.resources import ReviewSubmission
15
+ from codemagic.apple.resources import ReviewSubmissionItem
15
16
  from codemagic.apple.resources import ReviewSubmissionState
16
17
 
17
18
 
@@ -99,3 +100,11 @@ class ReviewSubmissions(ResourceManager[ReviewSubmission]):
99
100
  json=payload,
100
101
  ).json()
101
102
  return ReviewSubmission(response["data"])
103
+
104
+ def list_items(self, review_submission: Union[LinkedResourceData, ResourceId]) -> List[ReviewSubmissionItem]:
105
+ """
106
+ https://developer.apple.com/documentation/appstoreconnectapi/list_the_items_in_a_review_submission
107
+ """
108
+ review_submission_id = self._get_resource_id(review_submission)
109
+ url = f"{self.client.API_URL}/reviewSubmissions/{review_submission_id}/items"
110
+ return [ReviewSubmissionItem(item) for item in self.client.paginate(url)]
@@ -3,6 +3,7 @@ from __future__ import annotations
3
3
  import textwrap
4
4
  from dataclasses import dataclass
5
5
  from typing import Dict
6
+ from typing import Iterable
6
7
  from typing import List
7
8
  from typing import Optional
8
9
 
@@ -43,6 +44,19 @@ class Error(DictSerializable):
43
44
  meta: Optional[ErrorMeta] = None
44
45
  links: Optional[Dict[str, str]] = None
45
46
 
47
+ @property
48
+ def associated_errors(self) -> Dict[str, List[Error]]:
49
+ if not self.meta or not self.meta.associatedErrors:
50
+ return {}
51
+ return self.meta.associatedErrors
52
+
53
+ @property
54
+ def source_pointer(self) -> Optional[str]:
55
+ try:
56
+ return self.source["pointer"] if self.source else None
57
+ except KeyError:
58
+ return None
59
+
46
60
  def __post_init__(self):
47
61
  if isinstance(self.meta, dict):
48
62
  self.meta = ErrorMeta(**self.meta)
@@ -78,5 +92,10 @@ class ErrorResponse(DictSerializable):
78
92
  )
79
93
  return error_response
80
94
 
95
+ def iter_associated_errors(self) -> Iterable[Error]:
96
+ for error in self.errors:
97
+ for errors in error.associated_errors.values():
98
+ yield from errors
99
+
81
100
  def __str__(self):
82
101
  return "\n".join(map(str, self.errors))
@@ -5,7 +5,6 @@ import pathlib
5
5
  import re
6
6
  import subprocess
7
7
  from dataclasses import dataclass
8
- from functools import lru_cache
9
8
  from typing import Dict
10
9
  from typing import List
11
10
  from typing import Optional
@@ -13,6 +12,7 @@ from typing import Sequence
13
12
  from typing import Union
14
13
 
15
14
  from codemagic.mixins import RunningCliAppMixin
15
+ from codemagic.utilities import case_conversion
16
16
 
17
17
  from .runtime import Runtime
18
18
 
@@ -46,15 +46,11 @@ class Simulator(RunningCliAppMixin):
46
46
 
47
47
  @classmethod
48
48
  def create(cls, **kwargs) -> Simulator:
49
- @lru_cache()
50
- def camel_to_snake(s: str) -> str:
51
- return re.sub(r"([A-Z])", lambda m: f"_{m.group(1).lower()}", s)
52
-
53
49
  return Simulator(
54
50
  **{
55
- camel_to_snake(name): value
51
+ case_conversion.camel_to_snake(name): value
56
52
  for name, value in kwargs.items()
57
- if camel_to_snake(name) in cls.__dataclass_fields__ # type: ignore
53
+ if case_conversion.camel_to_snake(name) in cls.__dataclass_fields__ # type: ignore
58
54
  },
59
55
  )
60
56
 
@@ -264,6 +264,7 @@ class AbstractBaseAction(ResourceManagerMixin, PathFinderMixin, metaclass=ABCMet
264
264
  def list_app_store_version_localizations(
265
265
  self,
266
266
  app_store_version_id: ResourceId,
267
+ locales: Optional[Sequence[Locale]] = None,
267
268
  should_print: bool = True,
268
269
  ) -> List[AppStoreVersionLocalization]:
269
270
  from .action_groups import AppStoreVersionsActionGroup
@@ -4,6 +4,7 @@ from abc import ABCMeta
4
4
  from datetime import datetime
5
5
  from typing import List
6
6
  from typing import Optional
7
+ from typing import Sequence
7
8
  from typing import Union
8
9
 
9
10
  from codemagic import cli
@@ -12,6 +13,7 @@ from codemagic.apple.resources import App
12
13
  from codemagic.apple.resources import AppStoreVersion
13
14
  from codemagic.apple.resources import AppStoreVersionLocalization
14
15
  from codemagic.apple.resources import Build
16
+ from codemagic.apple.resources import Locale
15
17
  from codemagic.apple.resources import Platform
16
18
  from codemagic.apple.resources import ReleaseType
17
19
  from codemagic.apple.resources import ResourceId
@@ -19,6 +21,7 @@ from codemagic.apple.resources import ResourceId
19
21
  from ..abstract_base_action import AbstractBaseAction
20
22
  from ..action_group import AppStoreConnectActionGroup
21
23
  from ..arguments import AppStoreVersionArgument
24
+ from ..arguments import AppStoreVersionLocalizationArgument
22
25
  from ..arguments import BuildArgument
23
26
  from ..arguments import CommonArgument
24
27
  from ..arguments import Types
@@ -72,6 +75,28 @@ class AppStoreVersionsActionGroup(AbstractBaseAction, metaclass=ABCMeta):
72
75
  **{k: v for k, v in create_params.items() if v is not None},
73
76
  )
74
77
 
78
+ @cli.action(
79
+ "get",
80
+ AppStoreVersionArgument.APP_STORE_VERSION_ID,
81
+ action_group=AppStoreConnectActionGroup.APP_STORE_VERSIONS,
82
+ )
83
+ def get_app_store_version(
84
+ self,
85
+ app_store_version_id: Union[ResourceId, AppStoreVersion],
86
+ should_print: bool = True,
87
+ ) -> AppStoreVersion:
88
+ """
89
+ Read App Store Version information
90
+ """
91
+ if isinstance(app_store_version_id, AppStoreVersion):
92
+ app_store_version_id = app_store_version_id.id
93
+
94
+ return self._get_resource(
95
+ app_store_version_id,
96
+ self.api_client.app_store_versions,
97
+ should_print,
98
+ )
99
+
75
100
  @cli.action(
76
101
  "modify",
77
102
  AppStoreVersionArgument.APP_STORE_VERSION_ID,
@@ -148,17 +173,25 @@ class AppStoreVersionsActionGroup(AbstractBaseAction, metaclass=ABCMeta):
148
173
  @cli.action(
149
174
  "localizations",
150
175
  AppStoreVersionArgument.APP_STORE_VERSION_ID,
176
+ AppStoreVersionLocalizationArgument.LOCALES,
151
177
  action_group=AppStoreConnectActionGroup.APP_STORE_VERSIONS,
152
178
  )
153
179
  def list_app_store_version_localizations(
154
180
  self,
155
181
  app_store_version_id: ResourceId,
182
+ locales: Optional[Sequence[Locale]] = None,
156
183
  should_print: bool = True,
157
184
  ) -> List[AppStoreVersionLocalization]:
158
185
  """
159
186
  List All App Store Version Localizations for an App Store Version.
160
187
  Get a list of localized, version-level information about an app, for all locales.
161
188
  """
189
+
190
+ def predicate(app_store_version_localization: AppStoreVersionLocalization) -> bool:
191
+ if not locales:
192
+ return True
193
+ return app_store_version_localization.attributes.locale in locales
194
+
162
195
  return self._list_related_resources(
163
196
  app_store_version_id,
164
197
  AppStoreVersion,
@@ -166,4 +199,5 @@ class AppStoreVersionsActionGroup(AbstractBaseAction, metaclass=ABCMeta):
166
199
  self.api_client.app_store_versions.list_app_store_version_localizations,
167
200
  None,
168
201
  should_print,
202
+ filter_predicate=predicate,
169
203
  )
@@ -0,0 +1,123 @@
1
+ from __future__ import annotations
2
+
3
+ from abc import ABCMeta
4
+ from typing import List
5
+ from typing import Optional
6
+ from typing import Union
7
+
8
+ from codemagic import cli
9
+ from codemagic.apple.resources import AppStoreVersionLocalization
10
+ from codemagic.apple.resources import ErrorResponse
11
+ from codemagic.apple.resources import ResourceId
12
+ from codemagic.apple.resources import ReviewSubmissionItem
13
+ from codemagic.cli import Colors
14
+ from codemagic.utilities import case_conversion
15
+
16
+ from ..abstract_base_action import AbstractBaseAction
17
+ from ..action_group import AppStoreConnectActionGroup
18
+ from ..arguments import CommonArgument
19
+ from ..arguments import ReviewSubmissionArgument
20
+ from ..arguments import ReviewSubmissionItemArgument
21
+ from ..errors import AppStoreConnectError
22
+
23
+
24
+ class ReviewSubmissionItemsActionGroup(AbstractBaseAction, metaclass=ABCMeta):
25
+ @cli.action(
26
+ "create",
27
+ ReviewSubmissionArgument.REVIEW_SUBMISSION_ID,
28
+ ReviewSubmissionArgument.APP_CUSTOM_PRODUCT_PAGE_VERSION_ID,
29
+ ReviewSubmissionArgument.APP_EVENT_ID,
30
+ ReviewSubmissionArgument.APP_STORE_VERSION_ID,
31
+ ReviewSubmissionArgument.APP_STORE_VERSION_EXPERIMENT_ID,
32
+ action_group=AppStoreConnectActionGroup.REVIEW_SUBMISSION_ITEMS,
33
+ )
34
+ def create_review_submission_item(
35
+ self,
36
+ review_submission_id: ResourceId,
37
+ app_custom_product_page_version_id: Optional[ResourceId] = None,
38
+ app_event_id: Optional[ResourceId] = None,
39
+ app_store_version_id: Optional[ResourceId] = None,
40
+ app_store_version_experiment_id: Optional[ResourceId] = None,
41
+ should_print: bool = True,
42
+ ) -> ReviewSubmissionItem:
43
+ """
44
+ Add contents to review submission for App Store review request
45
+ """
46
+ optional_kwargs = {
47
+ "app_custom_product_page_version": app_custom_product_page_version_id,
48
+ "app_event": app_event_id,
49
+ "app_store_version": app_store_version_id,
50
+ "app_store_version_experiment": app_store_version_experiment_id,
51
+ }
52
+ try:
53
+ return self._create_resource(
54
+ self.api_client.review_submissions_items,
55
+ should_print,
56
+ review_submission=review_submission_id,
57
+ **{k: v for k, v in optional_kwargs.items() if v is not None},
58
+ )
59
+ except AppStoreConnectError as asc_error:
60
+ if asc_error.api_error:
61
+ self._on_create_review_submission_item_error(asc_error.api_error)
62
+ raise
63
+
64
+ @cli.action(
65
+ "delete",
66
+ ReviewSubmissionItemArgument.REVIEW_SUBMISSION_ITEM_ID,
67
+ CommonArgument.IGNORE_NOT_FOUND,
68
+ action_group=AppStoreConnectActionGroup.REVIEW_SUBMISSION_ITEMS,
69
+ )
70
+ def delete_review_submission_item(
71
+ self,
72
+ review_submission_item_id: Union[ResourceId, ReviewSubmissionItem],
73
+ ignore_not_found: bool = False,
74
+ ) -> None:
75
+ """
76
+ Delete specified Review Submission item
77
+ """
78
+ if isinstance(review_submission_item_id, ReviewSubmissionItem):
79
+ review_submission_item_id = review_submission_item_id.id
80
+
81
+ self._delete_resource(
82
+ self.api_client.review_submissions_items,
83
+ review_submission_item_id,
84
+ ignore_not_found,
85
+ )
86
+
87
+ def _on_create_review_submission_item_error(self, error_responses: ErrorResponse):
88
+ """
89
+ Show informative warning message if some required fields are missing
90
+ for App Store Version localization whose locale matches with application's
91
+ default locale.
92
+ """
93
+
94
+ missing_attributes = self._get_missing_required_attributes_names(error_responses)
95
+ if not missing_attributes:
96
+ return
97
+ elif len(missing_attributes) == 1:
98
+ attribute_names = missing_attributes[0]
99
+ else:
100
+ attribute_names = " and ".join([", ".join(missing_attributes[:-1]), missing_attributes[-1]])
101
+
102
+ missing_default_locale_attributes_error = (
103
+ f"\nCreating {ReviewSubmissionItem} failed. Please ensure that {AppStoreVersionLocalization} "
104
+ f"for your application default locale defines {attribute_names}!\n"
105
+ )
106
+ self.echo(Colors.YELLOW(missing_default_locale_attributes_error))
107
+
108
+ @classmethod
109
+ def _get_missing_required_attributes_names(cls, error_responses: ErrorResponse) -> List[str]:
110
+ """
111
+ Extract names of fields that are undefined for application's
112
+ default locale App Store Version localization
113
+ """
114
+ default_locale_missing_values = set()
115
+
116
+ for associated_error in error_responses.iter_associated_errors():
117
+ if associated_error.code == "ENTITY_ERROR.ATTRIBUTE.REQUIRED" and associated_error.source_pointer:
118
+ # source pointer is like '/data/attributes/keywords'
119
+ asc_field_name = associated_error.source_pointer.split("/")[-1]
120
+ field_name = case_conversion.camel_to_snake(asc_field_name).replace("_", " ").lower()
121
+ default_locale_missing_values.add(field_name.replace(" url", " URL"))
122
+
123
+ return list(default_locale_missing_values)
@@ -1,11 +1,13 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from abc import ABCMeta
4
+ from typing import List
4
5
 
5
6
  from codemagic import cli
6
7
  from codemagic.apple.resources import Platform
7
8
  from codemagic.apple.resources import ResourceId
8
9
  from codemagic.apple.resources import ReviewSubmission
10
+ from codemagic.apple.resources import ReviewSubmissionItem
9
11
 
10
12
  from ..abstract_base_action import AbstractBaseAction
11
13
  from ..action_group import AppStoreConnectActionGroup
@@ -95,3 +97,21 @@ class ReviewSubmissionsActionGroup(AbstractBaseAction, metaclass=ABCMeta):
95
97
  should_print,
96
98
  submitted=True,
97
99
  )
100
+
101
+ @cli.action(
102
+ "items",
103
+ ReviewSubmissionArgument.REVIEW_SUBMISSION_ID,
104
+ action_group=AppStoreConnectActionGroup.REVIEW_SUBMISSIONS,
105
+ )
106
+ def list_review_submission_items(self, review_submission_id: ResourceId) -> List[ReviewSubmissionItem]:
107
+ """
108
+ List review submission items for specified review submission
109
+ """
110
+ return self._list_related_resources(
111
+ resource_id=review_submission_id,
112
+ resource_type=ReviewSubmission,
113
+ related_resource_type=ReviewSubmissionItem,
114
+ list_related_resources_method=self.api_client.review_submissions.list_items,
115
+ resource_filter=None,
116
+ should_print=True,
117
+ )
@@ -672,6 +672,14 @@ class ReviewSubmissionArgument(cli.Argument):
672
672
  )
673
673
 
674
674
 
675
+ class ReviewSubmissionItemArgument(cli.Argument):
676
+ REVIEW_SUBMISSION_ITEM_ID = cli.ArgumentProperties(
677
+ key="review_submission_item_id",
678
+ type=ResourceId,
679
+ description="UUID value of the review submission",
680
+ )
681
+
682
+
675
683
  class AppStoreVersionLocalizationArgument(cli.Argument):
676
684
  APP_STORE_VERSION_LOCALIZATION_ID = cli.ArgumentProperties(
677
685
  key="app_store_version_localization_id",
@@ -702,6 +710,16 @@ class AppStoreVersionLocalizationArgument(cli.Argument):
702
710
  "choices": list(Locale),
703
711
  },
704
712
  )
713
+ LOCALES = cli.ArgumentProperties.duplicate(
714
+ LOCALE,
715
+ key="locales",
716
+ flags=("--locale", "-l"),
717
+ argparse_kwargs={
718
+ "nargs": "+",
719
+ "required": False,
720
+ "choices": list(Locale),
721
+ },
722
+ )
705
723
  DESCRIPTION = cli.ArgumentProperties(
706
724
  key="description",
707
725
  flags=("--description", "-d"),
@@ -0,0 +1,15 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import TYPE_CHECKING
4
+ from typing import Optional
5
+
6
+ from codemagic import cli
7
+
8
+ if TYPE_CHECKING:
9
+ from codemagic.apple.resources import ErrorResponse
10
+
11
+
12
+ class AppStoreConnectError(cli.CliAppException):
13
+ def __init__(self, *args, api_error_response: Optional[ErrorResponse] = None, **kwargs):
14
+ self.api_error = api_error_response
15
+ super().__init__(*args, **kwargs)
@@ -37,7 +37,10 @@ class ResourceManagerMixin:
37
37
  try:
38
38
  resource = create_resource(**create_params)
39
39
  except AppStoreConnectApiError as api_error:
40
- raise AppStoreConnectError(str(api_error)) from api_error
40
+ raise AppStoreConnectError(
41
+ str(api_error),
42
+ api_error_response=api_error.error_response,
43
+ ) from api_error
41
44
 
42
45
  self.printer.print_resource(resource, should_print)
43
46
  self.printer.log_created(resource)
@@ -58,7 +61,10 @@ class ResourceManagerMixin:
58
61
  try:
59
62
  resource = read_resource(resource_id)
60
63
  except AppStoreConnectApiError as api_error:
61
- raise AppStoreConnectError(str(api_error))
64
+ raise AppStoreConnectError(
65
+ str(api_error),
66
+ api_error_response=api_error.error_response,
67
+ ) from api_error
62
68
  self.printer.print_resource(resource, should_print)
63
69
  return resource
64
70
 
@@ -77,7 +83,10 @@ class ResourceManagerMixin:
77
83
  try:
78
84
  resources = list_resources(resource_filter=resource_filter)
79
85
  except AppStoreConnectApiError as api_error:
80
- raise AppStoreConnectError(str(api_error))
86
+ raise AppStoreConnectError(
87
+ str(api_error),
88
+ api_error_response=api_error.error_response,
89
+ ) from api_error
81
90
 
82
91
  if filter_predicate is not None:
83
92
  resources = list(filter(filter_predicate, resources))
@@ -99,7 +108,10 @@ class ResourceManagerMixin:
99
108
  try:
100
109
  resource = read_related_resource_method(resource_id)
101
110
  except AppStoreConnectApiError as api_error:
102
- raise AppStoreConnectError(str(api_error))
111
+ raise AppStoreConnectError(
112
+ str(api_error),
113
+ api_error_response=api_error.error_response,
114
+ ) from api_error
103
115
 
104
116
  if resource is None:
105
117
  raise AppStoreConnectError(f"{related_resource_type} was not found for {resource_type} {resource_id}")
@@ -115,6 +127,7 @@ class ResourceManagerMixin:
115
127
  list_related_resources_method: Callable[..., List[R2]],
116
128
  resource_filter: Optional[ResourceManager.Filter],
117
129
  should_print: bool,
130
+ filter_predicate: Optional[Callable[[R2], bool]] = None,
118
131
  ) -> List[R2]:
119
132
  self.printer.log_get_related(related_resource_type, resource_type, resource_id)
120
133
  kwargs = {"resource_filter": resource_filter} if resource_filter else {}
@@ -122,7 +135,13 @@ class ResourceManagerMixin:
122
135
  try:
123
136
  resources = list_related_resources_method(resource_id, **kwargs)
124
137
  except AppStoreConnectApiError as api_error:
125
- raise AppStoreConnectError(str(api_error))
138
+ raise AppStoreConnectError(
139
+ str(api_error),
140
+ api_error_response=api_error.error_response,
141
+ ) from api_error
142
+
143
+ if filter_predicate is not None:
144
+ resources = list(filter(filter_predicate, resources))
126
145
 
127
146
  self.printer.log_found(related_resource_type, resources, resource_filter, resource_type, resource_id)
128
147
  self.printer.print_resources(resources, should_print)
@@ -146,7 +165,10 @@ class ResourceManagerMixin:
146
165
  if ignore_not_found is True and api_error.status_code == 404:
147
166
  self.printer.log_ignore_not_deleted(resource_manager.resource_type, resource_id)
148
167
  else:
149
- raise AppStoreConnectError(str(api_error))
168
+ raise AppStoreConnectError(
169
+ str(api_error),
170
+ api_error_response=api_error.error_response,
171
+ ) from api_error
150
172
  else:
151
173
  self.printer.log_deleted(resource_manager.resource_type, resource_id)
152
174
 
@@ -166,7 +188,10 @@ class ResourceManagerMixin:
166
188
  try:
167
189
  resource = modify_resource(resource_id, **update_params)
168
190
  except AppStoreConnectApiError as api_error:
169
- raise AppStoreConnectError(str(api_error))
191
+ raise AppStoreConnectError(
192
+ str(api_error),
193
+ api_error_response=api_error.error_response,
194
+ ) from api_error
170
195
 
171
196
  self.printer.log_modified(resource_manager.resource_type, resource_id)
172
197
  self.printer.print_resource(resource, should_print)
@@ -0,0 +1,9 @@
1
+ import re
2
+
3
+
4
+ def snake_to_camel(snake_case: str) -> str:
5
+ return re.sub(r"_(\w)", lambda m: m.group(1).upper(), snake_case)
6
+
7
+
8
+ def camel_to_snake(camel_case: str) -> str:
9
+ return re.sub(r"([A-Z])", lambda m: f"_{m.group(1).lower()}", camel_case).lstrip("_")
@@ -43,20 +43,3 @@ class StubFilter(ResourceManager.Filter):
43
43
  def test_resource_manager_filter_to_params_conversion(filter_params, expected_query_params):
44
44
  test_filter = StubFilter(**filter_params)
45
45
  assert test_filter.as_query_params() == expected_query_params
46
-
47
-
48
- @pytest.mark.parametrize(
49
- "snake_case_input, expected_camel_case_output",
50
- [
51
- ("", ""),
52
- ("word", "word"),
53
- ("_word", "Word"),
54
- ("snake_case", "snakeCase"),
55
- ("snake_case_", "snakeCase_"),
56
- ("snake_case_ snakeCase", "snakeCase_ snakeCase"),
57
- ("a_b_c_d_e_f", "aBCDEF"),
58
- ],
59
- )
60
- def test_resource_manager_filter_camel_case_converter(snake_case_input, expected_camel_case_output):
61
- converted_input = ResourceManager.Filter._snake_to_camel(snake_case_input)
62
- assert converted_input == expected_camel_case_output
@@ -47,6 +47,12 @@ def api_error_response() -> Dict:
47
47
  return json.loads(mock_path.read_text())
48
48
 
49
49
 
50
+ @pytest.fixture
51
+ def api_error_response_entity_state_invalid() -> Dict:
52
+ mock_path = pathlib.Path(__file__).parent / "mocks" / "error_response_entity_state_invalid.json"
53
+ return json.loads(mock_path.read_text())
54
+
55
+
50
56
  @pytest.fixture
51
57
  def api_error_response_with_links() -> Dict:
52
58
  mock_path = pathlib.Path(__file__).parent / "mocks" / "error_response_with_links.json"
@@ -0,0 +1,47 @@
1
+ {
2
+ "errors": [
3
+ {
4
+ "id": "6d516aab-7949-48e1-9205-89b9bc2e736b",
5
+ "status": "409",
6
+ "code": "STATE_ERROR.ENTITY_STATE_INVALID",
7
+ "title": "appStoreVersions with id '409ebefb-ebd1-4f1a-903d-6ba16e013ebf' is not in valid state.",
8
+ "detail": "This resource cannot be reviewed, please check associated errors to see why.",
9
+ "meta": {
10
+ "associatedErrors": {
11
+ "/v1/appStoreVersionLocalizations/253cf0c8-8057-49b7-be16-3b1cc78837e5": [
12
+ {
13
+ "id": "00190291-bf3a-417d-903c-804640a7df60",
14
+ "status": "409",
15
+ "code": "ENTITY_ERROR.ATTRIBUTE.REQUIRED",
16
+ "title": "The provided entity is missing a required attribute",
17
+ "detail": "You must provide a value for the attribute 'description' with this request",
18
+ "source": {
19
+ "pointer": "/data/attributes/description"
20
+ }
21
+ },
22
+ {
23
+ "id": "d5e83b1c-85b5-44ea-a9ba-5f2f3aa0cba0",
24
+ "status": "409",
25
+ "code": "ENTITY_ERROR.ATTRIBUTE.REQUIRED",
26
+ "title": "The provided entity is missing a required attribute",
27
+ "detail": "You must provide a value for the attribute 'keywords' with this request",
28
+ "source": {
29
+ "pointer": "/data/attributes/keywords"
30
+ }
31
+ },
32
+ {
33
+ "id": "5d9f0f60-8791-4bed-bb98-435250599281",
34
+ "status": "409",
35
+ "code": "ENTITY_ERROR.ATTRIBUTE.REQUIRED",
36
+ "title": "The provided entity is missing a required attribute",
37
+ "detail": "You must provide a value for the attribute 'supportUrl' with this request",
38
+ "source": {
39
+ "pointer": "/data/attributes/supportUrl"
40
+ }
41
+ }
42
+ ]
43
+ }
44
+ }
45
+ }
46
+ ]
47
+ }
@@ -0,0 +1,22 @@
1
+ from __future__ import annotations
2
+
3
+ from codemagic.apple.resources import ErrorResponse
4
+
5
+
6
+ def test_error_response_initialization(api_error_response):
7
+ error_response = ErrorResponse(api_error_response)
8
+ assert error_response.dict() == api_error_response
9
+
10
+
11
+ def test_error_response_with_links(api_error_response_with_links):
12
+ error_response = ErrorResponse(api_error_response_with_links)
13
+ assert error_response.dict() == api_error_response_with_links
14
+
15
+
16
+ def test_error_iter_associated_errors(api_error_response_entity_state_invalid):
17
+ error_response = ErrorResponse(api_error_response_entity_state_invalid)
18
+ associated_errors = list(error_response.iter_associated_errors())
19
+ assert len(associated_errors) == 3
20
+ assert associated_errors[0].source_pointer == "/data/attributes/description"
21
+ assert associated_errors[1].source_pointer == "/data/attributes/keywords"
22
+ assert associated_errors[2].source_pointer == "/data/attributes/supportUrl"