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.
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/.github/workflows/integration_tests.yml +1 -2
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/PKG-INFO +1 -1
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/pyproject.toml +1 -1
- splunk_soar_sdk-3.6.1/release_notes.txt +21 -0
- splunk_soar_sdk-3.6.1/release_version.txt +1 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/cli/package/cli.py +33 -17
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/meta/dependencies.py +28 -3
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/cli/test_package_cli.py +53 -1
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/example_app/app.json +5 -3
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/example_app/uv.lock +3 -1
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/example_app_with_webhook/app.json +5 -3
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/example_app_with_webhook/uv.lock +3 -1
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/uv.lock +1 -1
- splunk_soar_sdk-3.6.0/release_notes.txt +0 -37
- splunk_soar_sdk-3.6.0/release_version.txt +0 -1
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/.github/ISSUE_TEMPLATE/bug.md +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/.github/pull_request_template.md +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/.github/scripts/generate_test_summary.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/.github/utils/github.js +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/.github/utils/update_version.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/.github/workflows/code_quality.yml +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/.github/workflows/commit_hygiene.yml +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/.github/workflows/generate_docs.yml +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/.github/workflows/semantic_release.yml +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/.gitignore +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/.pre-commit-config.yaml +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/.releaserc +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/LICENSE +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/README.md +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/commitlint.config.js +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/docs/api_reference.rst +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/docs/app_structure/index.rst +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/docs/app_structure/pre-commit-config.yaml.rst +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/docs/app_structure/pyproject.toml.rst +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/docs/app_structure/src_app.rst +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/docs/changelog.rst +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/docs/cli_reference.rst +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/docs/conf.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/docs/custom_views/index.rst +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/docs/custom_views/reusable_components.md +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/docs/custom_views/templates.md +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/docs/custom_views/view_handlers.md +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/docs/getting_started/defining_asset.rst +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/docs/getting_started/first_action.rst +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/docs/getting_started/index.rst +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/docs/getting_started/init_app.rst +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/docs/getting_started/installation.rst +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/docs/getting_started/testing_and_building.rst +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/docs/index.rst +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/mcp_server/README.md +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/mcp_server/install.sh +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/mcp_server/mcp_config.json +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/mcp_server/pyproject.toml +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/mcp_server/pytest.ini +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/mcp_server/src/soar_test_assistant/__init__.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/mcp_server/src/soar_test_assistant/server.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/mcp_server/tests/__init__.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/mcp_server/tests/test_analyzer.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/mcp_server/uv.lock +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/__init__.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/abstract.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/action_results.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/actions_manager.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/apis/__init__.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/apis/artifact.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/apis/container.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/apis/es/findings.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/apis/utils.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/apis/vault.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/app.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/app_cli_runner.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/app_client.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/app_templates/basic_app/.gitignore +0 -0
- {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
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/app_templates/basic_app/logo.svg +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/app_templates/basic_app/logo_dark.svg +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/app_templates/basic_app/src/__init__.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/app_templates/basic_app/uv.lock +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/asset.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/asset_state.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/async_utils.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/cli/__init__.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/cli/cli.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/cli/init/__init__.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/cli/init/cli.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/cli/manifests/__init__.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/cli/manifests/cli.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/cli/manifests/deserializers.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/cli/manifests/processors.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/cli/manifests/serializers.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/cli/package/utils.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/cli/path_utils.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/cli/test/__init__.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/cli/test/cli.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/cli/utils.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/code_renderers/__init__.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/code_renderers/action_renderer.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/code_renderers/app_renderer.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/code_renderers/asset_renderer.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/code_renderers/renderer.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/code_renderers/templates/pyproject.toml.jinja +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/code_renderers/toml_renderer.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/colors.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/compat.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/crypto.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/decorators/__init__.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/decorators/action.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/decorators/make_request.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/decorators/on_es_poll.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/decorators/on_poll.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/decorators/test_connectivity.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/decorators/view_handler.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/decorators/webhook.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/es_client.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/exceptions.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/extras/__init__.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/extras/email/__init__.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/extras/email/processor.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/extras/email/rfc5322.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/extras/email/utils.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/field_utils.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/input_spec.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/logging.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/meta/__init__.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/meta/actions.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/meta/adapters.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/meta/app.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/meta/datatypes.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/meta/webhooks.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/models/__init__.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/models/artifact.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/models/attachment_input.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/models/container.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/models/finding.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/models/vault_attachment.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/models/view.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/params.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/paths.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/py.typed +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/shims/phantom/action_result.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/shims/phantom/app.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/shims/phantom/base_connector.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/shims/phantom/connector_result.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/shims/phantom/consts.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/shims/phantom/encryption_helper.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/shims/phantom/install_info.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/shims/phantom/json_keys.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/shims/phantom/ph_ipc.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/shims/phantom/vault.py +0 -0
- {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
- {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
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/templates/base/base_template.html +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/templates/base/error.html +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/templates/base/header.html +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/templates/base/logo_header.html +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/templates/components/pie_chart.html +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/templates/widgets/widget_resize_snippet.html +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/templates/widgets/widget_template.html +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/types.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/views/__init__.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/views/component_registry.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/views/components/__init__.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/views/components/pie_chart.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/views/template_filters.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/views/template_renderer.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/views/view_parser.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/webhooks/__init__.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/webhooks/models.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/webhooks/routing.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/__init__.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/cli/__init__.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/cli/datapath_parse.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/cli/manifests/__init__.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/cli/manifests/test_processors.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/cli/manifests/test_python_version_resolution.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/cli/test_assets/converted_app/actions.py.txt +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/cli/test_cli.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/cli/test_convert_cli.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/cli/test_deserializers.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/cli/test_init_cli.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/cli/test_manifests_cli.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/cli/test_serializers.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/cli/test_test_cli.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/cli/test_utils.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/code_renderers/test_action_renderer.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/conftest.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/example_app/example_asset.json +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/example_app/logo.svg +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/example_app/logo_dark.svg +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/example_app/pyproject.toml +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/example_app/release_notes/v1.md +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/example_app/src/__init__.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/example_app/src/actions/__init__.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/example_app/src/actions/async_action.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/example_app/src/actions/generate_category.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/example_app/src/actions/reverse_string.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/example_app/src/app.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/example_app/src/ignoreme.txt +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/example_app/templates/reverse_string.html +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/example_app_with_webhook/example_asset.json +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/example_app_with_webhook/logo.svg +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/example_app_with_webhook/logo_dark.svg +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/example_app_with_webhook/pyproject.toml +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/example_app_with_webhook/src/__init__.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/example_app_with_webhook/src/app.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/integration/__init__.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/integration/conftest.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/integration/phantom_constants.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/integration/phantom_instance.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/integration/soar_client.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/integration/test_example_app.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/integration/test_example_app_with_webhook.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/interfaces/__init__.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/interfaces/test_artifact_interface.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/interfaces/test_container_interface.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/interfaces/test_vault_interface.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/meta/__init__.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/meta/test_actions.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/meta/test_adapters.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/meta/test_datatypes.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/meta/test_dependencies.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/meta/test_webhooks.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/mocks/__init__.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/mocks/dynamic_mocks.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/mocks/importable_action.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/stubs.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_action_results.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_actions_manager.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_app.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_app_action.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_app_action_params.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_app_action_results.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_app_client.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_app_runner.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_asset.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_asset_state.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_assets/splunk-sdk-2.1.0.tar.gz +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_async_integration.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_async_utils.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_attachment_input.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_code_renderers.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_compat.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_container.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_custom_views.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_email_processor.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_encryption.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_es_client.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_es_on_poll.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_field_utils.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_finding.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_input_spec.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_logging.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_make_request_action.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_on_poll.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_params.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_rfc5322.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_template_filters.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_template_renderer.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_test_connectivity.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/test_view_parser.py +0 -0
- {splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/tests/webhooks/test_models.py +0 -0
- {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.
|
|
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
|
|
@@ -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:
|
|
31
|
-
"""Asynchronously collect all wheels from the given
|
|
32
|
-
|
|
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(
|
|
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(
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
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
|
-
|
|
54
|
-
*(
|
|
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
|
-
|
|
58
|
-
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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-
|
|
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.
|
|
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-
|
|
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.
|
|
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.
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/docs/app_structure/pre-commit-config.yaml.rst
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/docs/getting_started/testing_and_building.rst
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/mcp_server/src/soar_test_assistant/__init__.py
RENAMED
|
File without changes
|
{splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/mcp_server/src/soar_test_assistant/server.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/app_templates/basic_app/.gitignore
RENAMED
|
File without changes
|
|
File without changes
|
{splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/app_templates/basic_app/logo.svg
RENAMED
|
File without changes
|
{splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/app_templates/basic_app/logo_dark.svg
RENAMED
|
File without changes
|
{splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/app_templates/basic_app/src/__init__.py
RENAMED
|
File without changes
|
{splunk_soar_sdk-3.6.0 → splunk_soar_sdk-3.6.1}/src/soar_sdk/app_templates/basic_app/uv.lock
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|