modelaudit 0.2.49__tar.gz → 0.2.51__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.
- {modelaudit-0.2.49 → modelaudit-0.2.51}/.github/workflows/release-please.yml +290 -63
- {modelaudit-0.2.49 → modelaudit-0.2.51}/.github/workflows/test.yml +35 -17
- modelaudit-0.2.51/.release-please-manifest.json +4 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/AGENTS.md +1 -1
- {modelaudit-0.2.49 → modelaudit-0.2.51}/CHANGELOG.md +31 -8
- {modelaudit-0.2.49 → modelaudit-0.2.51}/Dockerfile.full +1 -1
- {modelaudit-0.2.49 → modelaudit-0.2.51}/Dockerfile.tensorflow +1 -1
- {modelaudit-0.2.49 → modelaudit-0.2.51}/PKG-INFO +15 -9
- {modelaudit-0.2.49 → modelaudit-0.2.51}/README.md +4 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/docs/agents/release-process.md +4 -2
- {modelaudit-0.2.49 → modelaudit-0.2.51}/docs/maintainers/dependency-policy.md +2 -1
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/__init__.py +8 -3
- modelaudit-0.2.51/modelaudit/__main__.py +34 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/auth/config.py +22 -4
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/cache/cache_manager.py +16 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/cache/scan_results_cache.py +51 -7
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/core.py +51 -3
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/integrations/mlflow.py +82 -2
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/integrations/sbom_generator.py +16 -12
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/integrations/source_redaction.py +4 -2
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/joblib_scanner.py +53 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/helpers/cache_decorator.py +30 -18
- {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/AGENTS.md +2 -2
- {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/CHANGELOG.md +9 -10
- {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/Cargo.lock +1 -1
- {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/Cargo.toml +1 -1
- {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/pyproject.toml +1 -1
- {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/rust/src/nested.rs +2 -2
- {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/src/modelaudit_picklescan/call_graph.py +144 -13
- {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/tests/test_adversarial_pickle_oracle.py +5 -1
- {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/tests/test_api.py +91 -10
- {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/tests/test_call_graph_import_statements.py +208 -3
- {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/tests/test_call_graph_safe_spec_resolution.py +18 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/uv.lock +1 -1
- {modelaudit-0.2.49 → modelaudit-0.2.51}/pyproject.toml +14 -11
- modelaudit-0.2.51/renovate.json +37 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/cache/test_cache_correctness.py +120 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/conftest.py +1 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/helpers/__init__.py +20 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/integrations/test_jfrog.py +1 -1
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/integrations/test_mlflow_integration.py +2 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/integrations/test_sarif_redaction.py +9 -8
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/integrations/test_sbom_symlink_containment.py +14 -4
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_joblib_scanner_codecs.py +75 -1
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_onnx_scanner.py +16 -7
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_tar_scanner.py +2 -1
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_text_scanner.py +7 -1
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_asset_inventory_integration.py +15 -1
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_auth_config.py +107 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_core.py +174 -8
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_dependency_lock.py +19 -1
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_dill_joblib_enhanced.py +35 -1
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_integration.py +20 -4
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_lazy_loading_integration.py +5 -2
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_network_comm_integration.py +17 -6
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_performance_benchmarks.py +8 -2
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_real_world_dill_joblib.py +34 -16
- modelaudit-0.2.51/tests/test_release_workflow.py +595 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_security_asset_integration.py +52 -25
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/utils/file/test_file_type_validation_integration.py +6 -3
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/utils/file/test_integration_file_type_demo.py +6 -2
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/utils/helpers/test_interrupt_handling.py +43 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/utils/sources/test_huggingface.py +25 -6
- {modelaudit-0.2.49 → modelaudit-0.2.51}/uv.lock +287 -240
- modelaudit-0.2.49/.release-please-manifest.json +0 -4
- modelaudit-0.2.49/modelaudit/__main__.py +0 -6
- modelaudit-0.2.49/renovate.json +0 -18
- modelaudit-0.2.49/tests/test_release_workflow.py +0 -236
- {modelaudit-0.2.49 → modelaudit-0.2.51}/.dockerignore +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/.editorconfig +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/.gitattributes +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/.github/CODEOWNERS +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/.github/markdown-link-check-config.json +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/.github/workflows/README.md +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/.github/workflows/codeql.yml +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/.github/workflows/docker-image-test.yml +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/.github/workflows/docker-publish.yml +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/.github/workflows/docs-check.yml +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/.github/workflows/nightly.yml +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/.github/workflows/perf.yml +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/.github/workflows/validate-pr-title.yml +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/.gitignore +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/.mailmap +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/.modelaudit.toml.example +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/.prettierignore +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/CLAUDE.md +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/CODE_OF_CONDUCT.md +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/CONTRIBUTING.md +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/Dockerfile +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/LICENSE +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/MAINTAINERS.md +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/MANIFEST.in +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/RULES.md +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/SECURITY.md +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/SUPPORT.md +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/THIRD_PARTY_NOTICES.md +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/codecov.yml +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/docker-compose.yml +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/docker-entrypoint.sh +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/docs/agents/architecture.md +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/docs/agents/dependencies.md +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/docs/agents/new-scanner-quickstart.md +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/docs/agents/performance-audit.md +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/docs/agents/picklescan-package-split.md +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/docs/maintainers/cve-process.md +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/docs/maintainers/scanner-cve-coverage.md +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/docs/maintainers/triage-playbook.md +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/docs/security/threat-model.md +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/docs/user/compatibility-matrix.md +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/docs/user/metadata-extraction.md +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/docs/user/offline-air-gapped.md +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/docs/user/scanner-selection.md +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/docs/user/security-model.md +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/analysis/__init__.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/analysis/anomaly_detector.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/analysis/entropy_analyzer.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/analysis/framework_patterns.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/analysis/integrated_analyzer.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/analysis/ml_context_analyzer.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/analysis/opcode_sequence_analyzer.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/analysis/semantic_analyzer.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/analysis/unified_context.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/auth/__init__.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/auth/client.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/cache/__init__.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/cache/adaptive_cache_keys.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/cache/batch_operations.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/cache/cache_policy.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/cache/optimized_config.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/cache/trusted_config_store.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/cli.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/config/__init__.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/config/constants.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/config/data/public_suffix_list.dat +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/config/data/spdx_licenses.json +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/config/explanations.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/config/generated_keras_layers.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/config/local_config.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/config/name_blacklist.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/config/rule_config.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/core_results.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/detectors/__init__.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/detectors/cve_patterns.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/detectors/jit_script.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/detectors/network_comm.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/detectors/secrets.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/detectors/suspicious_symbols.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/integrations/__init__.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/integrations/jfrog.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/integrations/license_checker.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/integrations/sarif_formatter.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/metadata_extractor.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/models.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/progress/__init__.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/progress/base.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/progress/console.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/progress/file.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/progress/hooks.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/progress/multi_phase.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/LICENSE +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/NOTICE +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/__init__.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/py.typed +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/__init__.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/__init__.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/__init__.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/allocation_description_pb2.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/api_def_pb2.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/attr_value_pb2.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/cost_graph_pb2.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/cpp_shape_inference_pb2.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/dataset_metadata_pb2.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/dataset_options_pb2.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/dataset_pb2.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/device_attributes_pb2.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/full_type_pb2.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/function_pb2.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/graph_debug_info_pb2.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/graph_pb2.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/graph_transfer_info_pb2.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/kernel_def_pb2.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/log_memory_pb2.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/model_pb2.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/node_def_pb2.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/op_def_pb2.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/optimized_function_graph_pb2.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/reader_base_pb2.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/resource_handle_pb2.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/step_stats_pb2.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/tensor_description_pb2.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/tensor_pb2.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/tensor_shape_pb2.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/tensor_slice_pb2.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/types_pb2.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/variable_pb2.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/versions_pb2.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/protobuf/__init__.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/protobuf/cluster_pb2.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/protobuf/composite_tensor_variant_pb2.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/protobuf/control_flow_pb2.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/protobuf/core_platform_payloads_pb2.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/protobuf/critical_section_pb2.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/protobuf/data_service_pb2.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/protobuf/debug_event_pb2.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/protobuf/debug_pb2.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/protobuf/device_filters_pb2.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/protobuf/device_properties_pb2.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/protobuf/fingerprint_pb2.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/protobuf/meta_graph_pb2.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/protobuf/named_tensor_pb2.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/protobuf/remote_tensor_handle_pb2.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/protobuf/rewriter_config_pb2.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/protobuf/saved_model_pb2.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/protobuf/saved_object_graph_pb2.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/protobuf/saver_pb2.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/protobuf/service_config_pb2.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/protobuf/snapshot_pb2.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/protobuf/struct_pb2.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/protobuf/tensor_bundle_pb2.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/protobuf/trackable_object_graph_pb2.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/protobuf/transport_options_pb2.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/protobuf/verifier_config_pb2.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/py.typed +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/rule_catalog.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/rules.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanner_registry_metadata.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanner_results.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanner_selection.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/__init__.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/_archive_config.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/_archive_locations.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/_archive_outcomes.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/_catboost_evidence_redaction.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/_evidence_redaction.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/_string_extraction.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/archive_dispatch.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/archive_member_security.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/base.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/catboost_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/cntk_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/compressed_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/coreml_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/executorch_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/flax_msgpack_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/gguf_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/jax_checkpoint_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/jinja2_template_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/keras_h5_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/keras_utils.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/keras_zip_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/lightgbm_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/llamafile_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/manifest_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/metadata_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/mxnet_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/nemo_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/numpy_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/oci_layer_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/onnx_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/openvino_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/paddle_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/pickle_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/picklescan_adapter.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/pmml_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/protobuf_model_candidate_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/pytorch_binary_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/pytorch_zip_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/pytorch_zip_support/__init__.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/pytorch_zip_support/archive_members.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/r_serialized_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/rar_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/rknn_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/rule_mapper.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/safetensors_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/sevenzip_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/skops_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/tar_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/tensorrt_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/text_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/tf_metagraph_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/tf_savedmodel_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/tflite_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/torch7_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/torchserve_mar_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/weight_distribution_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/xgboost_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/zip_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/telemetry.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/__init__.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/_path_hardening.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/auto_defaults.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/file/__init__.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/file/_compression.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/file/detection.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/file/filtering.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/file/handlers.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/file/hdf5.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/file/large_file_handler.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/file/streaming.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/helpers/__init__.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/helpers/assets.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/helpers/auto_defaults.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/helpers/code_validation.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/helpers/disk_space.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/helpers/file_hash.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/helpers/file_iterator.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/helpers/interrupt_handler.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/helpers/ml_context.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/helpers/result_conversion.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/helpers/retry.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/helpers/secure_hasher.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/helpers/types.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/lfs.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/model_extensions.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/repository_context.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/sources/__init__.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/sources/_huggingface_cache.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/sources/_huggingface_download_worker.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/sources/cloud_storage.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/sources/dvc.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/sources/huggingface.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/sources/huggingface_paths.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/sources/jfrog.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/sources/pytorch_hub.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/tensorflow_compat.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/version.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/whitelists/__init__.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/whitelists/huggingface_organizations.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/whitelists/huggingface_popular.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/package-lock.json +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/package.json +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/README.md +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/rust/README.md +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/rust/src/expansion.rs +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/rust/src/lib.rs +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/rust/src/nested_surface.rs +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/rust/src/opcode.rs +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/rust/src/options.rs +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/rust/src/policy.rs +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/rust/src/post_budget.rs +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/rust/src/pybridge.rs +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/rust/src/report.rs +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/rust/src/stack.rs +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/rust/src/state.rs +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/rust/src/strings.rs +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/rust/src/strings_policy.rs +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/src/modelaudit_picklescan/__init__.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/src/modelaudit_picklescan/api.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/src/modelaudit_picklescan/options.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/src/modelaudit_picklescan/py.typed +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/src/modelaudit_picklescan/report.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/tests/conftest.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/tests/parity_corpus.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/tests/test_call_graph_assignment_alias_cycle.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/tests/test_call_graph_click.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/tests/test_call_graph_execnet.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/tests/test_call_graph_instance_defaults.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/tests/test_call_graph_local_imports.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/tests/test_call_graph_six.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/tests/test_call_graph_tkinter.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/tests/test_import_boundary.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/tests/test_known_size_streams.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/tests/test_native_interface.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/tests/test_nested_budget_limits.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/tests/test_options.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/tests/test_protocol0_line_operands.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/tests/test_report.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/tests/test_rust_engine.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/pyproject.toml.example +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/release-please-config.json +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/requirements-tensorflow.txt +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/scripts/README.md +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/scripts/benchmark_report.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/scripts/check_circular_imports.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/scripts/compile_tensorflow_protos.sh +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/scripts/fetch_hf_org_models.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/scripts/fetch_hf_top_models.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/scripts/generate_keras_layer_inventory.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/scripts/jax_flax_scanning_demo.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/scripts/large_pickle_corpus_qa.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/scripts/minimal_circular_check.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/scripts/profile_scan.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/scripts/validate_docker_publish_tag.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/__init__.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/analysis/test_analysis_modules.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/analysis/test_anomaly_detector.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/analysis/test_entropy_analyzer.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/analysis/test_framework_patterns.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/analysis/test_ml_context_analyzer.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/analysis/test_opcode_sequence_analyzer.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/analysis/test_unified_context.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/exploits/exploit1_basic_torch_bypass.pkl +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/exploits/exploit2_advanced_torch_bypass.pkl +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/exploits/exploit3_sophisticated_hybrid.pkl +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/exploits/exploit4_supply_chain_attack.pkl +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/exploits/exploit5_ultra_high_confidence.pkl +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/exploits/exploit6_ordereddict_bypass.pkl +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/exploits/exploit7_nested_collections.pkl +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/exploits/exploit9_manual_construction.pkl +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/exploits/exploit_ultimate_50pct.pkl +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/generators/generate_7z_test_assets.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/generators/generate_advanced_pickle_tests.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/generators/generate_evil_pickle.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/generators/generate_jinja2_test_assets.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/generators/generate_nested_pickle_assets.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/generators/generate_os_alias_tests.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/generators/generate_safe_nested_assets.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/generators/generate_safetensors_assets.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/generators/generate_security_assets.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/huggingface_false_positive_manifest.json +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/pickles/memo_attack.pkl +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/pickles/multiple_stream_attack.pkl +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/pickles/nt_alias_attack.pkl +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/pickles/posix_alias_attack.pkl +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/pickles/stack_global_attack.pkl +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/archives/path_traversal.zip +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/archives/safe_model.zip +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/benign/chatml_format.json +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/benign/complex_legitimate.json +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/benign/conditional_system.json +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/benign/huggingface_llama.json +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/benign/simple_roles.json +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/benign/special_tokens.json +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/edge_cases/empty_template.json +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/edge_cases/malformed_template.json +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/edge_cases/multiple_templates.json +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/edge_cases/no_template.json +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/edge_cases/oversized_template.json +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/malicious/attr_bypass.json +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/malicious/combined_attack.json +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/malicious/config_exploit.json +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/malicious/cve_2024_34359_original.json +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/malicious/direct_eval.json +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/malicious/env_extraction.json +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/malicious/file_access.json +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/malicious/hex_bypass.json +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/malicious/loop_discovery.json +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/malicious/network_exfil.json +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/malicious/request_exploit.json +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/malicious/subprocess_injection.json +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/obfuscated/base64_payload.json +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/obfuscated/char_construction.json +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/obfuscated/format_bypass.json +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/obfuscated/getattr_bypass.json +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/standalone/benign_chat.j2 +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/standalone/malicious_standalone.jinja +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/standalone/malicious_subprocess.template +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/standalone/suspicious_benign.template +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/yaml/malicious_config.yaml +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/yaml/model_config.yaml +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/keras/custom_layer_attack.h5 +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/keras/loss_injection.h5 +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/keras/malicious_lambda.h5 +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/keras/metric_injection.h5 +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/keras/safe_model.h5 +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/manifests/safe_config.json +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/manifests/suspicious_config.json +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/pickles/decode_exec_chain.pkl +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/pickles/dill_func.pkl +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/pickles/malicious_model_realistic.pkl +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/pickles/malicious_system_call.pkl +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/pickles/nested_pickle_base64.pkl +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/pickles/nested_pickle_hex.pkl +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/pickles/nested_pickle_multistage.pkl +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/pickles/nested_pickle_raw.pkl +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/pickles/safe_data.pkl +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/pickles/safe_large_model.pkl +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/pickles/safe_model_with_binary.pkl +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/pickles/safe_model_with_encoding.pkl +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/pickles/safe_model_with_tokens.pkl +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/pickles/safe_nested_structure.pkl +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/pickles/simple_nested.pkl +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/pipeline.skops +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/pytorch/malicious_eval.pt +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/pytorch/safe_model.pt +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/safetensors/malicious_import.safetensors +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/safetensors/safe_model.safetensors +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/sentencepiece/custom_unknown_disabled_specials.model +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/sentencepiece/custom_unknown_disabled_specials_byte_fallback.model +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/tensorflow/malicious_pyfunc/saved_model.pb +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/tensorflow/safe_savedmodel/saved_model.pb +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/scenarios/license_scenarios/agpl_component/agpl_model.pkl +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/scenarios/license_scenarios/agpl_component/neural_network.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/scenarios/license_scenarios/mit_model/config.json +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/scenarios/license_scenarios/mit_model/model.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/scenarios/license_scenarios/mit_model/model_weights.pkl +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/scenarios/license_scenarios/mixed_licenses/LICENSE +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/scenarios/license_scenarios/mixed_licenses/apache_component.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/scenarios/license_scenarios/mixed_licenses/dataset_cc_nc.json +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/scenarios/license_scenarios/mixed_licenses/gpl_utility.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/scenarios/license_scenarios/mixed_licenses/mixed_model.pkl +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/scenarios/license_scenarios/unlicensed_dataset/embeddings.npy +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/scenarios/license_scenarios/unlicensed_dataset/features.csv +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/scenarios/license_scenarios/unlicensed_dataset/training_data.json +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/scenarios/security_scenarios/mixed_malicious_model/config.json +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/scenarios/security_scenarios/mixed_malicious_model/model.pkl +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/benchmarks/test_picklescan_benchmarks.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/benchmarks/test_scan_benchmarks.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/cache/__init__.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/cache/test_optimized_config.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/cli_output.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/config/__init__.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/config/test_name_blacklist.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/demo_license_functionality.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/detectors/test_builtin_detection.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/detectors/test_compile_eval_variants.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/detectors/test_cve_detection.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/detectors/test_cve_detection.py_cases/test_pickle_binunicode8_setitem.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/detectors/test_jit_script_detector.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/detectors/test_network_comm_detector.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/detectors/test_runpy_detection.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/detectors/test_secrets_detector.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/detectors/test_suspicious_symbols.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/helpers/file_creators.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/helpers/frameworks.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/integrations/test_jfrog_integration.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/integrations/test_jfrog_redirect_security.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/integrations/test_license_checker.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/integrations/test_license_integration.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/integrations/test_sarif_formatter.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/integrations/test_sbom_license_integration.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/integrations/test_sbom_url_fixes.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/progress/__init__.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/progress/test_base.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/progress/test_hooks_egress.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_base_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_catboost_evidence_redaction.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_catboost_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_cntk_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_compressed_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_coreml_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_evidence_redaction.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_evidence_redaction_authorization_continuation.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_executorch_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_flax_msgpack_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_gguf_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_jax_checkpoint_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_jinja2_template_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_joblib_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_keras_h5_lambda_helpers.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_keras_h5_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_keras_utils.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_keras_zip_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_lightgbm_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_llamafile_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_manifest_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_metadata_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_mxnet_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_nemo_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_numpy_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_oci_layer_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_onnx_dependency_handling.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_openvino_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_paddle_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_pickle_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_picklescan_adapter.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_pmml_dependency_handling.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_pmml_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_pytorch_binary_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_pytorch_zip_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_r_serialized_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_rknn_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_rule_code_registry_consistency.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_rule_mapper.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_safetensors_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_scanner_registry.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_sevenzip_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_skops_content_analysis.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_skops_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_tensorrt_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_tf_metagraph_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_tf_savedmodel_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_tflite_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_torch7_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_torchserve_mar_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_weight_distribution_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_xgboost_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_zip_scanner.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scripts/test_hf_whitelist_generators.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scripts/test_large_pickle_corpus_qa.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_asset_list.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_basic.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_benchmark_report.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_bug1_confidence_exploit.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_cache_cli.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_cache_optimizations.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_checks_recording.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_cli.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_cli_cache_dir.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_cli_default_command.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_cli_file_filtering.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_cli_license_integration.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_cli_logging_handlers.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_cli_output.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_cloud_url_detection.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_committed_fixture_hygiene.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_core_asset_extraction.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_cve_2025_10155_bin_pickle.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_debug_command.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_directory_file_filtering.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_docker_workflow.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_double_interrupt.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_exit_codes.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_false_positive_fixes.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_file_hash.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_gguf_sbom_integration.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_graceful_degradation.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_header_discrepancy.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_huggingface_extensions.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_huggingface_fp_regression_harness.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_huggingface_inconclusive_coverage.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_huggingface_symlinks.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_importlib_detection.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_jax_flax_integration.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_jit_script_integration.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_lazy_loading.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_manifest_name_policy.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_metadata_extractor.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_models.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_nested_pickle_integration.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_nightly_asset_contracts.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_nightly_prerequisites.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_os_alias_detection.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_os_subprocess_detection.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_path_traversal.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_perf_workflow.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_pickle_context_filtering.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_progress.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_pydantic_models.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_python_version_warning.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_pytorch_zip_detection.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_regression_corpus.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_regular_scan_hash.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_rules.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_safetensors_optimization.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_scanner_selection.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_secure_hasher.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_security_enhancements.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_shebang_context.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_simple_jinja2.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_sklearn_joblib_false_positive.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_streaming_scan.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_telemetry.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_telemetry_decoupling.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_tensorflow_lambda_detection.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_timeout_configuration.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_utils.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_weak_hash_detection.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_webbrowser_detection.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_why_explanations.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_xdist_status.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/utils/__init__.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/utils/file/__init__.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/utils/file/test_advanced_file_handler.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/utils/file/test_advanced_size_limits.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/utils/file/test_file_filter.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/utils/file/test_filetype.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/utils/file/test_large_file_handler.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/utils/file/test_streaming_analysis.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/utils/file/test_streaming_preview.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/utils/helpers/test_asset_from_scan_result.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/utils/helpers/test_auto_defaults.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/utils/helpers/test_code_validation.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/utils/helpers/test_disk_space.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/utils/helpers/test_file_iterator.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/utils/helpers/test_ml_context_false_positives.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/utils/helpers/test_py_compile_improvements.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/utils/helpers/test_secure_hasher.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/utils/sources/test_cloud_storage.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/utils/sources/test_dvc_integration.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/utils/sources/test_pytorch_hub.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/utils/test_lfs.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/utils/test_result_conversion.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/whitelists/__init__.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/whitelists/test_combined.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/whitelists/test_huggingface_popular.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/whitelists/test_organizations.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/workflows/__init__.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/workflows/test_docker_workflow.py +0 -0
- {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/xdist_status.py +0 -0
|
@@ -9,6 +9,9 @@ on:
|
|
|
9
9
|
push:
|
|
10
10
|
branches:
|
|
11
11
|
- main
|
|
12
|
+
repository_dispatch:
|
|
13
|
+
types:
|
|
14
|
+
- release-metadata-retry
|
|
12
15
|
workflow_dispatch:
|
|
13
16
|
inputs:
|
|
14
17
|
root_version:
|
|
@@ -34,6 +37,7 @@ jobs:
|
|
|
34
37
|
picklescan_tag_name: ${{ steps.manual.outputs.manual_release == 'true' && steps.manual.outputs.picklescan_tag_name || steps.release.outputs['packages/modelaudit-picklescan--tag_name'] }}
|
|
35
38
|
picklescan_version: ${{ steps.manual.outputs.manual_release == 'true' && steps.manual.outputs.picklescan_version || steps.release.outputs['packages/modelaudit-picklescan--version'] }}
|
|
36
39
|
pr_number: ${{ steps.release.outputs.pr && fromJSON(steps.release.outputs.pr).number || '' }}
|
|
40
|
+
pr_branch: ${{ steps.check-pr.outputs.pr_branch || '' }}
|
|
37
41
|
steps:
|
|
38
42
|
- name: Resolve manual release inputs
|
|
39
43
|
id: manual
|
|
@@ -66,7 +70,7 @@ jobs:
|
|
|
66
70
|
} >> "$GITHUB_OUTPUT"
|
|
67
71
|
|
|
68
72
|
- uses: googleapis/release-please-action@5c625bfb5d1ff62eadeeb3772007f7f66fdcf071 # v4
|
|
69
|
-
if: steps.manual.outputs.manual_release != 'true'
|
|
73
|
+
if: steps.manual.outputs.manual_release != 'true' && github.event_name != 'repository_dispatch'
|
|
70
74
|
id: release
|
|
71
75
|
with:
|
|
72
76
|
token: ${{ secrets.GITHUB_TOKEN }}
|
|
@@ -96,96 +100,162 @@ jobs:
|
|
|
96
100
|
--notes "Manual recovery release for modelaudit-picklescan $PICKLESCAN_VERSION."
|
|
97
101
|
fi
|
|
98
102
|
|
|
99
|
-
# Format changelogs immediately after release-please creates/updates a PR
|
|
100
|
-
# This runs for BOTH new PRs (prs_created) and existing PRs (pr output exists)
|
|
101
103
|
- name: Check if PR exists
|
|
102
104
|
id: check-pr
|
|
105
|
+
env:
|
|
106
|
+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
107
|
+
PR_OUTPUT: ${{ steps.release.outputs.pr || '' }}
|
|
108
|
+
RETRY_EVENT: ${{ github.event.action || '' }}
|
|
109
|
+
RETRY_BRANCH: ${{ github.event.client_payload.pr_branch || '' }}
|
|
103
110
|
run: |
|
|
104
|
-
PR_OUTPUT
|
|
105
|
-
|
|
111
|
+
if [[ -n "$PR_OUTPUT" && "$PR_OUTPUT" != "null" ]]; then
|
|
112
|
+
echo "has_pr=true" >> "$GITHUB_OUTPUT"
|
|
113
|
+
echo "pr_branch=$(jq -r '.headBranchName' <<< "$PR_OUTPUT")" >> "$GITHUB_OUTPUT"
|
|
114
|
+
elif [[ "$RETRY_EVENT" == "release-metadata-retry" && "$RETRY_BRANCH" == "release-please--branches--main" ]]; then
|
|
115
|
+
OPEN_BRANCH=$(gh pr view "$RETRY_BRANCH" --repo "$GITHUB_REPOSITORY" --json state,headRefName --jq 'if .state == "OPEN" then .headRefName else "" end')
|
|
116
|
+
if [[ "$OPEN_BRANCH" != "$RETRY_BRANCH" ]]; then
|
|
117
|
+
echo "Requested release metadata retry has no matching open release PR."
|
|
118
|
+
exit 1
|
|
119
|
+
fi
|
|
106
120
|
echo "has_pr=true" >> "$GITHUB_OUTPUT"
|
|
107
|
-
echo "pr_branch=$
|
|
121
|
+
echo "pr_branch=$OPEN_BRANCH" >> "$GITHUB_OUTPUT"
|
|
122
|
+
elif [[ "$RETRY_EVENT" == "release-metadata-retry" ]]; then
|
|
123
|
+
echo "Refusing release metadata retry for an unexpected branch."
|
|
124
|
+
exit 1
|
|
108
125
|
else
|
|
109
126
|
echo "has_pr=false" >> "$GITHUB_OUTPUT"
|
|
110
127
|
fi
|
|
111
128
|
|
|
129
|
+
sync-release-metadata:
|
|
130
|
+
if: needs.release-please.outputs.pr_branch != ''
|
|
131
|
+
runs-on: ubuntu-latest
|
|
132
|
+
needs: release-please
|
|
133
|
+
permissions:
|
|
134
|
+
contents: read
|
|
135
|
+
outputs:
|
|
136
|
+
source_sha: ${{ steps.source.outputs.sha }}
|
|
137
|
+
steps:
|
|
112
138
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
|
|
113
|
-
if: steps.check-pr.outputs.has_pr == 'true'
|
|
114
139
|
with:
|
|
115
|
-
ref: ${{
|
|
116
|
-
# Shallow clone for speed - we only need to format and push
|
|
140
|
+
ref: ${{ needs.release-please.outputs.pr_branch }}
|
|
117
141
|
fetch-depth: 1
|
|
142
|
+
persist-credentials: false
|
|
143
|
+
|
|
144
|
+
- name: Record release metadata source
|
|
145
|
+
id: source
|
|
146
|
+
run: echo "sha=$(git rev-parse HEAD)" >> "$GITHUB_OUTPUT"
|
|
118
147
|
|
|
119
148
|
- name: Install uv
|
|
120
|
-
if: steps.check-pr.outputs.has_pr == 'true'
|
|
121
149
|
uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
|
|
122
150
|
|
|
123
151
|
- name: Install Rust toolchain for standalone lock refresh
|
|
124
|
-
if: steps.check-pr.outputs.has_pr == 'true'
|
|
125
152
|
run: |
|
|
126
153
|
rustup toolchain install stable --profile minimal
|
|
127
154
|
rustup default stable
|
|
128
155
|
|
|
129
156
|
- name: Sync uv.lock with pyproject.toml
|
|
130
|
-
|
|
131
|
-
run: |
|
|
132
|
-
uv lock
|
|
133
|
-
if git diff --quiet uv.lock; then
|
|
134
|
-
echo "✓ uv.lock already in sync"
|
|
135
|
-
else
|
|
136
|
-
echo "→ uv.lock updated to match pyproject.toml version bump"
|
|
137
|
-
git config user.name "github-actions[bot]"
|
|
138
|
-
git config user.email "github-actions[bot]@users.noreply.github.com"
|
|
139
|
-
git add uv.lock
|
|
140
|
-
git commit -m "chore: sync uv.lock with pyproject.toml version bump"
|
|
141
|
-
git push
|
|
142
|
-
echo "✓ uv.lock committed and pushed"
|
|
143
|
-
fi
|
|
157
|
+
run: uv lock
|
|
144
158
|
|
|
145
159
|
- name: Sync standalone package lock with pyproject.toml
|
|
146
|
-
if: steps.check-pr.outputs.has_pr == 'true'
|
|
147
160
|
working-directory: packages/modelaudit-picklescan
|
|
148
161
|
run: |
|
|
149
162
|
uv lock
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
else
|
|
153
|
-
echo "→ packages/modelaudit-picklescan/uv.lock updated to match pyproject.toml"
|
|
154
|
-
git config user.name "github-actions[bot]"
|
|
155
|
-
git config user.email "github-actions[bot]@users.noreply.github.com"
|
|
156
|
-
git add uv.lock
|
|
157
|
-
git commit -m "chore: sync standalone package lock"
|
|
158
|
-
git push
|
|
159
|
-
echo "✓ packages/modelaudit-picklescan/uv.lock committed and pushed"
|
|
160
|
-
fi
|
|
163
|
+
cargo update --workspace --manifest-path Cargo.toml
|
|
164
|
+
cargo metadata --manifest-path Cargo.toml --locked --no-deps --format-version 1 >/dev/null
|
|
161
165
|
|
|
162
166
|
- name: Setup Node.js
|
|
163
|
-
if: steps.check-pr.outputs.has_pr == 'true'
|
|
164
167
|
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
|
|
165
168
|
with:
|
|
166
169
|
node-version: "24"
|
|
167
170
|
|
|
168
171
|
- name: Install Node dependencies
|
|
169
|
-
if: steps.check-pr.outputs.has_pr == 'true'
|
|
170
172
|
run: npm ci --ignore-scripts
|
|
171
173
|
|
|
172
174
|
- name: Format changelogs with Prettier
|
|
173
|
-
if: steps.check-pr.outputs.has_pr == 'true'
|
|
174
175
|
run: |
|
|
175
|
-
echo "Formatting changelogs on branch: ${{
|
|
176
|
+
echo "Formatting changelogs on branch: ${{ needs.release-please.outputs.pr_branch }}"
|
|
176
177
|
npx prettier --write CHANGELOG.md packages/modelaudit-picklescan/CHANGELOG.md
|
|
177
178
|
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
179
|
+
- name: Upload release metadata
|
|
180
|
+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
|
|
181
|
+
with:
|
|
182
|
+
name: modelaudit-release-metadata-${{ github.run_attempt }}
|
|
183
|
+
if-no-files-found: error
|
|
184
|
+
path: |
|
|
185
|
+
uv.lock
|
|
186
|
+
CHANGELOG.md
|
|
187
|
+
packages/modelaudit-picklescan/uv.lock
|
|
188
|
+
packages/modelaudit-picklescan/Cargo.lock
|
|
189
|
+
packages/modelaudit-picklescan/CHANGELOG.md
|
|
190
|
+
|
|
191
|
+
push-release-metadata:
|
|
192
|
+
if: needs.release-please.outputs.pr_branch != ''
|
|
193
|
+
runs-on: ubuntu-latest
|
|
194
|
+
needs: [release-please, sync-release-metadata]
|
|
195
|
+
permissions:
|
|
196
|
+
contents: write
|
|
197
|
+
steps:
|
|
198
|
+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
|
|
199
|
+
with:
|
|
200
|
+
ref: ${{ needs.release-please.outputs.pr_branch }}
|
|
201
|
+
fetch-depth: 1
|
|
202
|
+
persist-credentials: false
|
|
203
|
+
|
|
204
|
+
- name: Download release metadata
|
|
205
|
+
id: download-metadata
|
|
206
|
+
continue-on-error: true
|
|
207
|
+
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8
|
|
208
|
+
with:
|
|
209
|
+
name: modelaudit-release-metadata-${{ github.run_attempt }}
|
|
210
|
+
path: /tmp/modelaudit-release-metadata
|
|
211
|
+
|
|
212
|
+
- name: Regenerate missing release metadata
|
|
213
|
+
if: steps.download-metadata.outcome != 'success'
|
|
214
|
+
env:
|
|
215
|
+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
216
|
+
PR_BRANCH: ${{ needs.release-please.outputs.pr_branch }}
|
|
217
|
+
RETRY_EVENT: ${{ github.event.action || '' }}
|
|
218
|
+
run: |
|
|
219
|
+
if [[ "$RETRY_EVENT" == "release-metadata-retry" ]]; then
|
|
220
|
+
echo "Release metadata is still unavailable after a fresh generation run; refusing to dispatch another retry."
|
|
221
|
+
exit 1
|
|
222
|
+
fi
|
|
223
|
+
if [[ "$PR_BRANCH" != "release-please--branches--main" ]]; then
|
|
224
|
+
echo "Refusing release metadata retry for an unexpected branch."
|
|
225
|
+
exit 1
|
|
188
226
|
fi
|
|
227
|
+
echo "Release metadata is unavailable for this retry; starting a fresh read-only generation run."
|
|
228
|
+
gh api "repos/${GITHUB_REPOSITORY}/dispatches" -f event_type=release-metadata-retry -f "client_payload[pr_branch]=$PR_BRANCH"
|
|
229
|
+
echo "Follow the new release-please run, or select Re-run all jobs to regenerate metadata."
|
|
230
|
+
exit 1
|
|
231
|
+
|
|
232
|
+
- name: Push release metadata updates
|
|
233
|
+
env:
|
|
234
|
+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
235
|
+
PR_BRANCH: ${{ needs.release-please.outputs.pr_branch }}
|
|
236
|
+
EXPECTED_HEAD: ${{ needs.sync-release-metadata.outputs.source_sha }}
|
|
237
|
+
run: |
|
|
238
|
+
if [[ "$(git rev-parse HEAD)" != "$EXPECTED_HEAD" ]]; then
|
|
239
|
+
echo "Release branch changed while metadata was generated; refusing to overwrite newer changes."
|
|
240
|
+
exit 1
|
|
241
|
+
fi
|
|
242
|
+
|
|
243
|
+
cp /tmp/modelaudit-release-metadata/uv.lock uv.lock
|
|
244
|
+
cp /tmp/modelaudit-release-metadata/CHANGELOG.md CHANGELOG.md
|
|
245
|
+
cp /tmp/modelaudit-release-metadata/packages/modelaudit-picklescan/uv.lock packages/modelaudit-picklescan/uv.lock
|
|
246
|
+
cp /tmp/modelaudit-release-metadata/packages/modelaudit-picklescan/Cargo.lock packages/modelaudit-picklescan/Cargo.lock
|
|
247
|
+
cp /tmp/modelaudit-release-metadata/packages/modelaudit-picklescan/CHANGELOG.md packages/modelaudit-picklescan/CHANGELOG.md
|
|
248
|
+
|
|
249
|
+
if git diff --quiet uv.lock CHANGELOG.md packages/modelaudit-picklescan/uv.lock packages/modelaudit-picklescan/Cargo.lock packages/modelaudit-picklescan/CHANGELOG.md; then
|
|
250
|
+
echo "✓ Release metadata already in sync"
|
|
251
|
+
exit 0
|
|
252
|
+
fi
|
|
253
|
+
|
|
254
|
+
git config user.name "github-actions[bot]"
|
|
255
|
+
git config user.email "github-actions[bot]@users.noreply.github.com"
|
|
256
|
+
git add uv.lock CHANGELOG.md packages/modelaudit-picklescan/uv.lock packages/modelaudit-picklescan/Cargo.lock packages/modelaudit-picklescan/CHANGELOG.md
|
|
257
|
+
git commit -m "chore: sync release metadata"
|
|
258
|
+
git push "https://x-access-token:${GH_TOKEN}@github.com/${GITHUB_REPOSITORY}.git" "HEAD:${PR_BRANCH}"
|
|
189
259
|
|
|
190
260
|
build:
|
|
191
261
|
if: needs.release-please.outputs.release_created == 'true'
|
|
@@ -208,8 +278,18 @@ jobs:
|
|
|
208
278
|
rustup toolchain install stable --profile minimal
|
|
209
279
|
rustup default stable
|
|
210
280
|
|
|
211
|
-
- name:
|
|
212
|
-
run:
|
|
281
|
+
- name: Type check root package with mypy
|
|
282
|
+
run: |
|
|
283
|
+
# Match tool.mypy.python_version so version-gated dependency stubs use valid syntax.
|
|
284
|
+
uv sync --python 3.10 --locked --extra all-ci
|
|
285
|
+
uv run --python 3.10 --locked mypy modelaudit/ tests/
|
|
286
|
+
uv cache prune --ci
|
|
287
|
+
|
|
288
|
+
- name: Sync dependencies for root runtime checks
|
|
289
|
+
run: |
|
|
290
|
+
# Keep the release security tests and artifact smoke tests on modern Python.
|
|
291
|
+
uv python pin 3.12
|
|
292
|
+
uv sync --locked --extra all-ci
|
|
213
293
|
|
|
214
294
|
- name: Lint root package with Ruff
|
|
215
295
|
run: uv run ruff check modelaudit/ tests/
|
|
@@ -217,9 +297,6 @@ jobs:
|
|
|
217
297
|
- name: Check root package formatting with Ruff
|
|
218
298
|
run: uv run ruff format --check modelaudit/ tests/
|
|
219
299
|
|
|
220
|
-
- name: Type check root package with mypy
|
|
221
|
-
run: uv run mypy modelaudit/ tests/
|
|
222
|
-
|
|
223
300
|
- name: Run root package tests
|
|
224
301
|
run: |
|
|
225
302
|
uv run pytest tests -n auto -m "not slow and not integration and not performance" --tb=short
|
|
@@ -523,7 +600,7 @@ jobs:
|
|
|
523
600
|
rustup default stable
|
|
524
601
|
|
|
525
602
|
- name: Cache Cargo dependencies
|
|
526
|
-
uses: actions/cache@
|
|
603
|
+
uses: actions/cache@caa296126883cff596d87d8935842f9db880ef25 # v5
|
|
527
604
|
with:
|
|
528
605
|
path: |
|
|
529
606
|
~/.cargo/registry
|
|
@@ -713,6 +790,106 @@ jobs:
|
|
|
713
790
|
name: dist
|
|
714
791
|
path: dist/
|
|
715
792
|
|
|
793
|
+
- name: Verify the root picklescan dependency is available on PyPI
|
|
794
|
+
run: |
|
|
795
|
+
python - <<'PY'
|
|
796
|
+
import json
|
|
797
|
+
import re
|
|
798
|
+
import time
|
|
799
|
+
import urllib.request
|
|
800
|
+
import zipfile
|
|
801
|
+
from email.parser import Parser
|
|
802
|
+
from pathlib import Path
|
|
803
|
+
|
|
804
|
+
wheels = list(Path("dist").glob("modelaudit-*.whl"))
|
|
805
|
+
if len(wheels) != 1:
|
|
806
|
+
raise SystemExit(f"Expected one modelaudit wheel, found: {wheels}")
|
|
807
|
+
|
|
808
|
+
with zipfile.ZipFile(wheels[0]) as archive:
|
|
809
|
+
metadata_files = [name for name in archive.namelist() if name.endswith(".dist-info/METADATA")]
|
|
810
|
+
if len(metadata_files) != 1:
|
|
811
|
+
raise SystemExit(f"Expected one wheel METADATA file, found: {metadata_files}")
|
|
812
|
+
metadata = Parser().parsestr(archive.read(metadata_files[0]).decode())
|
|
813
|
+
|
|
814
|
+
requirements = metadata.get_all("Requires-Dist") or []
|
|
815
|
+
picklescan_requirements = [
|
|
816
|
+
requirement.split(";", 1)[0].strip()
|
|
817
|
+
for requirement in requirements
|
|
818
|
+
if re.match(r"^modelaudit[-_]picklescan\b", requirement, re.IGNORECASE)
|
|
819
|
+
]
|
|
820
|
+
if len(picklescan_requirements) != 1:
|
|
821
|
+
raise SystemExit(f"Expected one modelaudit-picklescan requirement, found: {picklescan_requirements}")
|
|
822
|
+
|
|
823
|
+
requirement = picklescan_requirements[0]
|
|
824
|
+
constraint = re.sub(r"^modelaudit[-_]picklescan", "", requirement, count=1, flags=re.IGNORECASE)
|
|
825
|
+
constraint = constraint.strip().removeprefix("(").removesuffix(")").replace(" ", "")
|
|
826
|
+
if not re.fullmatch(r"(?:==|!=|>=|<=|>|<)[0-9]+(?:\.[0-9]+){1,2}(?:,(?:==|!=|>=|<=|>|<)[0-9]+(?:\.[0-9]+){1,2})*", constraint):
|
|
827
|
+
raise SystemExit(f"Unsupported modelaudit-picklescan requirement: {requirement}")
|
|
828
|
+
specifiers = re.findall(r"(==|!=|>=|<=|>|<)([0-9]+(?:\.[0-9]+){1,2})", constraint)
|
|
829
|
+
|
|
830
|
+
def version_parts(value):
|
|
831
|
+
parts = tuple(int(part) for part in value.split("."))
|
|
832
|
+
return parts + (0,) * (3 - len(parts))
|
|
833
|
+
|
|
834
|
+
def published_version_parts(value):
|
|
835
|
+
match = re.fullmatch(r"([0-9]+(?:\.[0-9]+){1,2})(?:\.post([0-9]+))?", value)
|
|
836
|
+
if match is None:
|
|
837
|
+
return None
|
|
838
|
+
post = int(match[2]) if match[2] is not None else -1
|
|
839
|
+
return version_parts(match[1]) + (post,)
|
|
840
|
+
|
|
841
|
+
def matches(version):
|
|
842
|
+
comparisons = {
|
|
843
|
+
"==": lambda left, right: left == right,
|
|
844
|
+
"!=": lambda left, right: left != right,
|
|
845
|
+
">=": lambda left, right: left >= right,
|
|
846
|
+
"<=": lambda left, right: left <= right,
|
|
847
|
+
">": lambda left, right: left > right,
|
|
848
|
+
"<": lambda left, right: left < right,
|
|
849
|
+
}
|
|
850
|
+
for operator, value in specifiers:
|
|
851
|
+
target = version_parts(value) + (-1,)
|
|
852
|
+
if operator == ">" and version[:3] == target[:3]:
|
|
853
|
+
return False
|
|
854
|
+
if not comparisons[operator](version, target):
|
|
855
|
+
return False
|
|
856
|
+
return True
|
|
857
|
+
|
|
858
|
+
url = "https://pypi.org/pypi/modelaudit-picklescan/json"
|
|
859
|
+
deadline = time.monotonic() + 600
|
|
860
|
+
last_status = "not checked"
|
|
861
|
+
|
|
862
|
+
while time.monotonic() < deadline:
|
|
863
|
+
try:
|
|
864
|
+
with urllib.request.urlopen(url, timeout=20) as response:
|
|
865
|
+
releases = json.load(response).get("releases", {})
|
|
866
|
+
compatible = []
|
|
867
|
+
for version, files in releases.items():
|
|
868
|
+
published_version = published_version_parts(version)
|
|
869
|
+
if published_version is None or not matches(published_version):
|
|
870
|
+
continue
|
|
871
|
+
filenames = {entry["filename"] for entry in files if not entry.get("yanked", False)}
|
|
872
|
+
expected_files = {
|
|
873
|
+
f"modelaudit_picklescan-{version}-cp310-abi3-macosx_10_12_x86_64.whl",
|
|
874
|
+
f"modelaudit_picklescan-{version}-cp310-abi3-macosx_11_0_arm64.whl",
|
|
875
|
+
f"modelaudit_picklescan-{version}-cp310-abi3-manylinux_2_28_aarch64.whl",
|
|
876
|
+
f"modelaudit_picklescan-{version}-cp310-abi3-manylinux_2_28_x86_64.whl",
|
|
877
|
+
f"modelaudit_picklescan-{version}-cp310-abi3-win_amd64.whl",
|
|
878
|
+
f"modelaudit_picklescan-{version}.tar.gz",
|
|
879
|
+
}
|
|
880
|
+
if expected_files <= filenames:
|
|
881
|
+
compatible.append(version)
|
|
882
|
+
if compatible:
|
|
883
|
+
print(f"PyPI has compatible modelaudit-picklescan releases for {requirement}: {compatible}")
|
|
884
|
+
break
|
|
885
|
+
last_status = f"no complete, non-yanked release satisfies {requirement}"
|
|
886
|
+
except Exception as exc:
|
|
887
|
+
last_status = repr(exc)
|
|
888
|
+
time.sleep(10)
|
|
889
|
+
else:
|
|
890
|
+
raise SystemExit(f"Refusing to publish modelaudit with an unavailable picklescan dependency: {last_status}")
|
|
891
|
+
PY
|
|
892
|
+
|
|
716
893
|
- name: Publish to PyPI
|
|
717
894
|
uses: pypa/gh-action-pypi-publish@cef221092ed1bacb1cc03d23a2d87d1d172e277b # release/v1
|
|
718
895
|
with:
|
|
@@ -755,10 +932,12 @@ jobs:
|
|
|
755
932
|
- name: Wait for modelaudit-picklescan files on PyPI
|
|
756
933
|
run: |
|
|
757
934
|
python - <<'PY'
|
|
935
|
+
import gzip
|
|
758
936
|
import json
|
|
759
937
|
import os
|
|
760
938
|
import time
|
|
761
939
|
import urllib.request
|
|
940
|
+
import zlib
|
|
762
941
|
|
|
763
942
|
version = os.environ["EXPECTED_VERSION"]
|
|
764
943
|
expected_files = {
|
|
@@ -770,6 +949,7 @@ jobs:
|
|
|
770
949
|
f"modelaudit_picklescan-{version}.tar.gz",
|
|
771
950
|
}
|
|
772
951
|
url = f"https://pypi.org/pypi/modelaudit-picklescan/{version}/json"
|
|
952
|
+
simple_url = "https://pypi.org/simple/modelaudit-picklescan/"
|
|
773
953
|
deadline = time.monotonic() + 600
|
|
774
954
|
last_status = "not checked"
|
|
775
955
|
|
|
@@ -777,13 +957,35 @@ jobs:
|
|
|
777
957
|
try:
|
|
778
958
|
with urllib.request.urlopen(url, timeout=20) as response:
|
|
779
959
|
payload = json.load(response)
|
|
960
|
+
request = urllib.request.Request(
|
|
961
|
+
simple_url,
|
|
962
|
+
headers={
|
|
963
|
+
"Accept": "application/vnd.pypi.simple.v1+json, application/vnd.pypi.simple.v1+html; q=0.1, text/html; q=0.01",
|
|
964
|
+
"Accept-Encoding": "gzip, deflate",
|
|
965
|
+
"Cache-Control": "max-age=0",
|
|
966
|
+
},
|
|
967
|
+
)
|
|
968
|
+
with urllib.request.urlopen(request, timeout=20) as response:
|
|
969
|
+
simple_body = response.read()
|
|
970
|
+
content_encoding = response.headers.get("Content-Encoding", "identity").lower()
|
|
971
|
+
if content_encoding == "gzip":
|
|
972
|
+
simple_body = gzip.decompress(simple_body)
|
|
973
|
+
elif content_encoding == "deflate":
|
|
974
|
+
simple_body = zlib.decompress(simple_body)
|
|
975
|
+
elif content_encoding not in ("", "identity"):
|
|
976
|
+
raise ValueError(f"Unsupported Simple API Content-Encoding: {content_encoding!r}")
|
|
977
|
+
simple_payload = json.loads(simple_body)
|
|
780
978
|
filenames = {entry["filename"] for entry in payload.get("urls", [])}
|
|
979
|
+
simple_filenames = {
|
|
980
|
+
entry["filename"] for entry in simple_payload.get("files", []) if not entry.get("yanked", False)
|
|
981
|
+
}
|
|
781
982
|
missing = sorted(expected_files - filenames)
|
|
983
|
+
missing_simple = sorted(expected_files - simple_filenames)
|
|
782
984
|
info_version = payload.get("info", {}).get("version")
|
|
783
|
-
if info_version == version and not missing:
|
|
985
|
+
if info_version == version and not missing and not missing_simple:
|
|
784
986
|
print(f"PyPI has modelaudit-picklescan {version}: {sorted(filenames)}")
|
|
785
987
|
break
|
|
786
|
-
last_status = f"version={info_version!r}, missing={missing}"
|
|
988
|
+
last_status = f"version={info_version!r}, missing={missing}, missing_simple={missing_simple}"
|
|
787
989
|
except Exception as exc:
|
|
788
990
|
last_status = repr(exc)
|
|
789
991
|
time.sleep(10)
|
|
@@ -867,10 +1069,12 @@ jobs:
|
|
|
867
1069
|
- name: Wait for modelaudit files on PyPI
|
|
868
1070
|
run: |
|
|
869
1071
|
python - <<'PY'
|
|
1072
|
+
import gzip
|
|
870
1073
|
import json
|
|
871
1074
|
import os
|
|
872
1075
|
import time
|
|
873
1076
|
import urllib.request
|
|
1077
|
+
import zlib
|
|
874
1078
|
|
|
875
1079
|
version = os.environ["EXPECTED_VERSION"]
|
|
876
1080
|
expected_files = {
|
|
@@ -878,6 +1082,7 @@ jobs:
|
|
|
878
1082
|
f"modelaudit-{version}.tar.gz",
|
|
879
1083
|
}
|
|
880
1084
|
url = f"https://pypi.org/pypi/modelaudit/{version}/json"
|
|
1085
|
+
simple_url = "https://pypi.org/simple/modelaudit/"
|
|
881
1086
|
deadline = time.monotonic() + 600
|
|
882
1087
|
last_status = "not checked"
|
|
883
1088
|
|
|
@@ -885,13 +1090,35 @@ jobs:
|
|
|
885
1090
|
try:
|
|
886
1091
|
with urllib.request.urlopen(url, timeout=20) as response:
|
|
887
1092
|
payload = json.load(response)
|
|
1093
|
+
request = urllib.request.Request(
|
|
1094
|
+
simple_url,
|
|
1095
|
+
headers={
|
|
1096
|
+
"Accept": "application/vnd.pypi.simple.v1+json, application/vnd.pypi.simple.v1+html; q=0.1, text/html; q=0.01",
|
|
1097
|
+
"Accept-Encoding": "gzip, deflate",
|
|
1098
|
+
"Cache-Control": "max-age=0",
|
|
1099
|
+
},
|
|
1100
|
+
)
|
|
1101
|
+
with urllib.request.urlopen(request, timeout=20) as response:
|
|
1102
|
+
simple_body = response.read()
|
|
1103
|
+
content_encoding = response.headers.get("Content-Encoding", "identity").lower()
|
|
1104
|
+
if content_encoding == "gzip":
|
|
1105
|
+
simple_body = gzip.decompress(simple_body)
|
|
1106
|
+
elif content_encoding == "deflate":
|
|
1107
|
+
simple_body = zlib.decompress(simple_body)
|
|
1108
|
+
elif content_encoding not in ("", "identity"):
|
|
1109
|
+
raise ValueError(f"Unsupported Simple API Content-Encoding: {content_encoding!r}")
|
|
1110
|
+
simple_payload = json.loads(simple_body)
|
|
888
1111
|
filenames = {entry["filename"] for entry in payload.get("urls", [])}
|
|
1112
|
+
simple_filenames = {
|
|
1113
|
+
entry["filename"] for entry in simple_payload.get("files", []) if not entry.get("yanked", False)
|
|
1114
|
+
}
|
|
889
1115
|
missing = sorted(expected_files - filenames)
|
|
1116
|
+
missing_simple = sorted(expected_files - simple_filenames)
|
|
890
1117
|
info_version = payload.get("info", {}).get("version")
|
|
891
|
-
if info_version == version and not missing:
|
|
1118
|
+
if info_version == version and not missing and not missing_simple:
|
|
892
1119
|
print(f"PyPI has modelaudit {version}: {sorted(filenames)}")
|
|
893
1120
|
break
|
|
894
|
-
last_status = f"version={info_version!r}, missing={missing}"
|
|
1121
|
+
last_status = f"version={info_version!r}, missing={missing}, missing_simple={missing_simple}"
|
|
895
1122
|
except Exception as exc:
|
|
896
1123
|
last_status = repr(exc)
|
|
897
1124
|
time.sleep(10)
|
|
@@ -1063,7 +1290,7 @@ jobs:
|
|
|
1063
1290
|
path: dist/
|
|
1064
1291
|
|
|
1065
1292
|
- name: Generate artifact attestations
|
|
1066
|
-
uses: actions/attest-build-provenance@
|
|
1293
|
+
uses: actions/attest-build-provenance@0f67c3f4856b2e3261c31976d6725780e5e4c373 # v4
|
|
1067
1294
|
with:
|
|
1068
1295
|
subject-path: "dist/*"
|
|
1069
1296
|
|
|
@@ -1117,7 +1344,7 @@ jobs:
|
|
|
1117
1344
|
merge-multiple: true
|
|
1118
1345
|
|
|
1119
1346
|
- name: Generate artifact attestations
|
|
1120
|
-
uses: actions/attest-build-provenance@
|
|
1347
|
+
uses: actions/attest-build-provenance@0f67c3f4856b2e3261c31976d6725780e5e4c373 # v4
|
|
1121
1348
|
with:
|
|
1122
1349
|
subject-path: "dist/*"
|
|
1123
1350
|
|
|
@@ -94,7 +94,7 @@ jobs:
|
|
|
94
94
|
rustup default stable
|
|
95
95
|
|
|
96
96
|
- name: Cache Python dependencies
|
|
97
|
-
uses: actions/cache@
|
|
97
|
+
uses: actions/cache@caa296126883cff596d87d8935842f9db880ef25 # v5
|
|
98
98
|
with:
|
|
99
99
|
path: |
|
|
100
100
|
.venv
|
|
@@ -354,7 +354,9 @@ jobs:
|
|
|
354
354
|
|
|
355
355
|
- name: Pin Python version
|
|
356
356
|
run: |
|
|
357
|
-
|
|
357
|
+
# Match tool.mypy.python_version so version-gated dependency stubs use
|
|
358
|
+
# syntax valid for the minimum supported Python target.
|
|
359
|
+
uv python pin 3.10
|
|
358
360
|
|
|
359
361
|
- name: Install Rust toolchain
|
|
360
362
|
run: |
|
|
@@ -362,15 +364,15 @@ jobs:
|
|
|
362
364
|
rustup default stable
|
|
363
365
|
|
|
364
366
|
- name: Cache Python dependencies
|
|
365
|
-
uses: actions/cache@
|
|
367
|
+
uses: actions/cache@caa296126883cff596d87d8935842f9db880ef25 # v5
|
|
366
368
|
with:
|
|
367
369
|
path: |
|
|
368
370
|
.venv
|
|
369
371
|
~/.cache/pip
|
|
370
372
|
~/.cache/uv
|
|
371
|
-
key: ${{ runner.os }}-uv-py3.
|
|
373
|
+
key: ${{ runner.os }}-uv-py3.10-${{ hashFiles('**/uv.lock', '**/pyproject.toml') }}
|
|
372
374
|
restore-keys: |
|
|
373
|
-
${{ runner.os }}-uv-py3.
|
|
375
|
+
${{ runner.os }}-uv-py3.10-
|
|
374
376
|
${{ runner.os }}-uv-
|
|
375
377
|
|
|
376
378
|
- name: Sync dependencies
|
|
@@ -458,7 +460,7 @@ jobs:
|
|
|
458
460
|
rustup default stable
|
|
459
461
|
|
|
460
462
|
- name: Cache Python dependencies
|
|
461
|
-
uses: actions/cache@
|
|
463
|
+
uses: actions/cache@caa296126883cff596d87d8935842f9db880ef25 # v5
|
|
462
464
|
with:
|
|
463
465
|
path: |
|
|
464
466
|
.venv
|
|
@@ -516,7 +518,7 @@ jobs:
|
|
|
516
518
|
rustup default stable
|
|
517
519
|
|
|
518
520
|
- name: Cache Python dependencies
|
|
519
|
-
uses: actions/cache@
|
|
521
|
+
uses: actions/cache@caa296126883cff596d87d8935842f9db880ef25 # v5
|
|
520
522
|
with:
|
|
521
523
|
path: |
|
|
522
524
|
.venv
|
|
@@ -571,7 +573,7 @@ jobs:
|
|
|
571
573
|
rustup default stable
|
|
572
574
|
|
|
573
575
|
- name: Cache Python dependencies
|
|
574
|
-
uses: actions/cache@
|
|
576
|
+
uses: actions/cache@caa296126883cff596d87d8935842f9db880ef25 # v5
|
|
575
577
|
with:
|
|
576
578
|
path: |
|
|
577
579
|
.venv
|
|
@@ -615,9 +617,10 @@ jobs:
|
|
|
615
617
|
matrix:
|
|
616
618
|
# Test both NumPy versions with appropriate Python versions:
|
|
617
619
|
# - NumPy 1.x on Python 3.10 (last version supporting NumPy 1.x)
|
|
618
|
-
# - NumPy 2.x on Python 3.11
|
|
620
|
+
# - NumPy 2.4.x on Python 3.11 (NumPy 2.5 requires Python >=3.12)
|
|
621
|
+
# - NumPy 2.5.x on Python 3.12+
|
|
619
622
|
# Reduced matrix for PRs, full matrix for main and merge_group runs
|
|
620
|
-
include: ${{ github.event_name == 'pull_request' && fromJSON('[{"python-version":"3.10","numpy-mode":"1.x"},{"python-version":"3.11","numpy-mode":"2.x"}]') || fromJSON('[{"python-version":"3.10","numpy-mode":"1.x"},{"python-version":"3.11","numpy-mode":"2.x"},{"python-version":"3.12","numpy-mode":"2.x"},{"python-version":"3.13","numpy-mode":"2.x"}]') }}
|
|
623
|
+
include: ${{ github.event_name == 'pull_request' && fromJSON('[{"python-version":"3.10","numpy-mode":"1.x"},{"python-version":"3.11","numpy-mode":"2.x"},{"python-version":"3.12","numpy-mode":"2.x"}]') || fromJSON('[{"python-version":"3.10","numpy-mode":"1.x"},{"python-version":"3.11","numpy-mode":"2.x"},{"python-version":"3.12","numpy-mode":"2.x"},{"python-version":"3.13","numpy-mode":"2.x"}]') }}
|
|
621
624
|
steps:
|
|
622
625
|
- name: Checkout repo
|
|
623
626
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
|
|
@@ -637,7 +640,7 @@ jobs:
|
|
|
637
640
|
rustup default stable
|
|
638
641
|
|
|
639
642
|
- name: Cache Python dependencies
|
|
640
|
-
uses: actions/cache@
|
|
643
|
+
uses: actions/cache@caa296126883cff596d87d8935842f9db880ef25 # v5
|
|
641
644
|
with:
|
|
642
645
|
path: |
|
|
643
646
|
.venv
|
|
@@ -652,13 +655,28 @@ jobs:
|
|
|
652
655
|
- name: Install dependencies
|
|
653
656
|
run: |
|
|
654
657
|
# Dependencies are automatically version-matched based on Python version
|
|
655
|
-
# Python 3.10: NumPy 1.x
|
|
656
|
-
# Python 3.11
|
|
658
|
+
# Python 3.10: NumPy 1.x
|
|
659
|
+
# Python 3.11: NumPy 2.4.x
|
|
660
|
+
# Python 3.12+: NumPy 2.5.x
|
|
657
661
|
uv sync --extra all-ci
|
|
658
662
|
|
|
659
663
|
- name: Check NumPy version
|
|
660
664
|
run: |
|
|
661
|
-
uv run python -
|
|
665
|
+
uv run python - <<'PY'
|
|
666
|
+
import sys
|
|
667
|
+
|
|
668
|
+
import numpy
|
|
669
|
+
|
|
670
|
+
version = tuple(int(part) for part in numpy.__version__.split(".")[:2])
|
|
671
|
+
expected = {
|
|
672
|
+
(3, 10): (1, 0) <= version < (2, 0),
|
|
673
|
+
(3, 11): (2, 4) <= version < (2, 5),
|
|
674
|
+
(3, 12): (2, 5) <= version < (2, 6),
|
|
675
|
+
(3, 13): (2, 5) <= version < (2, 6),
|
|
676
|
+
}[sys.version_info[:2]]
|
|
677
|
+
assert expected, f"unexpected NumPy {numpy.__version__} on Python {sys.version_info[:2]}"
|
|
678
|
+
print(f"NumPy version: {numpy.__version__}")
|
|
679
|
+
PY
|
|
662
680
|
|
|
663
681
|
- name: Test scanner diagnostics
|
|
664
682
|
run: |
|
|
@@ -868,7 +886,7 @@ jobs:
|
|
|
868
886
|
rustup default stable
|
|
869
887
|
|
|
870
888
|
- name: Cache Python dependencies
|
|
871
|
-
uses: actions/cache@
|
|
889
|
+
uses: actions/cache@caa296126883cff596d87d8935842f9db880ef25 # v5
|
|
872
890
|
with:
|
|
873
891
|
path: |
|
|
874
892
|
.venv
|
|
@@ -960,7 +978,7 @@ jobs:
|
|
|
960
978
|
rustup default stable
|
|
961
979
|
|
|
962
980
|
- name: Cache Cargo dependencies
|
|
963
|
-
uses: actions/cache@
|
|
981
|
+
uses: actions/cache@caa296126883cff596d87d8935842f9db880ef25 # v5
|
|
964
982
|
with:
|
|
965
983
|
path: |
|
|
966
984
|
~/.cargo/registry
|
|
@@ -1013,7 +1031,7 @@ jobs:
|
|
|
1013
1031
|
|
|
1014
1032
|
- name: Run standalone package tests
|
|
1015
1033
|
run: |
|
|
1016
|
-
uv run --with pytest --with pytest-xdist pytest -n auto tests --tb=short
|
|
1034
|
+
uv run --with pytest --with pytest-xdist --with 'typing-extensions>=4.14' pytest -n auto tests --tb=short
|
|
1017
1035
|
|
|
1018
1036
|
- name: Build standalone package
|
|
1019
1037
|
run: |
|