splunk-soar-sdk 3.6.0__tar.gz → 3.6.1__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 (263) hide show
  1. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/.github/workflows/integration_tests.yml +1 -2
  2. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/PKG-INFO +1 -1
  3. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/pyproject.toml +1 -1
  4. splunk_soar_sdk-3.6.1/release_notes.txt +21 -0
  5. splunk_soar_sdk-3.6.1/release_version.txt +1 -0
  6. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/cli/package/cli.py +33 -17
  7. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/meta/dependencies.py +28 -3
  8. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/cli/test_package_cli.py +53 -1
  9. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/example_app/app.json +5 -3
  10. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/example_app/uv.lock +3 -1
  11. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/example_app_with_webhook/app.json +5 -3
  12. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/example_app_with_webhook/uv.lock +3 -1
  13. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/uv.lock +1 -1
  14. splunk_soar_sdk-3.6.0/release_notes.txt +0 -37
  15. splunk_soar_sdk-3.6.0/release_version.txt +0 -1
  16. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/.github/ISSUE_TEMPLATE/bug.md +0 -0
  17. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  18. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/.github/pull_request_template.md +0 -0
  19. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/.github/scripts/generate_test_summary.py +0 -0
  20. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/.github/utils/github.js +0 -0
  21. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/.github/utils/update_version.py +0 -0
  22. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/.github/workflows/code_quality.yml +0 -0
  23. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/.github/workflows/commit_hygiene.yml +0 -0
  24. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/.github/workflows/generate_docs.yml +0 -0
  25. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/.github/workflows/semantic_release.yml +0 -0
  26. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/.gitignore +0 -0
  27. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/.pre-commit-config.yaml +0 -0
  28. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/.releaserc +0 -0
  29. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/LICENSE +0 -0
  30. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/README.md +0 -0
  31. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/commitlint.config.js +0 -0
  32. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/docs/api_reference.rst +0 -0
  33. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/docs/app_structure/index.rst +0 -0
  34. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/docs/app_structure/pre-commit-config.yaml.rst +0 -0
  35. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/docs/app_structure/pyproject.toml.rst +0 -0
  36. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/docs/app_structure/src_app.rst +0 -0
  37. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/docs/changelog.rst +0 -0
  38. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/docs/cli_reference.rst +0 -0
  39. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/docs/conf.py +0 -0
  40. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/docs/custom_views/index.rst +0 -0
  41. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/docs/custom_views/reusable_components.md +0 -0
  42. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/docs/custom_views/templates.md +0 -0
  43. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/docs/custom_views/view_handlers.md +0 -0
  44. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/docs/getting_started/defining_asset.rst +0 -0
  45. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/docs/getting_started/first_action.rst +0 -0
  46. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/docs/getting_started/index.rst +0 -0
  47. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/docs/getting_started/init_app.rst +0 -0
  48. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/docs/getting_started/installation.rst +0 -0
  49. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/docs/getting_started/testing_and_building.rst +0 -0
  50. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/docs/index.rst +0 -0
  51. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/mcp_server/README.md +0 -0
  52. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/mcp_server/install.sh +0 -0
  53. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/mcp_server/mcp_config.json +0 -0
  54. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/mcp_server/pyproject.toml +0 -0
  55. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/mcp_server/pytest.ini +0 -0
  56. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/mcp_server/src/soar_test_assistant/__init__.py +0 -0
  57. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/mcp_server/src/soar_test_assistant/server.py +0 -0
  58. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/mcp_server/tests/__init__.py +0 -0
  59. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/mcp_server/tests/test_analyzer.py +0 -0
  60. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/mcp_server/uv.lock +0 -0
  61. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/__init__.py +0 -0
  62. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/abstract.py +0 -0
  63. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/action_results.py +0 -0
  64. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/actions_manager.py +0 -0
  65. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/apis/__init__.py +0 -0
  66. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/apis/artifact.py +0 -0
  67. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/apis/container.py +0 -0
  68. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/apis/es/findings.py +0 -0
  69. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/apis/utils.py +0 -0
  70. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/apis/vault.py +0 -0
  71. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/app.py +0 -0
  72. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/app_cli_runner.py +0 -0
  73. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/app_client.py +0 -0
  74. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/app_templates/basic_app/.gitignore +0 -0
  75. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/app_templates/basic_app/.pre-commit-config.yaml +0 -0
  76. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/app_templates/basic_app/logo.svg +0 -0
  77. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/app_templates/basic_app/logo_dark.svg +0 -0
  78. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/app_templates/basic_app/src/__init__.py +0 -0
  79. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/app_templates/basic_app/uv.lock +0 -0
  80. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/asset.py +0 -0
  81. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/asset_state.py +0 -0
  82. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/async_utils.py +0 -0
  83. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/cli/__init__.py +0 -0
  84. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/cli/cli.py +0 -0
  85. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/cli/init/__init__.py +0 -0
  86. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/cli/init/cli.py +0 -0
  87. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/cli/manifests/__init__.py +0 -0
  88. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/cli/manifests/cli.py +0 -0
  89. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/cli/manifests/deserializers.py +0 -0
  90. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/cli/manifests/processors.py +0 -0
  91. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/cli/manifests/serializers.py +0 -0
  92. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/cli/package/utils.py +0 -0
  93. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/cli/path_utils.py +0 -0
  94. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/cli/test/__init__.py +0 -0
  95. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/cli/test/cli.py +0 -0
  96. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/cli/utils.py +0 -0
  97. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/code_renderers/__init__.py +0 -0
  98. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/code_renderers/action_renderer.py +0 -0
  99. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/code_renderers/app_renderer.py +0 -0
  100. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/code_renderers/asset_renderer.py +0 -0
  101. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/code_renderers/renderer.py +0 -0
  102. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/code_renderers/templates/pyproject.toml.jinja +0 -0
  103. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/code_renderers/toml_renderer.py +0 -0
  104. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/colors.py +0 -0
  105. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/compat.py +0 -0
  106. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/crypto.py +0 -0
  107. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/decorators/__init__.py +0 -0
  108. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/decorators/action.py +0 -0
  109. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/decorators/make_request.py +0 -0
  110. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/decorators/on_es_poll.py +0 -0
  111. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/decorators/on_poll.py +0 -0
  112. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/decorators/test_connectivity.py +0 -0
  113. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/decorators/view_handler.py +0 -0
  114. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/decorators/webhook.py +0 -0
  115. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/es_client.py +0 -0
  116. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/exceptions.py +0 -0
  117. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/extras/__init__.py +0 -0
  118. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/extras/email/__init__.py +0 -0
  119. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/extras/email/processor.py +0 -0
  120. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/extras/email/rfc5322.py +0 -0
  121. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/extras/email/utils.py +0 -0
  122. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/field_utils.py +0 -0
  123. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/input_spec.py +0 -0
  124. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/logging.py +0 -0
  125. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/meta/__init__.py +0 -0
  126. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/meta/actions.py +0 -0
  127. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/meta/adapters.py +0 -0
  128. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/meta/app.py +0 -0
  129. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/meta/datatypes.py +0 -0
  130. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/meta/webhooks.py +0 -0
  131. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/models/__init__.py +0 -0
  132. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/models/artifact.py +0 -0
  133. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/models/attachment_input.py +0 -0
  134. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/models/container.py +0 -0
  135. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/models/finding.py +0 -0
  136. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/models/vault_attachment.py +0 -0
  137. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/models/view.py +0 -0
  138. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/params.py +0 -0
  139. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/paths.py +0 -0
  140. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/py.typed +0 -0
  141. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/shims/phantom/action_result.py +0 -0
  142. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/shims/phantom/app.py +0 -0
  143. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/shims/phantom/base_connector.py +0 -0
  144. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/shims/phantom/connector_result.py +0 -0
  145. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/shims/phantom/consts.py +0 -0
  146. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/shims/phantom/encryption_helper.py +0 -0
  147. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/shims/phantom/install_info.py +0 -0
  148. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/shims/phantom/json_keys.py +0 -0
  149. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/shims/phantom/ph_ipc.py +0 -0
  150. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/shims/phantom/vault.py +0 -0
  151. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/shims/phantom_common/app_interface/app_interface.py +0 -0
  152. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/shims/phantom_common/encryption/encryption_manager_factory.py +0 -0
  153. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/templates/base/base_template.html +0 -0
  154. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/templates/base/error.html +0 -0
  155. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/templates/base/header.html +0 -0
  156. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/templates/base/logo_header.html +0 -0
  157. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/templates/components/pie_chart.html +0 -0
  158. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/templates/widgets/widget_resize_snippet.html +0 -0
  159. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/templates/widgets/widget_template.html +0 -0
  160. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/types.py +0 -0
  161. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/views/__init__.py +0 -0
  162. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/views/component_registry.py +0 -0
  163. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/views/components/__init__.py +0 -0
  164. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/views/components/pie_chart.py +0 -0
  165. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/views/template_filters.py +0 -0
  166. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/views/template_renderer.py +0 -0
  167. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/views/view_parser.py +0 -0
  168. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/webhooks/__init__.py +0 -0
  169. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/webhooks/models.py +0 -0
  170. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/webhooks/routing.py +0 -0
  171. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/__init__.py +0 -0
  172. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/cli/__init__.py +0 -0
  173. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/cli/datapath_parse.py +0 -0
  174. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/cli/manifests/__init__.py +0 -0
  175. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/cli/manifests/test_processors.py +0 -0
  176. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/cli/manifests/test_python_version_resolution.py +0 -0
  177. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/cli/test_assets/converted_app/actions.py.txt +0 -0
  178. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/cli/test_cli.py +0 -0
  179. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/cli/test_convert_cli.py +0 -0
  180. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/cli/test_deserializers.py +0 -0
  181. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/cli/test_init_cli.py +0 -0
  182. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/cli/test_manifests_cli.py +0 -0
  183. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/cli/test_serializers.py +0 -0
  184. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/cli/test_test_cli.py +0 -0
  185. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/cli/test_utils.py +0 -0
  186. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/code_renderers/test_action_renderer.py +0 -0
  187. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/conftest.py +0 -0
  188. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/example_app/example_asset.json +0 -0
  189. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/example_app/logo.svg +0 -0
  190. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/example_app/logo_dark.svg +0 -0
  191. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/example_app/pyproject.toml +0 -0
  192. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/example_app/release_notes/v1.md +0 -0
  193. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/example_app/src/__init__.py +0 -0
  194. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/example_app/src/actions/__init__.py +0 -0
  195. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/example_app/src/actions/async_action.py +0 -0
  196. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/example_app/src/actions/generate_category.py +0 -0
  197. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/example_app/src/actions/reverse_string.py +0 -0
  198. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/example_app/src/app.py +0 -0
  199. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/example_app/src/ignoreme.txt +0 -0
  200. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/example_app/templates/reverse_string.html +0 -0
  201. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/example_app_with_webhook/example_asset.json +0 -0
  202. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/example_app_with_webhook/logo.svg +0 -0
  203. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/example_app_with_webhook/logo_dark.svg +0 -0
  204. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/example_app_with_webhook/pyproject.toml +0 -0
  205. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/example_app_with_webhook/src/__init__.py +0 -0
  206. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/example_app_with_webhook/src/app.py +0 -0
  207. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/integration/__init__.py +0 -0
  208. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/integration/conftest.py +0 -0
  209. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/integration/phantom_constants.py +0 -0
  210. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/integration/phantom_instance.py +0 -0
  211. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/integration/soar_client.py +0 -0
  212. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/integration/test_example_app.py +0 -0
  213. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/integration/test_example_app_with_webhook.py +0 -0
  214. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/interfaces/__init__.py +0 -0
  215. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/interfaces/test_artifact_interface.py +0 -0
  216. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/interfaces/test_container_interface.py +0 -0
  217. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/interfaces/test_vault_interface.py +0 -0
  218. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/meta/__init__.py +0 -0
  219. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/meta/test_actions.py +0 -0
  220. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/meta/test_adapters.py +0 -0
  221. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/meta/test_datatypes.py +0 -0
  222. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/meta/test_dependencies.py +0 -0
  223. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/meta/test_webhooks.py +0 -0
  224. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/mocks/__init__.py +0 -0
  225. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/mocks/dynamic_mocks.py +0 -0
  226. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/mocks/importable_action.py +0 -0
  227. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/stubs.py +0 -0
  228. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_action_results.py +0 -0
  229. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_actions_manager.py +0 -0
  230. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_app.py +0 -0
  231. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_app_action.py +0 -0
  232. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_app_action_params.py +0 -0
  233. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_app_action_results.py +0 -0
  234. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_app_client.py +0 -0
  235. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_app_runner.py +0 -0
  236. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_asset.py +0 -0
  237. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_asset_state.py +0 -0
  238. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_assets/splunk-sdk-2.1.0.tar.gz +0 -0
  239. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_async_integration.py +0 -0
  240. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_async_utils.py +0 -0
  241. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_attachment_input.py +0 -0
  242. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_code_renderers.py +0 -0
  243. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_compat.py +0 -0
  244. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_container.py +0 -0
  245. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_custom_views.py +0 -0
  246. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_email_processor.py +0 -0
  247. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_encryption.py +0 -0
  248. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_es_client.py +0 -0
  249. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_es_on_poll.py +0 -0
  250. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_field_utils.py +0 -0
  251. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_finding.py +0 -0
  252. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_input_spec.py +0 -0
  253. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_logging.py +0 -0
  254. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_make_request_action.py +0 -0
  255. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_on_poll.py +0 -0
  256. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_params.py +0 -0
  257. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_rfc5322.py +0 -0
  258. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_template_filters.py +0 -0
  259. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_template_renderer.py +0 -0
  260. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_test_connectivity.py +0 -0
  261. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_view_parser.py +0 -0
  262. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/webhooks/test_models.py +0 -0
  263. {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/webhooks/test_routing.py +0 -0
@@ -121,8 +121,7 @@ jobs:
121
121
  uv run soarapps package install \
122
122
  /tmp/example_app_with_webhook.tgz \
123
123
  "$phantom_ip" \
124
- --username "${{ vars.PHANTOM_USERNAME }}" \
125
- --force
124
+ --username "${{ vars.PHANTOM_USERNAME }}"
126
125
 
127
126
  - name: Run integration tests
128
127
  env:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: splunk-soar-sdk
3
- Version: 3.6.0
3
+ Version: 3.6.1
4
4
  Summary: The official framework for developing and testing Splunk SOAR Apps
5
5
  Project-URL: Homepage, https://github.com/phantomcyber/splunk-soar-sdk
6
6
  Project-URL: Documentation, https://github.com/phantomcyber/splunk-soar-sdk
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "splunk-soar-sdk"
3
- version = "3.6.0"
3
+ version = "3.6.1"
4
4
  description = "The official framework for developing and testing Splunk SOAR Apps"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.13, <3.15"
@@ -0,0 +1,21 @@
1
+ ## [3.6.1](https://github.com/phantomcyber/splunk-soar-sdk/compare/3.6.0...3.6.1) (2025-12-15)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * record paths in the manifest correctly when building wheels from source ([644889c](https://github.com/phantomcyber/splunk-soar-sdk/commit/644889c26bf2751df2d6166a30a47d0705b3344e))
7
+
8
+
9
+
10
+
11
+
12
+ ## [3.6.1](https://github.com/phantomcyber/splunk-soar-sdk/compare/3.6.0...3.6.1) (2025-12-15)
13
+
14
+
15
+ ### Bug Fixes
16
+
17
+ * record paths in the manifest correctly when building wheels from source ([644889c](https://github.com/phantomcyber/splunk-soar-sdk/commit/644889c26bf2751df2d6166a30a47d0705b3344e))
18
+
19
+
20
+
21
+
@@ -0,0 +1 @@
1
+ 3.6.1
@@ -27,35 +27,51 @@ package = typer.Typer()
27
27
  console = Console() # For printing lots of pretty colors and stuff
28
28
 
29
29
 
30
- async def collect_all_wheels(wheels: set[DependencyWheel]) -> list[tuple[str, bytes]]:
31
- """Asynchronously collect all wheels from the given set of DependencyWheel objects."""
32
- # Create progress bar for tracking wheel collection
30
+ async def collect_all_wheels(wheels: list[DependencyWheel]) -> list[tuple[str, bytes]]:
31
+ """Asynchronously collect all wheels from the given list of DependencyWheel objects.
32
+
33
+ Downloads/builds each unique wheel once while updating every DependencyWheel instance
34
+ so the manifest records the final wheel filenames.
35
+ """
36
+ dedupe_map: dict[int, list[DependencyWheel]] = {}
37
+ for wheel in wheels:
38
+ key = hash(wheel)
39
+ dedupe_map.setdefault(key, []).append(wheel)
40
+
33
41
  progress = tqdm(
34
- total=len(wheels),
42
+ total=len(dedupe_map),
35
43
  desc="Downloading wheels",
36
44
  unit="wheel",
37
45
  colour="green",
38
46
  ncols=80,
39
47
  )
40
48
 
41
- async def collect_from_wheel(wheel: DependencyWheel) -> list[tuple[str, bytes]]:
42
- result = []
43
- # This actually is covered, but pytest-cov branch coverage
44
- # has a bug with the end of async for loops
49
+ async def collect_from_wheel(
50
+ cache_key: int, wheel: DependencyWheel
51
+ ) -> tuple[int, list[tuple[str, bytes]]]:
52
+ result: list[tuple[str, bytes]] = []
45
53
  async for path, data in wheel.collect_wheels(): # pragma: no cover
46
54
  result.append((path, data))
47
- # Update progress bar after each wheel is processed
48
55
  progress.update(1)
49
- return result
56
+ return cache_key, result
50
57
 
51
- # Use asyncio.gather to truly run all wheel collections concurrently
52
58
  with contextlib.closing(progress):
53
- wheel_data_lists = await asyncio.gather(
54
- *(collect_from_wheel(wheel) for wheel in wheels)
59
+ gathered_results = await asyncio.gather(
60
+ *(
61
+ collect_from_wheel(key, wheel_group[0])
62
+ for key, wheel_group in dedupe_map.items()
63
+ )
55
64
  )
56
65
 
57
- # Use itertools.chain to flatten the list of lists
58
- return list(chain.from_iterable(wheel_data_lists))
66
+ cache = dict(gathered_results)
67
+
68
+ for key, wheel_group in dedupe_map.items():
69
+ for path, _ in cache[key]:
70
+ wheel_name = Path(path).name
71
+ for wheel in wheel_group:
72
+ wheel._record_built_wheel(wheel_name)
73
+
74
+ return list(chain.from_iterable(cache.values()))
59
75
 
60
76
 
61
77
  @package.command()
@@ -124,13 +140,13 @@ def build(
124
140
 
125
141
  with tarfile.open(output_file, "w:gz") as app_tarball:
126
142
  # Collect all wheels from both Python versions
127
- all_wheels = set(
143
+ all_wheels = (
128
144
  app_meta.pip313_dependencies.wheel + app_meta.pip314_dependencies.wheel
129
145
  )
130
146
 
131
147
  # Run the async collection function within an event loop
132
148
  console.print(
133
- f"[yellow]Collecting [bold]{len(all_wheels)}[/bold] wheel{'' if len(all_wheels) == 1 else 's'} for package[/]"
149
+ f"[yellow]Collecting [bold]{len(all_wheels)}[/bold] wheel{'' if len(set(all_wheels)) == 1 else 's'} for package[/]"
134
150
  )
135
151
  wheel_data = asyncio.run(collect_all_wheels(all_wheels))
136
152
 
@@ -219,18 +219,41 @@ class DependencyWheel(BaseModel):
219
219
  sdist: UvSourceDistribution | None = Field(exclude=True, default=None)
220
220
  source_dir: UvSourceDirectory | None = Field(exclude=True, default=None)
221
221
 
222
+ def _set_wheel_paths(self, wheel_name: str) -> str:
223
+ """Assign the final wheel path (with any existing prefix) to both arches."""
224
+ base_path = Path(self.input_file or "wheels/shared")
225
+ # If there's already a filename component, replace it instead of nesting it
226
+ if base_path.suffix == ".whl":
227
+ base_path = base_path.parent
228
+ wheel_path = (base_path / wheel_name).as_posix()
229
+ self.input_file = wheel_path
230
+ self.input_file_aarch64 = wheel_path
231
+ return wheel_path
232
+
233
+ def set_placeholder_wheel_name(self, version: str) -> None:
234
+ """Populate a clearly placeholder wheel path when we expect to build from source."""
235
+ # Use only a filename here; platform-specific prefixes are added later.
236
+ self.input_file = "<to_be_built>.whl"
237
+ self.input_file_aarch64 = "<to_be_built>.whl"
238
+
239
+ def _record_built_wheel(self, wheel_name: str) -> str:
240
+ """Fill in missing wheel paths once a wheel has been built from source."""
241
+ return self._set_wheel_paths(wheel_name)
242
+
222
243
  async def collect_wheels(self) -> AsyncGenerator[tuple[str, bytes]]:
223
244
  """Collect a list of wheel files to fetch for this dependency across all platforms."""
224
245
  if self.wheel is None and self.sdist is not None:
225
246
  logger.info(f"Building sdist for {self.input_file}")
226
247
  wheel_name, wheel_bytes = await self.sdist.fetch_and_build()
227
- yield (f"wheels/shared/{wheel_name}", wheel_bytes)
248
+ wheel_path = self._record_built_wheel(wheel_name)
249
+ yield (wheel_path, wheel_bytes)
228
250
  return
229
251
 
230
252
  if self.wheel is None and self.source_dir is not None:
231
253
  logger.info(f"Building local sources for {self.input_file}")
232
254
  wheel_name, wheel_bytes = self.source_dir.build()
233
- yield (f"wheels/shared/{wheel_name}", wheel_bytes)
255
+ wheel_path = self._record_built_wheel(wheel_name)
256
+ yield (wheel_path, wheel_bytes)
234
257
  return
235
258
 
236
259
  if self.wheel is None:
@@ -398,12 +421,14 @@ class UvPackage(BaseModel):
398
421
  and UvLock.normalize_package_name(self.name) in DEPENDENCIES_TO_BUILD
399
422
  ):
400
423
  wheel.sdist = self.sdist
424
+ wheel.set_placeholder_wheel_name(self.version)
401
425
 
402
426
  if (
403
427
  self.source.directory is not None
404
428
  and UvLock.normalize_package_name(self.name) in DEPENDENCIES_TO_BUILD
405
429
  ):
406
430
  wheel.source_dir = UvSourceDirectory(directory=self.source.directory)
431
+ wheel.set_placeholder_wheel_name(self.version)
407
432
 
408
433
  try:
409
434
  wheel_x86_64 = self._find_wheel(
@@ -429,7 +454,7 @@ class UvPackage(BaseModel):
429
454
  wheel.input_file_aarch64 = f"{wheel_aarch64.basename}.whl"
430
455
  wheel.wheel_aarch64 = wheel_aarch64
431
456
  except FileNotFoundError:
432
- if wheel.sdist is None:
457
+ if wheel.sdist is None and wheel.source_dir is None:
433
458
  logger.warning(
434
459
  f"Could not find a suitable aarch64 wheel for {self.name=}, {self.version=}, {abi_precedence=}, {python_precedence=} -- the built package might not work on ARM systems"
435
460
  )
@@ -1,3 +1,4 @@
1
+ import json
1
2
  import tarfile
2
3
  from pathlib import Path
3
4
  from unittest.mock import patch
@@ -10,7 +11,7 @@ from typer.testing import CliRunner
10
11
  from soar_sdk.cli.package.cli import package
11
12
  from soar_sdk.cli.package.utils import phantom_get_login_session, phantom_install_app
12
13
  from soar_sdk.cli.path_utils import context_directory
13
- from soar_sdk.meta.dependencies import UvWheel
14
+ from soar_sdk.meta.dependencies import UvSourceDirectory, UvWheel
14
15
 
15
16
  runner = CliRunner()
16
17
 
@@ -223,6 +224,57 @@ def test_package_build_with_sdk_templates(wheel_resp_mock, tmp_path: Path):
223
224
  assert any("templates/base/base_template.html" in name for name in members)
224
225
 
225
226
 
227
+ def test_package_build_writes_manifest_wheel_paths(
228
+ wheel_resp_mock, tmp_path: Path
229
+ ) -> None:
230
+ """Ensure built package includes a manifest with real wheel filenames."""
231
+ example_app = Path.cwd() / "tests/example_app"
232
+ destination = tmp_path / "example_app.tgz"
233
+
234
+ local_wheel = "local-sdk-1.0.0.whl"
235
+
236
+ with (
237
+ context_directory(tmp_path),
238
+ patch.object(UvWheel, "validate_hash", return_value=None),
239
+ patch.object(UvSourceDirectory, "build", return_value=(local_wheel, b"data")),
240
+ ):
241
+ result = runner.invoke(
242
+ package,
243
+ [
244
+ "build",
245
+ example_app.as_posix(),
246
+ ],
247
+ )
248
+
249
+ assert result.exit_code == 0, result.stdout
250
+
251
+ with tarfile.open(destination, "r:gz") as tar:
252
+ manifest_member = next(
253
+ (m for m in tar.getmembers() if m.name.endswith("manifest.json")), None
254
+ )
255
+ assert manifest_member is not None
256
+
257
+ manifest_file = tar.extractfile(manifest_member)
258
+ assert manifest_file is not None
259
+
260
+ manifest = json.loads(manifest_file.read())
261
+
262
+ expected_path = f"wheels/shared/{local_wheel}"
263
+ expected_wheel = {
264
+ "module": "splunk-soar-sdk",
265
+ "input_file": expected_path,
266
+ "input_file_aarch64": expected_path,
267
+ }
268
+ for py_version in ["313", "314"]:
269
+ section = f"pip{py_version}_dependencies"
270
+ for wheel in manifest[section]["wheel"]:
271
+ print(wheel)
272
+ if wheel == expected_wheel:
273
+ break
274
+ else:
275
+ raise AssertionError(f"Expected wheel not found in {section}")
276
+
277
+
226
278
  def test_package_build_without_app_templates(wheel_resp_mock, tmp_path: Path):
227
279
  example_app = Path.cwd() / "tests/example_app"
228
280
 
@@ -15,7 +15,7 @@
15
15
  "python_version": "3.13,3.14",
16
16
  "product_version_regex": ".*",
17
17
  "publisher": "Splunk Inc.",
18
- "utctime_updated": "2025-12-11T18:07:07.208512Z",
18
+ "utctime_updated": "2025-12-12T23:35:54.322661Z",
19
19
  "fips_compliant": false,
20
20
  "contributors": [],
21
21
  "configuration": {
@@ -1138,7 +1138,8 @@
1138
1138
  },
1139
1139
  {
1140
1140
  "module": "splunk-soar-sdk",
1141
- "input_file": "wheels/shared/"
1141
+ "input_file": "wheels/shared/<to_be_built>.whl",
1142
+ "input_file_aarch64": "wheels/shared/<to_be_built>.whl"
1142
1143
  },
1143
1144
  {
1144
1145
  "module": "toml",
@@ -1346,7 +1347,8 @@
1346
1347
  },
1347
1348
  {
1348
1349
  "module": "splunk-soar-sdk",
1349
- "input_file": "wheels/shared/"
1350
+ "input_file": "wheels/shared/<to_be_built>.whl",
1351
+ "input_file_aarch64": "wheels/shared/<to_be_built>.whl"
1350
1352
  },
1351
1353
  {
1352
1354
  "module": "toml",
@@ -979,7 +979,7 @@ wheels = [
979
979
 
980
980
  [[package]]
981
981
  name = "splunk-soar-sdk"
982
- version = "3.4.0"
982
+ version = "3.6.0"
983
983
  source = { directory = "../../" }
984
984
  dependencies = [
985
985
  { name = "beautifulsoup4", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'x86_64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" },
@@ -1015,12 +1015,14 @@ requires-dist = [
1015
1015
  { name = "jinja2", specifier = ">=3.1.0" },
1016
1016
  { name = "packaging", specifier = ">=25.0" },
1017
1017
  { name = "pydantic", specifier = ">=2,<3" },
1018
+ { name = "python-magic", marker = "extra == 'email'", specifier = ">=0.4.27" },
1018
1019
  { name = "requests", specifier = "<3" },
1019
1020
  { name = "setuptools", specifier = ">=80.9.0" },
1020
1021
  { name = "toml", specifier = ">=0.10.2,<1" },
1021
1022
  { name = "tqdm", specifier = ">=4.67.1" },
1022
1023
  { name = "typer", specifier = ">=0.12.5,<1" },
1023
1024
  ]
1025
+ provides-extras = ["email"]
1024
1026
 
1025
1027
  [package.metadata.requires-dev]
1026
1028
  dev = [
@@ -15,7 +15,7 @@
15
15
  "python_version": "3.13,3.14",
16
16
  "product_version_regex": ".*",
17
17
  "publisher": "Splunk Inc.",
18
- "utctime_updated": "2025-12-11T18:07:29.807371Z",
18
+ "utctime_updated": "2025-12-12T23:36:44.577977Z",
19
19
  "fips_compliant": false,
20
20
  "contributors": [],
21
21
  "configuration": {
@@ -323,7 +323,8 @@
323
323
  },
324
324
  {
325
325
  "module": "splunk-soar-sdk",
326
- "input_file": "wheels/shared/"
326
+ "input_file": "wheels/shared/<to_be_built>.whl",
327
+ "input_file_aarch64": "wheels/shared/<to_be_built>.whl"
327
328
  },
328
329
  {
329
330
  "module": "toml",
@@ -551,7 +552,8 @@
551
552
  },
552
553
  {
553
554
  "module": "splunk-soar-sdk",
554
- "input_file": "wheels/shared/"
555
+ "input_file": "wheels/shared/<to_be_built>.whl",
556
+ "input_file_aarch64": "wheels/shared/<to_be_built>.whl"
555
557
  },
556
558
  {
557
559
  "module": "toml",
@@ -1010,7 +1010,7 @@ wheels = [
1010
1010
 
1011
1011
  [[package]]
1012
1012
  name = "splunk-soar-sdk"
1013
- version = "3.4.0"
1013
+ version = "3.6.0"
1014
1014
  source = { directory = "../../" }
1015
1015
  dependencies = [
1016
1016
  { name = "beautifulsoup4", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'x86_64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" },
@@ -1046,12 +1046,14 @@ requires-dist = [
1046
1046
  { name = "jinja2", specifier = ">=3.1.0" },
1047
1047
  { name = "packaging", specifier = ">=25.0" },
1048
1048
  { name = "pydantic", specifier = ">=2,<3" },
1049
+ { name = "python-magic", marker = "extra == 'email'", specifier = ">=0.4.27" },
1049
1050
  { name = "requests", specifier = "<3" },
1050
1051
  { name = "setuptools", specifier = ">=80.9.0" },
1051
1052
  { name = "toml", specifier = ">=0.10.2,<1" },
1052
1053
  { name = "tqdm", specifier = ">=4.67.1" },
1053
1054
  { name = "typer", specifier = ">=0.12.5,<1" },
1054
1055
  ]
1056
+ provides-extras = ["email"]
1055
1057
 
1056
1058
  [package.metadata.requires-dev]
1057
1059
  dev = [
@@ -1209,7 +1209,7 @@ wheels = [
1209
1209
 
1210
1210
  [[package]]
1211
1211
  name = "splunk-soar-sdk"
1212
- version = "3.6.0"
1212
+ version = "3.6.1"
1213
1213
  source = { editable = "." }
1214
1214
  dependencies = [
1215
1215
  { name = "beautifulsoup4", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'x86_64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" },
@@ -1,37 +0,0 @@
1
- # [3.6.0](https://github.com/phantomcyber/splunk-soar-sdk/compare/3.5.0...3.6.0) (2025-12-12)
2
-
3
-
4
- ### Bug Fixes
5
-
6
- * remove the useless test files from the root of the repo ([f529497](https://github.com/phantomcyber/splunk-soar-sdk/commit/f529497a397a9879dbe5e264a2b562916b6bbcf8))
7
-
8
-
9
- ### Features
10
-
11
- * add `supports_es_polling` field to manifest ([0eb75dd](https://github.com/phantomcyber/splunk-soar-sdk/commit/0eb75dd56a7fb512fff0533bdb64317d4de776d6))
12
- * add a client for submitting ES findings ([23bf0b7](https://github.com/phantomcyber/splunk-soar-sdk/commit/23bf0b7bea5e9437bffecfe783a20abf9c4eb35b))
13
- * enable building the SDK from a local directory instead of fetching wheel ([8ca7a6c](https://github.com/phantomcyber/splunk-soar-sdk/commit/8ca7a6c007b740c56db2407306a32363d203da76))
14
- * update ES polling to use the new workflow ([d69784c](https://github.com/phantomcyber/splunk-soar-sdk/commit/d69784c462eccab6f5a0796cc9573cff5e816a1c))
15
-
16
-
17
-
18
-
19
-
20
- # [3.6.0](https://github.com/phantomcyber/splunk-soar-sdk/compare/3.5.0...3.6.0) (2025-12-12)
21
-
22
-
23
- ### Bug Fixes
24
-
25
- * remove the useless test files from the root of the repo ([f529497](https://github.com/phantomcyber/splunk-soar-sdk/commit/f529497a397a9879dbe5e264a2b562916b6bbcf8))
26
-
27
-
28
- ### Features
29
-
30
- * add `supports_es_polling` field to manifest ([0eb75dd](https://github.com/phantomcyber/splunk-soar-sdk/commit/0eb75dd56a7fb512fff0533bdb64317d4de776d6))
31
- * add a client for submitting ES findings ([23bf0b7](https://github.com/phantomcyber/splunk-soar-sdk/commit/23bf0b7bea5e9437bffecfe783a20abf9c4eb35b))
32
- * enable building the SDK from a local directory instead of fetching wheel ([8ca7a6c](https://github.com/phantomcyber/splunk-soar-sdk/commit/8ca7a6c007b740c56db2407306a32363d203da76))
33
- * update ES polling to use the new workflow ([d69784c](https://github.com/phantomcyber/splunk-soar-sdk/commit/d69784c462eccab6f5a0796cc9573cff5e816a1c))
34
-
35
-
36
-
37
-
@@ -1 +0,0 @@
1
- 3.6.0
File without changes