codemagic-cli-tools 0.47.3__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.3 → codemagic_cli_tools-0.48.0}/PKG-INFO +1 -1
  2. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/pyproject.toml +2 -1
  3. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/__version__.py +1 -1
  4. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/__version__.py-e +1 -1
  5. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/resource_manager.py +2 -7
  6. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/versioning/review_submissions.py +9 -0
  7. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/enums.py +10 -0
  8. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/error_response.py +19 -0
  9. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/cli_app.py +33 -2
  10. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/google_play/api_client.py +7 -6
  11. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/google_play/api_error.py +13 -9
  12. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/simulator/simulator.py +3 -7
  13. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/abstract_base_action.py +1 -0
  14. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/action_groups/app_store_versions_action_group.py +34 -0
  15. codemagic_cli_tools-0.48.0/src/codemagic/tools/_app_store_connect/action_groups/review_submission_items_actions_group.py +123 -0
  16. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/action_groups/review_submissions_actions_group.py +20 -0
  17. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/arguments.py +29 -11
  18. codemagic_cli_tools-0.48.0/src/codemagic/tools/_app_store_connect/errors.py +15 -0
  19. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/resource_manager_mixin.py +32 -7
  20. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/app_store_connect.py +8 -4
  21. codemagic_cli_tools-0.48.0/src/codemagic/utilities/case_conversion.py +9 -0
  22. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/test_resource_manager.py +0 -17
  23. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/resources/conftest.py +6 -0
  24. codemagic_cli_tools-0.48.0/tests/apple/resources/enums/test_certificate_type.py +12 -0
  25. codemagic_cli_tools-0.48.0/tests/apple/resources/mocks/error_response_entity_state_invalid.json +47 -0
  26. codemagic_cli_tools-0.48.0/tests/apple/resources/test_error_response.py +22 -0
  27. codemagic_cli_tools-0.48.0/tests/utilities/test_case_conversion.py +37 -0
  28. codemagic_cli_tools-0.47.3/src/codemagic/tools/_app_store_connect/action_groups/review_submission_items_actions_group.py +0 -49
  29. codemagic_cli_tools-0.47.3/src/codemagic/tools/_app_store_connect/errors.py +0 -5
  30. codemagic_cli_tools-0.47.3/tests/apple/resources/test_error_response.py +0 -13
  31. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/LICENSE +0 -0
  32. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/README.md +0 -0
  33. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/__init__.py +0 -0
  34. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/__init__.py +0 -0
  35. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/__init__.py +0 -0
  36. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/api_client.py +0 -0
  37. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/api_error.py +0 -0
  38. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/api_session.py +0 -0
  39. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/apps/__init__.py +0 -0
  40. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/apps/apps.py +0 -0
  41. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/builds/__init__.py +0 -0
  42. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/builds/builds.py +0 -0
  43. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/json_web_token_manager.py +0 -0
  44. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/provisioning/__init__.py +0 -0
  45. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/provisioning/bundle_id_capabilities.py +0 -0
  46. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/provisioning/bundle_ids.py +0 -0
  47. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/provisioning/devices.py +0 -0
  48. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/provisioning/profiles.py +0 -0
  49. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/provisioning/signing_certificates.py +0 -0
  50. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/testflight/__init__.py +0 -0
  51. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/testflight/beta_groups.py +0 -0
  52. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/type_declarations.py +0 -0
  53. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/versioning/__init__.py +0 -0
  54. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/versioning/app_store_version_localizations.py +0 -0
  55. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/versioning/app_store_version_submissions.py +0 -0
  56. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/versioning/app_store_versions.py +0 -0
  57. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/versioning/beta_app_review_submissions.py +0 -0
  58. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/versioning/beta_build_localizations.py +0 -0
  59. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/versioning/pre_release_versions.py +0 -0
  60. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/versioning/review_submission_items.py +0 -0
  61. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/__init__.py +0 -0
  62. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/app.py +0 -0
  63. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/app_store_version.py +0 -0
  64. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/app_store_version_localization.py +0 -0
  65. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/app_store_version_submission.py +0 -0
  66. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/beta_app_localization.py +0 -0
  67. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/beta_app_review_detail.py +0 -0
  68. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/beta_app_review_submission.py +0 -0
  69. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/beta_build_localization.py +0 -0
  70. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/beta_group.py +0 -0
  71. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/build.py +0 -0
  72. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/build_beta_detail.py +0 -0
  73. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/bundle_id.py +0 -0
  74. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/bundle_id_capability.py +0 -0
  75. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/device.py +0 -0
  76. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/pre_release_version.py +0 -0
  77. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/profile.py +0 -0
  78. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/resource.py +0 -0
  79. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/review_submission.py +0 -0
  80. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/review_submission_item.py +0 -0
  81. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/signing_certificate.py +0 -0
  82. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/__init__.py +0 -0
  83. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/action_group.py +0 -0
  84. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/argument/__init__.py +0 -0
  85. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/argument/action_callable.py +0 -0
  86. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/argument/argument.py +0 -0
  87. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/argument/argument_formatter.py +0 -0
  88. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/argument/argument_parser_builder.py +0 -0
  89. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/argument/argument_properties.py +0 -0
  90. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/argument/common_argument_types.py +0 -0
  91. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/argument/typed_cli_argument.py +0 -0
  92. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/cli_help_formatter.py +0 -0
  93. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/cli_process.py +0 -0
  94. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/cli_process_stream.py +0 -0
  95. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/cli_types.py +0 -0
  96. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/colors.py +0 -0
  97. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/environment.py +0 -0
  98. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/data/jars/bundletool-all-1.13.1.jar +0 -0
  99. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/google/__init__.py +0 -0
  100. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/google/errors.py +0 -0
  101. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/google/firebase_client.py +0 -0
  102. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/google/google_client.py +0 -0
  103. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/google/resource_managers/__init__.py +0 -0
  104. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/google/resource_managers/mixins/__init__.py +0 -0
  105. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/google/resource_managers/mixins/acting_manager_mixin.py +0 -0
  106. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/google/resource_managers/mixins/listing_manager_mixin.py +0 -0
  107. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/google/resource_managers/release_manager.py +0 -0
  108. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/google/resource_managers/resource_manager.py +0 -0
  109. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/google/resources/__init__.py +0 -0
  110. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/google/resources/identifiers/__init__.py +0 -0
  111. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/google/resources/identifiers/app_identifier.py +0 -0
  112. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/google/resources/identifiers/resource_identifier.py +0 -0
  113. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/google/resources/release.py +0 -0
  114. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/google/resources/release_notes.py +0 -0
  115. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/google/resources/resource.py +0 -0
  116. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/google_play/__init__.py +0 -0
  117. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/google_play/resources/__init__.py +0 -0
  118. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/google_play/resources/edit.py +0 -0
  119. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/google_play/resources/enums.py +0 -0
  120. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/google_play/resources/resource.py +0 -0
  121. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/google_play/resources/track.py +0 -0
  122. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/mixins/__init__.py +0 -0
  123. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/mixins/path_finder.py +0 -0
  124. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/mixins/running_cli_app.py +0 -0
  125. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/mixins/str_converter.py +0 -0
  126. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/__init__.py +0 -0
  127. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/altool/__init__.py +0 -0
  128. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/altool/altool.py +0 -0
  129. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/altool/altool_result.py +0 -0
  130. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/altool/enums.py +0 -0
  131. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/android_signing_info.py +0 -0
  132. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/application_package/__init__.py +0 -0
  133. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/application_package/abstract_package.py +0 -0
  134. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/application_package/ipa.py +0 -0
  135. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/application_package/macos_package.py +0 -0
  136. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/bundle_id_detector.py +0 -0
  137. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/certificate.py +0 -0
  138. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/certificate_attributes.py +0 -0
  139. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/certificate_p12_exporter.py +0 -0
  140. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/code_sign_entitlements.py +0 -0
  141. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/code_signing_settings_manager.py +0 -0
  142. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/enums.py +0 -0
  143. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/export_options.py +0 -0
  144. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/json_serializable.py +0 -0
  145. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/junit/__init__.py +0 -0
  146. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/junit/definitions.py +0 -0
  147. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/junit/printer.py +0 -0
  148. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/keystore.py +0 -0
  149. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/pbx_project.py +0 -0
  150. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/private_key.py +0 -0
  151. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/provisioning_profile.py +0 -0
  152. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/simulator/__init__.py +0 -0
  153. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/simulator/core_simulator_service.py +0 -0
  154. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/simulator/runtime.py +0 -0
  155. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/table/__init__.py +0 -0
  156. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/table/line.py +0 -0
  157. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/table/table.py +0 -0
  158. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/xcode.py +0 -0
  159. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/xcodebuild.py +0 -0
  160. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/xcpretty.py +0 -0
  161. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/xctests/__init__.py +0 -0
  162. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/xctests/collector.py +0 -0
  163. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/xctests/converter.py +0 -0
  164. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/xctests/xcresult.py +0 -0
  165. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/xctests/xcresulttool.py +0 -0
  166. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/py.typed +0 -0
  167. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/scripts/code_signing_manager.rb +0 -0
  168. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/shell_tools/__init__.py +0 -0
  169. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/shell_tools/abstract_shell_tool.py +0 -0
  170. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/shell_tools/keytool.py +0 -0
  171. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/__init__.py +0 -0
  172. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/__init__.py +0 -0
  173. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/action_group.py +0 -0
  174. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/action_groups/__init__.py +0 -0
  175. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/action_groups/app_store_version_localizations_action_group.py +0 -0
  176. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/action_groups/app_store_version_submissions_action_group.py +0 -0
  177. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/action_groups/apps_action_group.py +0 -0
  178. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/action_groups/beta_app_review_submissions_action_group.py +0 -0
  179. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/action_groups/beta_build_localizations_action_group.py +0 -0
  180. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/action_groups/beta_groups_action_group.py +0 -0
  181. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/action_groups/builds_action_group.py +0 -0
  182. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/actions/__init__.py +0 -0
  183. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/actions/publish_action.py +0 -0
  184. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/resource_printer.py +0 -0
  185. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_xcode_project/__init__.py +0 -0
  186. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_xcode_project/arguments.py +0 -0
  187. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/android_app_bundle.py +0 -0
  188. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/android_keystore/__init__.py +0 -0
  189. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/android_keystore/__main__.py +0 -0
  190. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/android_keystore/android_keystore.py +0 -0
  191. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/android_keystore/argument_types.py +0 -0
  192. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/android_keystore/arguments.py +0 -0
  193. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/codemagic_cli_tools.py +0 -0
  194. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/firebase_app_distribution/__init__.py +0 -0
  195. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/firebase_app_distribution/__main__.py +0 -0
  196. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/firebase_app_distribution/action_groups/__init__.py +0 -0
  197. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/firebase_app_distribution/action_groups/firebase_action_groups.py +0 -0
  198. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/firebase_app_distribution/action_groups/releases_action_group.py +0 -0
  199. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/firebase_app_distribution/actions/__init__.py +0 -0
  200. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/firebase_app_distribution/actions/get_latest_build_version_action.py +0 -0
  201. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/firebase_app_distribution/argument_types.py +0 -0
  202. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/firebase_app_distribution/arguments.py +0 -0
  203. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/firebase_app_distribution/errors.py +0 -0
  204. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/firebase_app_distribution/firebase_app_distribution.py +0 -0
  205. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/firebase_app_distribution/firebase_app_distribution_action.py +0 -0
  206. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/firebase_app_distribution/resource_printer.py +0 -0
  207. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/git_changelog.py +0 -0
  208. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/google_play/__init__.py +0 -0
  209. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/google_play/__main__.py +0 -0
  210. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/google_play/action_groups/__init__.py +0 -0
  211. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/google_play/action_groups/google_play_action_groups.py +0 -0
  212. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/google_play/action_groups/tracks_action_group.py +0 -0
  213. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/google_play/actions/__init__.py +0 -0
  214. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/google_play/actions/get_latest_build_number_action.py +0 -0
  215. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/google_play/argument_types.py +0 -0
  216. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/google_play/arguments.py +0 -0
  217. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/google_play/errors.py +0 -0
  218. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/google_play/google_play.py +0 -0
  219. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/google_play/google_play_base_action.py +0 -0
  220. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/keychain.py +0 -0
  221. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/universal_apk_generator.py +0 -0
  222. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/xcode_project.py +0 -0
  223. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/utilities/__init__.py +0 -0
  224. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/utilities/auditing/__init__.py +0 -0
  225. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/utilities/auditing/base_auditor.py +0 -0
  226. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/utilities/auditing/exception_auditor.py +0 -0
  227. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/utilities/auditing/http_request_auditor.py +0 -0
  228. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/utilities/backwards_file_reader.py +0 -0
  229. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/utilities/decorators.py +0 -0
  230. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/utilities/levenshtein_distance.py +0 -0
  231. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/utilities/log.py +0 -0
  232. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/utilities/versions.py +0 -0
  233. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/__init__.py +0 -0
  234. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/__init__.py +0 -0
  235. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/__init__.py +0 -0
  236. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/apps/__init__.py +0 -0
  237. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/apps/test_apps.py +0 -0
  238. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/builds/__init__.py +0 -0
  239. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/builds/test_builds.py +0 -0
  240. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/provisioning/__init__.py +0 -0
  241. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/provisioning/conftest.py +0 -0
  242. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/provisioning/test_bundle_id_capabilities.py +0 -0
  243. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/provisioning/test_bundle_ids.py +0 -0
  244. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/provisioning/test_devices.py +0 -0
  245. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/provisioning/test_profiles.py +0 -0
  246. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/provisioning/test_signing_certificates.py +0 -0
  247. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/resource_manager_test_base.py +0 -0
  248. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/test_api_client.py +0 -0
  249. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/test_api_session.py +0 -0
  250. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/test_json_web_token_manager.py +0 -0
  251. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/testflight/__init__.py +0 -0
  252. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/testflight/test_beta_groups.py +0 -0
  253. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/versioning/test_app_store_version_localizations.py +0 -0
  254. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/versioning/test_app_store_version_submissions.py +0 -0
  255. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/versioning/test_app_store_versions.py +0 -0
  256. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/versioning/test_beta_app_review_submissions.py +0 -0
  257. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/versioning/test_beta_build_localizations.py +0 -0
  258. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/versioning/test_pre_release_versions.py +0 -0
  259. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/versioning/test_review_submission_items.py +0 -0
  260. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/versioning/test_review_submissions.py +0 -0
  261. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/resources/__init__.py +0 -0
  262. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/resources/enums/__init__.py +0 -0
  263. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/resources/enums/test_profile_type.py +0 -0
  264. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/resources/mocks/app_store_version.json +0 -0
  265. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/resources/mocks/build.json +0 -0
  266. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/resources/mocks/bundle_id.json +0 -0
  267. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/resources/mocks/bundle_id_capability.json +0 -0
  268. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/resources/mocks/certificate.json +0 -0
  269. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/resources/mocks/device.json +0 -0
  270. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/resources/mocks/error_response.json +0 -0
  271. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/resources/mocks/error_response_with_links.json +0 -0
  272. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/resources/mocks/mock_resource.json +0 -0
  273. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/resources/mocks/pre_release_version.json +0 -0
  274. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/resources/mocks/profile.json +0 -0
  275. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/resources/test_app_store_version_resource.py +0 -0
  276. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/resources/test_build_resource.py +0 -0
  277. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/resources/test_bundle_id_capability_resource.py +0 -0
  278. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/resources/test_bundle_id_resource.py +0 -0
  279. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/resources/test_device_resource.py +0 -0
  280. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/resources/test_pre_release_version_resource.py +0 -0
  281. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/resources/test_profile_resource.py +0 -0
  282. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/resources/test_resource.py +0 -0
  283. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/resources/test_signing_certificate_resource.py +0 -0
  284. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/resources/test_undefined_resource_fields.py +0 -0
  285. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/cli/__init__.py +0 -0
  286. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/cli/argument/__init__.py +0 -0
  287. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/cli/argument/common_argument_types/__init__.py +0 -0
  288. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/cli/argument/common_argument_types/test_bounded_number.py +0 -0
  289. {codemagic_cli_tools-0.47.3 → 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.3 → codemagic_cli_tools-0.48.0}/tests/cli/argument/common_argument_types/test_maybe_dir.py +0 -0
  291. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/cli/argument/test_argument.py +0 -0
  292. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/cli/mocks/utf-8-sample.txt +0 -0
  293. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/cli/test_cli_process.py +0 -0
  294. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/cli/test_decorators.py +0 -0
  295. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/conftest.py +0 -0
  296. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/google/__init__.py +0 -0
  297. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/google/conftest.py +0 -0
  298. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/google/test_firebase_client.py +0 -0
  299. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/google/test_live_firebase_client.py +0 -0
  300. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/google_play/__init__.py +0 -0
  301. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/google_play/resources/__init__.py +0 -0
  302. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/google_play/resources/conftest.py +0 -0
  303. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/google_play/resources/mocks/edit.json +0 -0
  304. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/google_play/resources/mocks/track.json +0 -0
  305. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/google_play/resources/test_edit_resource.py +0 -0
  306. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/google_play/resources/test_resource_print.py +0 -0
  307. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/google_play/resources/test_track_resource.py +0 -0
  308. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/google_play/test_api_client.py +0 -0
  309. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/mixins/__init__.py +0 -0
  310. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/mixins/test_string_converter.py +0 -0
  311. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/mocks/certificate.asn1 +0 -0
  312. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/mocks/encrypted.pem +0 -0
  313. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/mocks/encrypted.pem.pub +0 -0
  314. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/mocks/unencrypted.pem +0 -0
  315. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/mocks/unencrypted.pem.pub +0 -0
  316. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/__init__.py +0 -0
  317. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/altool/__init__.py +0 -0
  318. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/altool/mocks/mock_failure_auth.txt +0 -0
  319. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/altool/mocks/mock_failure_other.txt +0 -0
  320. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/altool/mocks/mock_upload_success.json +0 -0
  321. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/altool/mocks/mock_validation_failure.json +0 -0
  322. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/altool/test_altool_result.py +0 -0
  323. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/altool/test_altool_retrying.py +0 -0
  324. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/conftest.py +0 -0
  325. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/enums/__init__.py +0 -0
  326. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/enums/test_resource_enum.py +0 -0
  327. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/junit/__init__.py +0 -0
  328. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/junit/mocks/testsuite.xml +0 -0
  329. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/junit/test_xml_generation.py +0 -0
  330. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/mocks/certificate-no-password.p12 +0 -0
  331. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/mocks/certificate.p12 +0 -0
  332. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/mocks/codemagic_io_wildcard_development.mobileprovision +0 -0
  333. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/mocks/export_options.plist +0 -0
  334. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/mocks/mock.ipa +0 -0
  335. {codemagic_cli_tools-0.47.3 → 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.3 → codemagic_cli_tools-0.48.0}/tests/models/mocks/mock_0_icloud_container_environments.plist +0 -0
  337. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/mocks/mock_1_icloud_container_environments.plist +0 -0
  338. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/mocks/mock_2_icloud_container_environments.plist +0 -0
  339. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/mocks/mock_openssh_private_key +0 -0
  340. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/mocks/mock_rsa_private_key +0 -0
  341. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/mocks/mock_xcode/Contents/version.plist +0 -0
  342. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/simulator/__init__.py +0 -0
  343. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/simulator/mocks/devices.json +0 -0
  344. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/simulator/mocks/simulator.json +0 -0
  345. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/simulator/test_runtime.py +0 -0
  346. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/simulator/test_simulator.py +0 -0
  347. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/test_certificate.py +0 -0
  348. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/test_certificate_attributes.py +0 -0
  349. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/test_code_sign_entitlements.py +0 -0
  350. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/test_export_options.py +0 -0
  351. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/test_private_key.py +0 -0
  352. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/test_provisioning_profile.py +0 -0
  353. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/test_table.py +0 -0
  354. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/test_xcode.py +0 -0
  355. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/xctests/__init__.py +0 -0
  356. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/xctests/conftest.py +0 -0
  357. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/xctests/mocks/0_1NtPgUPcB1A83X977l5Q91ElstUeVDnqAhumk_VJG8DIS4GA1sb8ElPPHZZGYEHmNvnHU1VVaPDCw1tI8n3uXg__.json +0 -0
  358. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/xctests/mocks/0_5rAUs3HknUI7DU8Jyc5RlFcosqCXTOV-qwOaOE1Mul_ppK8QCta-NSxxCdtVg6i12km4zTR5l0SjgzfHGUNxog__.json +0 -0
  359. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/xctests/mocks/0_97T9qQZ3dEI1oDS6NvYTPcFk_jUXFJ0NRwyd5FZ2S585JGMtlqbF28Hc85yeifgKEnNoInoW93Za9c5QJCspeQ__.json +0 -0
  360. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/xctests/mocks/0_DVcJZnHFaQQlzl8czovv7RuDRQIToEr5_3lLe-Mn1Sm6VreJ5xoXEFqBaWNv0XRmSg00NJ77XzQKgddhfkuk7w__.json +0 -0
  361. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/xctests/mocks/0_FZMbIp5VAUEiJv1wUUM-K78Dtmb4o-titbTusDJqRuarbS9OatzAykygXo4NUqEoR9sxCIoeu8VDioQmbba6mw__.json +0 -0
  362. {codemagic_cli_tools-0.47.3 → 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.3 → codemagic_cli_tools-0.48.0}/tests/models/xctests/mocks/0_NnCmQ8rMqVyUBgL3ZDjfjJ9Vt1AMGeMzZPkDH30rGMYer0pFDpp4UDZlCEHRImO-48LdC_KdcbjP70IZA6zKUQ__.json +0 -0
  364. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/xctests/mocks/0_YK9aPHVT-grv_ZVooRT79GBO9n82BNogkuWVzFO6itJEtbtsRTQpK2-0ZDLot1JpCfPb26aZwEZjeb9G4GHiBQ__.json +0 -0
  365. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/xctests/mocks/0__H1_RrdBT9b-ZhkWCQiRKpHlwURmyWUudeOhj5UslLXhXl8mr9w5CGqdobi9A5wCVEIRMsO4yuFyzx2gMPr-_Q__.json +0 -0
  366. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/xctests/mocks/0_evvkuGf92MVrmIvhr07911LuRTiPBKDjIQ0q_7L-mPGGYkWVKMBPQ5pB5lbjoaOnvr0fpC9k003EunfwSdss2g__.json +0 -0
  367. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/xctests/mocks/actions_invocation_record.json +0 -0
  368. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/xctests/test_collector.py +0 -0
  369. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/xctests/test_converter.py +0 -0
  370. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/xctests/test_xcresult.py +0 -0
  371. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/shell_tools/__init__.py +0 -0
  372. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/shell_tools/keytool/__init__.py +0 -0
  373. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/shell_tools/keytool/conftest.py +0 -0
  374. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/shell_tools/keytool/mocks/android.ks +0 -0
  375. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/shell_tools/keytool/mocks/non-rfc-cert-keystore.jks +0 -0
  376. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/shell_tools/keytool/mocks/non-rfc-cert-keystore.p12 +0 -0
  377. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/shell_tools/keytool/mocks/rfc-cert-keystore.jks +0 -0
  378. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/shell_tools/keytool/mocks/rfc-cert-keystore.p12 +0 -0
  379. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/shell_tools/keytool/test_get_certificate.py +0 -0
  380. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/shell_tools/keytool/test_get_certificates.py +0 -0
  381. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/shell_tools/keytool/test_validate.py +0 -0
  382. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/tools/__init__.py +0 -0
  383. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/tools/app_store_connect/__init__.py +0 -0
  384. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/tools/app_store_connect/arguments/__init__.py +0 -0
  385. {codemagic_cli_tools-0.47.3 → 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.3 → codemagic_cli_tools-0.48.0}/tests/tools/app_store_connect/conftest.py +0 -0
  387. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/tools/app_store_connect/mocks/AuthKeyMock.p8 +0 -0
  388. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/tools/app_store_connect/test_from_cli_args.py +0 -0
  389. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/tools/app_store_connect/test_publish_action.py +0 -0
  390. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/tools/mocks/firebase_releases.json +0 -0
  391. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/tools/mocks/google_play_tracks.json +0 -0
  392. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/tools/test_android_app_bundle.py +0 -0
  393. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/tools/test_firebase_app_distribution.py +0 -0
  394. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/tools/test_google_play.py +0 -0
  395. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/tools/test_keychain.py +0 -0
  396. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/tools/test_universal_apk_generator.py +0 -0
  397. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/utilities/__init__.py +0 -0
  398. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/utilities/decorators/__init__.py +0 -0
  399. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/utilities/decorators/test_deprecated.py +0 -0
  400. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/utilities/test_backwards_file_reader.py +0 -0
  401. {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/utilities/test_levenshtein_distance.py +0 -0
  402. {codemagic_cli_tools-0.47.3 → 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.3
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.3"
3
+ version = "0.48.0"
4
4
  description = "CLI tools used in Codemagic builds"
5
5
  readme = "README.md"
6
6
  authors = [
@@ -55,6 +55,7 @@ pytest = "*"
55
55
  pytest-cov = "*"
56
56
  ruff = "*"
57
57
  types-requests = "*"
58
+ typing-extensions = "*"
58
59
 
59
60
  [build-system]
60
61
  requires = ["poetry-core>=1.0.0"]
@@ -1,5 +1,5 @@
1
1
  __title__ = "codemagic-cli-tools"
2
2
  __description__ = "CLI tools used in Codemagic builds"
3
- __version__ = '0.47.3'
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.3.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)]
@@ -134,6 +134,16 @@ class CertificateType(ResourceEnum):
134
134
  return CertificateType.DISTRIBUTION
135
135
  elif profile_type is profile_type.TVOS_APP_ADHOC:
136
136
  return CertificateType.DISTRIBUTION
137
+ elif profile_type is profile_type.MAC_CATALYST_APP_DEVELOPMENT:
138
+ return CertificateType.DEVELOPMENT
139
+ elif profile_type is profile_type.MAC_CATALYST_APP_STORE:
140
+ return CertificateType.DISTRIBUTION
141
+ elif profile_type is profile_type.MAC_CATALYST_APP_DIRECT:
142
+ return CertificateType.DEVELOPER_ID_APPLICATION
143
+ elif profile_type is profile_type.IOS_APP_INHOUSE:
144
+ return CertificateType.DISTRIBUTION
145
+ elif profile_type is profile_type.TVOS_APP_INHOUSE:
146
+ return CertificateType.DISTRIBUTION
137
147
  else:
138
148
  raise ValueError(f"Certificate type for profile type {profile_type} is unknown")
139
149
 
@@ -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))
@@ -43,9 +43,23 @@ from .cli_types import ObfuscatedCommand
43
43
  from .cli_types import ObfuscationPattern
44
44
  from .colors import Colors
45
45
 
46
+ try:
47
+ from typing import assert_never # type: ignore
48
+ except ImportError:
49
+
50
+ def assert_never(arg) -> NoReturn: # type: ignore
51
+ raise AssertionError(f"Expected code to be unreachable, but got: {arg!r}")
52
+
53
+
46
54
  if TYPE_CHECKING:
47
55
  from argparse import _SubParsersAction as SubParsersAction
48
56
 
57
+ from typing_extensions import Literal
58
+
59
+
60
+ class ArgumentValueEncodingError(Exception):
61
+ pass
62
+
49
63
 
50
64
  class CliAppException(Exception): # noqa: N818
51
65
  def __init__(self, message: str, cli_process: Optional[CliProcess] = None):
@@ -191,6 +205,20 @@ class CliApp(metaclass=abc.ABCMeta):
191
205
 
192
206
  return parser, args
193
207
 
208
+ @classmethod
209
+ def _validate_args(cls, cli_args: argparse.Namespace) -> Literal[True]:
210
+ for destination_name, argument_value in vars(cli_args).items():
211
+ if not isinstance(argument_value, str):
212
+ continue
213
+
214
+ try:
215
+ argument_value.encode()
216
+ except UnicodeEncodeError:
217
+ error = f"Unknown encoding for argument {destination_name} value: {argument_value}"
218
+ raise ArgumentValueEncodingError(error)
219
+
220
+ return True
221
+
194
222
  @classmethod
195
223
  def invoke_cli(cls) -> NoReturn:
196
224
  os.environ["_CLI_INVOCATION"] = "true"
@@ -208,10 +236,12 @@ class CliApp(metaclass=abc.ABCMeta):
208
236
  raise argparse.ArgumentError(args.action, "the following argument is required: action")
209
237
  elif cls._action_requires_subcommand(args.action) and not args.action_subcommand:
210
238
  raise argparse.ArgumentError(args.action_subcommand, "the following argument is required: subcommand")
239
+ elif not cls._validate_args(args):
240
+ assert_never("Invalid args") # In case of invalid args validation will raise
211
241
  else:
212
242
  CliApp._running_app = cls._create_instance(parser, args)
213
243
  CliApp._running_app._invoke_action(args)
214
- except argparse.ArgumentError as argument_error:
244
+ except (ArgumentValueEncodingError, argparse.ArgumentError) as argument_error:
215
245
  parser.error(str(argument_error))
216
246
  status = 2
217
247
  except cls.CLI_EXCEPTION_TYPE as cli_exception:
@@ -235,7 +265,8 @@ class CliApp(metaclass=abc.ABCMeta):
235
265
 
236
266
  @classmethod
237
267
  def _log_cli_invoke_started(cls):
238
- exec_line = f'Execute {" ".join(map(shlex.quote, sys.argv))}'
268
+ safe_args = (arg.encode("utf-8", errors="replace").decode() for arg in sys.argv)
269
+ exec_line = f'Execute {" ".join(map(shlex.quote, safe_args))}'
239
270
  install_line = f"From {pathlib.Path(__file__).parent.parent.resolve()}"
240
271
  version_line = f"Using Python {platform.python_version()} on {platform.system()} {platform.release()}"
241
272
  separator = "-" * max(len(exec_line), len(version_line), len(install_line))
@@ -9,6 +9,7 @@ from typing import Union
9
9
  import httplib2
10
10
  from googleapiclient import discovery
11
11
  from googleapiclient import errors
12
+ from oauth2client import client
12
13
  from oauth2client.service_account import ServiceAccountCredentials
13
14
 
14
15
  from codemagic.utilities import log
@@ -68,7 +69,7 @@ class GooglePlayDeveloperAPIClient:
68
69
  http=http,
69
70
  cache_discovery=False,
70
71
  )
71
- except (errors.Error, errors.HttpError) as e:
72
+ except (errors.Error, client.Error) as e:
72
73
  raise AuthorizationError(e) from e
73
74
 
74
75
  @property
@@ -85,7 +86,7 @@ class GooglePlayDeveloperAPIClient:
85
86
  edit_request = self.edits_service.insert(body={}, packageName=package_name)
86
87
  edit_response = edit_request.execute()
87
88
  self._logger.debug(f"Created edit {edit_response} for package {package_name!r}")
88
- except (errors.Error, errors.HttpError) as e:
89
+ except (errors.Error, client.Error) as e:
89
90
  raise EditError("create", package_name, e) from e
90
91
  else:
91
92
  return Edit(**edit_response)
@@ -100,7 +101,7 @@ class GooglePlayDeveloperAPIClient:
100
101
  )
101
102
  delete_request.execute()
102
103
  self._logger.debug(f"Deleted edit {edit_id} for package {package_name!r}")
103
- except (errors.Error, errors.HttpError) as e:
104
+ except (errors.Error, client.Error) as e:
104
105
  if isinstance(e, errors.HttpError) and "edit has already been successfully committed" in e.error_details:
105
106
  # This can be ignored as the commit has already been exhausted
106
107
  return
@@ -136,7 +137,7 @@ class GooglePlayDeveloperAPIClient:
136
137
  )
137
138
  track_response = track_request.execute()
138
139
  self._logger.debug(f"Got track {track_name!r} for package {package_name!r}: {track_response}")
139
- except (errors.Error, errors.HttpError) as e:
140
+ except (errors.Error, client.Error) as e:
140
141
  raise GetResourceError("track", package_name, e) from e
141
142
  else:
142
143
  return Track(**track_response)
@@ -161,7 +162,7 @@ class GooglePlayDeveloperAPIClient:
161
162
  )
162
163
  tracks_response = tracks_request.execute()
163
164
  self._logger.debug(f"Got tracks for package {package_name!r}: {tracks_response}")
164
- except (errors.Error, errors.HttpError) as e:
165
+ except (errors.Error, client.Error) as e:
165
166
  raise ListResourcesError("tracks", package_name, e) from e
166
167
  else:
167
168
  return [Track(**track) for track in tracks_response["tracks"]]
@@ -189,7 +190,7 @@ class GooglePlayDeveloperAPIClient:
189
190
  try:
190
191
  track_response = track_request.execute()
191
192
  commit_response = commit_request.execute()
192
- except (errors.Error, errors.HttpError) as e:
193
+ except (errors.Error, client.Error) as e:
193
194
  raise UpdateResourceError("track", package_name, e) from e
194
195
 
195
196
  self._logger.debug(f"Track {track.track!r} update response for package {package_name!r}: {track_response}")
@@ -3,26 +3,30 @@ from abc import abstractmethod
3
3
  from typing import Union
4
4
 
5
5
  from googleapiclient import errors
6
+ from oauth2client import client
6
7
 
7
8
 
8
9
  class GooglePlayDeveloperAPIClientError(Exception):
9
10
  @classmethod
10
- def _get_error_reason(cls, error: Union[errors.Error, errors.HttpError]) -> str:
11
- if isinstance(error, errors.Error):
12
- return str(error)
13
- else:
14
- reason = error._get_reason()
15
- return reason or "Http Error"
11
+ def _get_error_reason(cls, error: Union[errors.Error, client.Error]) -> str:
12
+ if isinstance(error, errors.HttpError):
13
+ return error._get_reason() or "Http Error"
14
+ return str(error)
16
15
 
17
16
 
18
17
  class AuthorizationError(GooglePlayDeveloperAPIClientError):
19
- def __init__(self, error: Union[errors.Error, errors.HttpError]):
18
+ def __init__(self, error: Union[errors.Error, client.Error]):
20
19
  reason = self._get_error_reason(error)
21
20
  super().__init__(f"Unable to authorize with provided credentials. {reason}")
22
21
 
23
22
 
24
23
  class EditError(GooglePlayDeveloperAPIClientError):
25
- def __init__(self, action: str, package_name: str, error: Union[errors.Error, errors.HttpError]):
24
+ def __init__(
25
+ self,
26
+ action: str,
27
+ package_name: str,
28
+ error: Union[errors.Error, client.Error],
29
+ ):
26
30
  reason = self._get_error_reason(error)
27
31
  super().__init__(f'Unable to {action} an edit for package "{package_name}". {reason}')
28
32
 
@@ -32,7 +36,7 @@ class _RequestError(GooglePlayDeveloperAPIClientError, ABC):
32
36
  self,
33
37
  resource_description: str,
34
38
  package_name: str,
35
- request_error: Union[errors.Error, errors.HttpError],
39
+ request_error: Union[errors.Error, client.Error],
36
40
  ):
37
41
  self.package_name = package_name
38
42
  self.request_error = request_error
@@ -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
+ )