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.
Files changed (683) hide show
  1. {modelaudit-0.2.49 → modelaudit-0.2.51}/.github/workflows/release-please.yml +290 -63
  2. {modelaudit-0.2.49 → modelaudit-0.2.51}/.github/workflows/test.yml +35 -17
  3. modelaudit-0.2.51/.release-please-manifest.json +4 -0
  4. {modelaudit-0.2.49 → modelaudit-0.2.51}/AGENTS.md +1 -1
  5. {modelaudit-0.2.49 → modelaudit-0.2.51}/CHANGELOG.md +31 -8
  6. {modelaudit-0.2.49 → modelaudit-0.2.51}/Dockerfile.full +1 -1
  7. {modelaudit-0.2.49 → modelaudit-0.2.51}/Dockerfile.tensorflow +1 -1
  8. {modelaudit-0.2.49 → modelaudit-0.2.51}/PKG-INFO +15 -9
  9. {modelaudit-0.2.49 → modelaudit-0.2.51}/README.md +4 -0
  10. {modelaudit-0.2.49 → modelaudit-0.2.51}/docs/agents/release-process.md +4 -2
  11. {modelaudit-0.2.49 → modelaudit-0.2.51}/docs/maintainers/dependency-policy.md +2 -1
  12. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/__init__.py +8 -3
  13. modelaudit-0.2.51/modelaudit/__main__.py +34 -0
  14. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/auth/config.py +22 -4
  15. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/cache/cache_manager.py +16 -0
  16. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/cache/scan_results_cache.py +51 -7
  17. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/core.py +51 -3
  18. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/integrations/mlflow.py +82 -2
  19. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/integrations/sbom_generator.py +16 -12
  20. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/integrations/source_redaction.py +4 -2
  21. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/joblib_scanner.py +53 -0
  22. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/helpers/cache_decorator.py +30 -18
  23. {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/AGENTS.md +2 -2
  24. {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/CHANGELOG.md +9 -10
  25. {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/Cargo.lock +1 -1
  26. {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/Cargo.toml +1 -1
  27. {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/pyproject.toml +1 -1
  28. {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/rust/src/nested.rs +2 -2
  29. {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/src/modelaudit_picklescan/call_graph.py +144 -13
  30. {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/tests/test_adversarial_pickle_oracle.py +5 -1
  31. {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/tests/test_api.py +91 -10
  32. {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/tests/test_call_graph_import_statements.py +208 -3
  33. {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/tests/test_call_graph_safe_spec_resolution.py +18 -0
  34. {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/uv.lock +1 -1
  35. {modelaudit-0.2.49 → modelaudit-0.2.51}/pyproject.toml +14 -11
  36. modelaudit-0.2.51/renovate.json +37 -0
  37. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/cache/test_cache_correctness.py +120 -0
  38. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/conftest.py +1 -0
  39. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/helpers/__init__.py +20 -0
  40. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/integrations/test_jfrog.py +1 -1
  41. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/integrations/test_mlflow_integration.py +2 -0
  42. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/integrations/test_sarif_redaction.py +9 -8
  43. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/integrations/test_sbom_symlink_containment.py +14 -4
  44. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_joblib_scanner_codecs.py +75 -1
  45. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_onnx_scanner.py +16 -7
  46. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_tar_scanner.py +2 -1
  47. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_text_scanner.py +7 -1
  48. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_asset_inventory_integration.py +15 -1
  49. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_auth_config.py +107 -0
  50. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_core.py +174 -8
  51. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_dependency_lock.py +19 -1
  52. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_dill_joblib_enhanced.py +35 -1
  53. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_integration.py +20 -4
  54. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_lazy_loading_integration.py +5 -2
  55. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_network_comm_integration.py +17 -6
  56. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_performance_benchmarks.py +8 -2
  57. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_real_world_dill_joblib.py +34 -16
  58. modelaudit-0.2.51/tests/test_release_workflow.py +595 -0
  59. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_security_asset_integration.py +52 -25
  60. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/utils/file/test_file_type_validation_integration.py +6 -3
  61. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/utils/file/test_integration_file_type_demo.py +6 -2
  62. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/utils/helpers/test_interrupt_handling.py +43 -0
  63. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/utils/sources/test_huggingface.py +25 -6
  64. {modelaudit-0.2.49 → modelaudit-0.2.51}/uv.lock +287 -240
  65. modelaudit-0.2.49/.release-please-manifest.json +0 -4
  66. modelaudit-0.2.49/modelaudit/__main__.py +0 -6
  67. modelaudit-0.2.49/renovate.json +0 -18
  68. modelaudit-0.2.49/tests/test_release_workflow.py +0 -236
  69. {modelaudit-0.2.49 → modelaudit-0.2.51}/.dockerignore +0 -0
  70. {modelaudit-0.2.49 → modelaudit-0.2.51}/.editorconfig +0 -0
  71. {modelaudit-0.2.49 → modelaudit-0.2.51}/.gitattributes +0 -0
  72. {modelaudit-0.2.49 → modelaudit-0.2.51}/.github/CODEOWNERS +0 -0
  73. {modelaudit-0.2.49 → modelaudit-0.2.51}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  74. {modelaudit-0.2.49 → modelaudit-0.2.51}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  75. {modelaudit-0.2.49 → modelaudit-0.2.51}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  76. {modelaudit-0.2.49 → modelaudit-0.2.51}/.github/markdown-link-check-config.json +0 -0
  77. {modelaudit-0.2.49 → modelaudit-0.2.51}/.github/workflows/README.md +0 -0
  78. {modelaudit-0.2.49 → modelaudit-0.2.51}/.github/workflows/codeql.yml +0 -0
  79. {modelaudit-0.2.49 → modelaudit-0.2.51}/.github/workflows/docker-image-test.yml +0 -0
  80. {modelaudit-0.2.49 → modelaudit-0.2.51}/.github/workflows/docker-publish.yml +0 -0
  81. {modelaudit-0.2.49 → modelaudit-0.2.51}/.github/workflows/docs-check.yml +0 -0
  82. {modelaudit-0.2.49 → modelaudit-0.2.51}/.github/workflows/nightly.yml +0 -0
  83. {modelaudit-0.2.49 → modelaudit-0.2.51}/.github/workflows/perf.yml +0 -0
  84. {modelaudit-0.2.49 → modelaudit-0.2.51}/.github/workflows/validate-pr-title.yml +0 -0
  85. {modelaudit-0.2.49 → modelaudit-0.2.51}/.gitignore +0 -0
  86. {modelaudit-0.2.49 → modelaudit-0.2.51}/.mailmap +0 -0
  87. {modelaudit-0.2.49 → modelaudit-0.2.51}/.modelaudit.toml.example +0 -0
  88. {modelaudit-0.2.49 → modelaudit-0.2.51}/.prettierignore +0 -0
  89. {modelaudit-0.2.49 → modelaudit-0.2.51}/CLAUDE.md +0 -0
  90. {modelaudit-0.2.49 → modelaudit-0.2.51}/CODE_OF_CONDUCT.md +0 -0
  91. {modelaudit-0.2.49 → modelaudit-0.2.51}/CONTRIBUTING.md +0 -0
  92. {modelaudit-0.2.49 → modelaudit-0.2.51}/Dockerfile +0 -0
  93. {modelaudit-0.2.49 → modelaudit-0.2.51}/LICENSE +0 -0
  94. {modelaudit-0.2.49 → modelaudit-0.2.51}/MAINTAINERS.md +0 -0
  95. {modelaudit-0.2.49 → modelaudit-0.2.51}/MANIFEST.in +0 -0
  96. {modelaudit-0.2.49 → modelaudit-0.2.51}/RULES.md +0 -0
  97. {modelaudit-0.2.49 → modelaudit-0.2.51}/SECURITY.md +0 -0
  98. {modelaudit-0.2.49 → modelaudit-0.2.51}/SUPPORT.md +0 -0
  99. {modelaudit-0.2.49 → modelaudit-0.2.51}/THIRD_PARTY_NOTICES.md +0 -0
  100. {modelaudit-0.2.49 → modelaudit-0.2.51}/codecov.yml +0 -0
  101. {modelaudit-0.2.49 → modelaudit-0.2.51}/docker-compose.yml +0 -0
  102. {modelaudit-0.2.49 → modelaudit-0.2.51}/docker-entrypoint.sh +0 -0
  103. {modelaudit-0.2.49 → modelaudit-0.2.51}/docs/agents/architecture.md +0 -0
  104. {modelaudit-0.2.49 → modelaudit-0.2.51}/docs/agents/dependencies.md +0 -0
  105. {modelaudit-0.2.49 → modelaudit-0.2.51}/docs/agents/new-scanner-quickstart.md +0 -0
  106. {modelaudit-0.2.49 → modelaudit-0.2.51}/docs/agents/performance-audit.md +0 -0
  107. {modelaudit-0.2.49 → modelaudit-0.2.51}/docs/agents/picklescan-package-split.md +0 -0
  108. {modelaudit-0.2.49 → modelaudit-0.2.51}/docs/maintainers/cve-process.md +0 -0
  109. {modelaudit-0.2.49 → modelaudit-0.2.51}/docs/maintainers/scanner-cve-coverage.md +0 -0
  110. {modelaudit-0.2.49 → modelaudit-0.2.51}/docs/maintainers/triage-playbook.md +0 -0
  111. {modelaudit-0.2.49 → modelaudit-0.2.51}/docs/security/threat-model.md +0 -0
  112. {modelaudit-0.2.49 → modelaudit-0.2.51}/docs/user/compatibility-matrix.md +0 -0
  113. {modelaudit-0.2.49 → modelaudit-0.2.51}/docs/user/metadata-extraction.md +0 -0
  114. {modelaudit-0.2.49 → modelaudit-0.2.51}/docs/user/offline-air-gapped.md +0 -0
  115. {modelaudit-0.2.49 → modelaudit-0.2.51}/docs/user/scanner-selection.md +0 -0
  116. {modelaudit-0.2.49 → modelaudit-0.2.51}/docs/user/security-model.md +0 -0
  117. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/analysis/__init__.py +0 -0
  118. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/analysis/anomaly_detector.py +0 -0
  119. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/analysis/entropy_analyzer.py +0 -0
  120. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/analysis/framework_patterns.py +0 -0
  121. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/analysis/integrated_analyzer.py +0 -0
  122. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/analysis/ml_context_analyzer.py +0 -0
  123. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/analysis/opcode_sequence_analyzer.py +0 -0
  124. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/analysis/semantic_analyzer.py +0 -0
  125. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/analysis/unified_context.py +0 -0
  126. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/auth/__init__.py +0 -0
  127. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/auth/client.py +0 -0
  128. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/cache/__init__.py +0 -0
  129. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/cache/adaptive_cache_keys.py +0 -0
  130. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/cache/batch_operations.py +0 -0
  131. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/cache/cache_policy.py +0 -0
  132. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/cache/optimized_config.py +0 -0
  133. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/cache/trusted_config_store.py +0 -0
  134. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/cli.py +0 -0
  135. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/config/__init__.py +0 -0
  136. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/config/constants.py +0 -0
  137. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/config/data/public_suffix_list.dat +0 -0
  138. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/config/data/spdx_licenses.json +0 -0
  139. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/config/explanations.py +0 -0
  140. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/config/generated_keras_layers.py +0 -0
  141. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/config/local_config.py +0 -0
  142. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/config/name_blacklist.py +0 -0
  143. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/config/rule_config.py +0 -0
  144. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/core_results.py +0 -0
  145. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/detectors/__init__.py +0 -0
  146. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/detectors/cve_patterns.py +0 -0
  147. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/detectors/jit_script.py +0 -0
  148. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/detectors/network_comm.py +0 -0
  149. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/detectors/secrets.py +0 -0
  150. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/detectors/suspicious_symbols.py +0 -0
  151. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/integrations/__init__.py +0 -0
  152. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/integrations/jfrog.py +0 -0
  153. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/integrations/license_checker.py +0 -0
  154. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/integrations/sarif_formatter.py +0 -0
  155. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/metadata_extractor.py +0 -0
  156. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/models.py +0 -0
  157. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/progress/__init__.py +0 -0
  158. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/progress/base.py +0 -0
  159. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/progress/console.py +0 -0
  160. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/progress/file.py +0 -0
  161. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/progress/hooks.py +0 -0
  162. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/progress/multi_phase.py +0 -0
  163. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/LICENSE +0 -0
  164. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/NOTICE +0 -0
  165. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/__init__.py +0 -0
  166. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/py.typed +0 -0
  167. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/__init__.py +0 -0
  168. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/__init__.py +0 -0
  169. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/__init__.py +0 -0
  170. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/allocation_description_pb2.py +0 -0
  171. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/api_def_pb2.py +0 -0
  172. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/attr_value_pb2.py +0 -0
  173. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/cost_graph_pb2.py +0 -0
  174. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/cpp_shape_inference_pb2.py +0 -0
  175. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/dataset_metadata_pb2.py +0 -0
  176. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/dataset_options_pb2.py +0 -0
  177. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/dataset_pb2.py +0 -0
  178. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/device_attributes_pb2.py +0 -0
  179. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/full_type_pb2.py +0 -0
  180. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/function_pb2.py +0 -0
  181. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/graph_debug_info_pb2.py +0 -0
  182. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/graph_pb2.py +0 -0
  183. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/graph_transfer_info_pb2.py +0 -0
  184. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/kernel_def_pb2.py +0 -0
  185. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/log_memory_pb2.py +0 -0
  186. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/model_pb2.py +0 -0
  187. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/node_def_pb2.py +0 -0
  188. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/op_def_pb2.py +0 -0
  189. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/optimized_function_graph_pb2.py +0 -0
  190. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/reader_base_pb2.py +0 -0
  191. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/resource_handle_pb2.py +0 -0
  192. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/step_stats_pb2.py +0 -0
  193. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/tensor_description_pb2.py +0 -0
  194. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/tensor_pb2.py +0 -0
  195. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/tensor_shape_pb2.py +0 -0
  196. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/tensor_slice_pb2.py +0 -0
  197. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/types_pb2.py +0 -0
  198. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/variable_pb2.py +0 -0
  199. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/framework/versions_pb2.py +0 -0
  200. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/protobuf/__init__.py +0 -0
  201. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/protobuf/cluster_pb2.py +0 -0
  202. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/protobuf/composite_tensor_variant_pb2.py +0 -0
  203. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/protobuf/control_flow_pb2.py +0 -0
  204. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/protobuf/core_platform_payloads_pb2.py +0 -0
  205. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/protobuf/critical_section_pb2.py +0 -0
  206. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/protobuf/data_service_pb2.py +0 -0
  207. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/protobuf/debug_event_pb2.py +0 -0
  208. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/protobuf/debug_pb2.py +0 -0
  209. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/protobuf/device_filters_pb2.py +0 -0
  210. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/protobuf/device_properties_pb2.py +0 -0
  211. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/protobuf/fingerprint_pb2.py +0 -0
  212. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/protobuf/meta_graph_pb2.py +0 -0
  213. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/protobuf/named_tensor_pb2.py +0 -0
  214. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/protobuf/remote_tensor_handle_pb2.py +0 -0
  215. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/protobuf/rewriter_config_pb2.py +0 -0
  216. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/protobuf/saved_model_pb2.py +0 -0
  217. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/protobuf/saved_object_graph_pb2.py +0 -0
  218. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/protobuf/saver_pb2.py +0 -0
  219. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/protobuf/service_config_pb2.py +0 -0
  220. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/protobuf/snapshot_pb2.py +0 -0
  221. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/protobuf/struct_pb2.py +0 -0
  222. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/protobuf/tensor_bundle_pb2.py +0 -0
  223. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/protobuf/trackable_object_graph_pb2.py +0 -0
  224. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/protobuf/transport_options_pb2.py +0 -0
  225. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/protos/tensorflow/core/protobuf/verifier_config_pb2.py +0 -0
  226. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/py.typed +0 -0
  227. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/rule_catalog.py +0 -0
  228. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/rules.py +0 -0
  229. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanner_registry_metadata.py +0 -0
  230. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanner_results.py +0 -0
  231. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanner_selection.py +0 -0
  232. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/__init__.py +0 -0
  233. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/_archive_config.py +0 -0
  234. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/_archive_locations.py +0 -0
  235. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/_archive_outcomes.py +0 -0
  236. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/_catboost_evidence_redaction.py +0 -0
  237. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/_evidence_redaction.py +0 -0
  238. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/_string_extraction.py +0 -0
  239. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/archive_dispatch.py +0 -0
  240. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/archive_member_security.py +0 -0
  241. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/base.py +0 -0
  242. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/catboost_scanner.py +0 -0
  243. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/cntk_scanner.py +0 -0
  244. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/compressed_scanner.py +0 -0
  245. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/coreml_scanner.py +0 -0
  246. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/executorch_scanner.py +0 -0
  247. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/flax_msgpack_scanner.py +0 -0
  248. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/gguf_scanner.py +0 -0
  249. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/jax_checkpoint_scanner.py +0 -0
  250. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/jinja2_template_scanner.py +0 -0
  251. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/keras_h5_scanner.py +0 -0
  252. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/keras_utils.py +0 -0
  253. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/keras_zip_scanner.py +0 -0
  254. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/lightgbm_scanner.py +0 -0
  255. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/llamafile_scanner.py +0 -0
  256. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/manifest_scanner.py +0 -0
  257. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/metadata_scanner.py +0 -0
  258. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/mxnet_scanner.py +0 -0
  259. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/nemo_scanner.py +0 -0
  260. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/numpy_scanner.py +0 -0
  261. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/oci_layer_scanner.py +0 -0
  262. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/onnx_scanner.py +0 -0
  263. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/openvino_scanner.py +0 -0
  264. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/paddle_scanner.py +0 -0
  265. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/pickle_scanner.py +0 -0
  266. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/picklescan_adapter.py +0 -0
  267. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/pmml_scanner.py +0 -0
  268. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/protobuf_model_candidate_scanner.py +0 -0
  269. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/pytorch_binary_scanner.py +0 -0
  270. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/pytorch_zip_scanner.py +0 -0
  271. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/pytorch_zip_support/__init__.py +0 -0
  272. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/pytorch_zip_support/archive_members.py +0 -0
  273. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/r_serialized_scanner.py +0 -0
  274. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/rar_scanner.py +0 -0
  275. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/rknn_scanner.py +0 -0
  276. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/rule_mapper.py +0 -0
  277. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/safetensors_scanner.py +0 -0
  278. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/sevenzip_scanner.py +0 -0
  279. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/skops_scanner.py +0 -0
  280. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/tar_scanner.py +0 -0
  281. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/tensorrt_scanner.py +0 -0
  282. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/text_scanner.py +0 -0
  283. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/tf_metagraph_scanner.py +0 -0
  284. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/tf_savedmodel_scanner.py +0 -0
  285. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/tflite_scanner.py +0 -0
  286. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/torch7_scanner.py +0 -0
  287. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/torchserve_mar_scanner.py +0 -0
  288. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/weight_distribution_scanner.py +0 -0
  289. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/xgboost_scanner.py +0 -0
  290. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/scanners/zip_scanner.py +0 -0
  291. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/telemetry.py +0 -0
  292. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/__init__.py +0 -0
  293. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/_path_hardening.py +0 -0
  294. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/auto_defaults.py +0 -0
  295. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/file/__init__.py +0 -0
  296. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/file/_compression.py +0 -0
  297. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/file/detection.py +0 -0
  298. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/file/filtering.py +0 -0
  299. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/file/handlers.py +0 -0
  300. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/file/hdf5.py +0 -0
  301. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/file/large_file_handler.py +0 -0
  302. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/file/streaming.py +0 -0
  303. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/helpers/__init__.py +0 -0
  304. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/helpers/assets.py +0 -0
  305. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/helpers/auto_defaults.py +0 -0
  306. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/helpers/code_validation.py +0 -0
  307. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/helpers/disk_space.py +0 -0
  308. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/helpers/file_hash.py +0 -0
  309. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/helpers/file_iterator.py +0 -0
  310. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/helpers/interrupt_handler.py +0 -0
  311. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/helpers/ml_context.py +0 -0
  312. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/helpers/result_conversion.py +0 -0
  313. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/helpers/retry.py +0 -0
  314. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/helpers/secure_hasher.py +0 -0
  315. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/helpers/types.py +0 -0
  316. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/lfs.py +0 -0
  317. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/model_extensions.py +0 -0
  318. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/repository_context.py +0 -0
  319. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/sources/__init__.py +0 -0
  320. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/sources/_huggingface_cache.py +0 -0
  321. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/sources/_huggingface_download_worker.py +0 -0
  322. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/sources/cloud_storage.py +0 -0
  323. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/sources/dvc.py +0 -0
  324. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/sources/huggingface.py +0 -0
  325. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/sources/huggingface_paths.py +0 -0
  326. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/sources/jfrog.py +0 -0
  327. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/sources/pytorch_hub.py +0 -0
  328. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/utils/tensorflow_compat.py +0 -0
  329. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/version.py +0 -0
  330. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/whitelists/__init__.py +0 -0
  331. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/whitelists/huggingface_organizations.py +0 -0
  332. {modelaudit-0.2.49 → modelaudit-0.2.51}/modelaudit/whitelists/huggingface_popular.py +0 -0
  333. {modelaudit-0.2.49 → modelaudit-0.2.51}/package-lock.json +0 -0
  334. {modelaudit-0.2.49 → modelaudit-0.2.51}/package.json +0 -0
  335. {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/README.md +0 -0
  336. {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/rust/README.md +0 -0
  337. {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/rust/src/expansion.rs +0 -0
  338. {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/rust/src/lib.rs +0 -0
  339. {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/rust/src/nested_surface.rs +0 -0
  340. {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/rust/src/opcode.rs +0 -0
  341. {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/rust/src/options.rs +0 -0
  342. {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/rust/src/policy.rs +0 -0
  343. {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/rust/src/post_budget.rs +0 -0
  344. {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/rust/src/pybridge.rs +0 -0
  345. {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/rust/src/report.rs +0 -0
  346. {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/rust/src/stack.rs +0 -0
  347. {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/rust/src/state.rs +0 -0
  348. {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/rust/src/strings.rs +0 -0
  349. {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/rust/src/strings_policy.rs +0 -0
  350. {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/src/modelaudit_picklescan/__init__.py +0 -0
  351. {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/src/modelaudit_picklescan/api.py +0 -0
  352. {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/src/modelaudit_picklescan/options.py +0 -0
  353. {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/src/modelaudit_picklescan/py.typed +0 -0
  354. {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/src/modelaudit_picklescan/report.py +0 -0
  355. {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/tests/conftest.py +0 -0
  356. {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/tests/parity_corpus.py +0 -0
  357. {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/tests/test_call_graph_assignment_alias_cycle.py +0 -0
  358. {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/tests/test_call_graph_click.py +0 -0
  359. {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/tests/test_call_graph_execnet.py +0 -0
  360. {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/tests/test_call_graph_instance_defaults.py +0 -0
  361. {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/tests/test_call_graph_local_imports.py +0 -0
  362. {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/tests/test_call_graph_six.py +0 -0
  363. {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/tests/test_call_graph_tkinter.py +0 -0
  364. {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/tests/test_import_boundary.py +0 -0
  365. {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/tests/test_known_size_streams.py +0 -0
  366. {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/tests/test_native_interface.py +0 -0
  367. {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/tests/test_nested_budget_limits.py +0 -0
  368. {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/tests/test_options.py +0 -0
  369. {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/tests/test_protocol0_line_operands.py +0 -0
  370. {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/tests/test_report.py +0 -0
  371. {modelaudit-0.2.49 → modelaudit-0.2.51}/packages/modelaudit-picklescan/tests/test_rust_engine.py +0 -0
  372. {modelaudit-0.2.49 → modelaudit-0.2.51}/pyproject.toml.example +0 -0
  373. {modelaudit-0.2.49 → modelaudit-0.2.51}/release-please-config.json +0 -0
  374. {modelaudit-0.2.49 → modelaudit-0.2.51}/requirements-tensorflow.txt +0 -0
  375. {modelaudit-0.2.49 → modelaudit-0.2.51}/scripts/README.md +0 -0
  376. {modelaudit-0.2.49 → modelaudit-0.2.51}/scripts/benchmark_report.py +0 -0
  377. {modelaudit-0.2.49 → modelaudit-0.2.51}/scripts/check_circular_imports.py +0 -0
  378. {modelaudit-0.2.49 → modelaudit-0.2.51}/scripts/compile_tensorflow_protos.sh +0 -0
  379. {modelaudit-0.2.49 → modelaudit-0.2.51}/scripts/fetch_hf_org_models.py +0 -0
  380. {modelaudit-0.2.49 → modelaudit-0.2.51}/scripts/fetch_hf_top_models.py +0 -0
  381. {modelaudit-0.2.49 → modelaudit-0.2.51}/scripts/generate_keras_layer_inventory.py +0 -0
  382. {modelaudit-0.2.49 → modelaudit-0.2.51}/scripts/jax_flax_scanning_demo.py +0 -0
  383. {modelaudit-0.2.49 → modelaudit-0.2.51}/scripts/large_pickle_corpus_qa.py +0 -0
  384. {modelaudit-0.2.49 → modelaudit-0.2.51}/scripts/minimal_circular_check.py +0 -0
  385. {modelaudit-0.2.49 → modelaudit-0.2.51}/scripts/profile_scan.py +0 -0
  386. {modelaudit-0.2.49 → modelaudit-0.2.51}/scripts/validate_docker_publish_tag.py +0 -0
  387. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/__init__.py +0 -0
  388. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/analysis/test_analysis_modules.py +0 -0
  389. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/analysis/test_anomaly_detector.py +0 -0
  390. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/analysis/test_entropy_analyzer.py +0 -0
  391. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/analysis/test_framework_patterns.py +0 -0
  392. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/analysis/test_ml_context_analyzer.py +0 -0
  393. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/analysis/test_opcode_sequence_analyzer.py +0 -0
  394. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/analysis/test_unified_context.py +0 -0
  395. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/exploits/exploit1_basic_torch_bypass.pkl +0 -0
  396. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/exploits/exploit2_advanced_torch_bypass.pkl +0 -0
  397. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/exploits/exploit3_sophisticated_hybrid.pkl +0 -0
  398. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/exploits/exploit4_supply_chain_attack.pkl +0 -0
  399. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/exploits/exploit5_ultra_high_confidence.pkl +0 -0
  400. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/exploits/exploit6_ordereddict_bypass.pkl +0 -0
  401. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/exploits/exploit7_nested_collections.pkl +0 -0
  402. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/exploits/exploit9_manual_construction.pkl +0 -0
  403. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/exploits/exploit_ultimate_50pct.pkl +0 -0
  404. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/generators/generate_7z_test_assets.py +0 -0
  405. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/generators/generate_advanced_pickle_tests.py +0 -0
  406. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/generators/generate_evil_pickle.py +0 -0
  407. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/generators/generate_jinja2_test_assets.py +0 -0
  408. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/generators/generate_nested_pickle_assets.py +0 -0
  409. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/generators/generate_os_alias_tests.py +0 -0
  410. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/generators/generate_safe_nested_assets.py +0 -0
  411. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/generators/generate_safetensors_assets.py +0 -0
  412. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/generators/generate_security_assets.py +0 -0
  413. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/huggingface_false_positive_manifest.json +0 -0
  414. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/pickles/memo_attack.pkl +0 -0
  415. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/pickles/multiple_stream_attack.pkl +0 -0
  416. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/pickles/nt_alias_attack.pkl +0 -0
  417. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/pickles/posix_alias_attack.pkl +0 -0
  418. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/pickles/stack_global_attack.pkl +0 -0
  419. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/archives/path_traversal.zip +0 -0
  420. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/archives/safe_model.zip +0 -0
  421. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/benign/chatml_format.json +0 -0
  422. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/benign/complex_legitimate.json +0 -0
  423. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/benign/conditional_system.json +0 -0
  424. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/benign/huggingface_llama.json +0 -0
  425. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/benign/simple_roles.json +0 -0
  426. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/benign/special_tokens.json +0 -0
  427. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/edge_cases/empty_template.json +0 -0
  428. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/edge_cases/malformed_template.json +0 -0
  429. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/edge_cases/multiple_templates.json +0 -0
  430. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/edge_cases/no_template.json +0 -0
  431. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/edge_cases/oversized_template.json +0 -0
  432. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/malicious/attr_bypass.json +0 -0
  433. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/malicious/combined_attack.json +0 -0
  434. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/malicious/config_exploit.json +0 -0
  435. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/malicious/cve_2024_34359_original.json +0 -0
  436. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/malicious/direct_eval.json +0 -0
  437. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/malicious/env_extraction.json +0 -0
  438. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/malicious/file_access.json +0 -0
  439. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/malicious/hex_bypass.json +0 -0
  440. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/malicious/loop_discovery.json +0 -0
  441. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/malicious/network_exfil.json +0 -0
  442. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/malicious/request_exploit.json +0 -0
  443. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/malicious/subprocess_injection.json +0 -0
  444. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/obfuscated/base64_payload.json +0 -0
  445. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/obfuscated/char_construction.json +0 -0
  446. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/obfuscated/format_bypass.json +0 -0
  447. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/obfuscated/getattr_bypass.json +0 -0
  448. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/standalone/benign_chat.j2 +0 -0
  449. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/standalone/malicious_standalone.jinja +0 -0
  450. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/standalone/malicious_subprocess.template +0 -0
  451. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/standalone/suspicious_benign.template +0 -0
  452. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/yaml/malicious_config.yaml +0 -0
  453. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/jinja2/yaml/model_config.yaml +0 -0
  454. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/keras/custom_layer_attack.h5 +0 -0
  455. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/keras/loss_injection.h5 +0 -0
  456. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/keras/malicious_lambda.h5 +0 -0
  457. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/keras/metric_injection.h5 +0 -0
  458. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/keras/safe_model.h5 +0 -0
  459. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/manifests/safe_config.json +0 -0
  460. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/manifests/suspicious_config.json +0 -0
  461. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/pickles/decode_exec_chain.pkl +0 -0
  462. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/pickles/dill_func.pkl +0 -0
  463. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/pickles/malicious_model_realistic.pkl +0 -0
  464. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/pickles/malicious_system_call.pkl +0 -0
  465. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/pickles/nested_pickle_base64.pkl +0 -0
  466. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/pickles/nested_pickle_hex.pkl +0 -0
  467. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/pickles/nested_pickle_multistage.pkl +0 -0
  468. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/pickles/nested_pickle_raw.pkl +0 -0
  469. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/pickles/safe_data.pkl +0 -0
  470. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/pickles/safe_large_model.pkl +0 -0
  471. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/pickles/safe_model_with_binary.pkl +0 -0
  472. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/pickles/safe_model_with_encoding.pkl +0 -0
  473. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/pickles/safe_model_with_tokens.pkl +0 -0
  474. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/pickles/safe_nested_structure.pkl +0 -0
  475. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/pickles/simple_nested.pkl +0 -0
  476. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/pipeline.skops +0 -0
  477. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/pytorch/malicious_eval.pt +0 -0
  478. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/pytorch/safe_model.pt +0 -0
  479. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/safetensors/malicious_import.safetensors +0 -0
  480. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/safetensors/safe_model.safetensors +0 -0
  481. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/sentencepiece/custom_unknown_disabled_specials.model +0 -0
  482. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/sentencepiece/custom_unknown_disabled_specials_byte_fallback.model +0 -0
  483. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/tensorflow/malicious_pyfunc/saved_model.pb +0 -0
  484. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/samples/tensorflow/safe_savedmodel/saved_model.pb +0 -0
  485. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/scenarios/license_scenarios/agpl_component/agpl_model.pkl +0 -0
  486. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/scenarios/license_scenarios/agpl_component/neural_network.py +0 -0
  487. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/scenarios/license_scenarios/mit_model/config.json +0 -0
  488. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/scenarios/license_scenarios/mit_model/model.py +0 -0
  489. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/scenarios/license_scenarios/mit_model/model_weights.pkl +0 -0
  490. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/scenarios/license_scenarios/mixed_licenses/LICENSE +0 -0
  491. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/scenarios/license_scenarios/mixed_licenses/apache_component.py +0 -0
  492. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/scenarios/license_scenarios/mixed_licenses/dataset_cc_nc.json +0 -0
  493. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/scenarios/license_scenarios/mixed_licenses/gpl_utility.py +0 -0
  494. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/scenarios/license_scenarios/mixed_licenses/mixed_model.pkl +0 -0
  495. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/scenarios/license_scenarios/unlicensed_dataset/embeddings.npy +0 -0
  496. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/scenarios/license_scenarios/unlicensed_dataset/features.csv +0 -0
  497. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/scenarios/license_scenarios/unlicensed_dataset/training_data.json +0 -0
  498. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/scenarios/security_scenarios/mixed_malicious_model/config.json +0 -0
  499. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/assets/scenarios/security_scenarios/mixed_malicious_model/model.pkl +0 -0
  500. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/benchmarks/test_picklescan_benchmarks.py +0 -0
  501. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/benchmarks/test_scan_benchmarks.py +0 -0
  502. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/cache/__init__.py +0 -0
  503. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/cache/test_optimized_config.py +0 -0
  504. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/cli_output.py +0 -0
  505. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/config/__init__.py +0 -0
  506. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/config/test_name_blacklist.py +0 -0
  507. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/demo_license_functionality.py +0 -0
  508. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/detectors/test_builtin_detection.py +0 -0
  509. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/detectors/test_compile_eval_variants.py +0 -0
  510. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/detectors/test_cve_detection.py +0 -0
  511. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/detectors/test_cve_detection.py_cases/test_pickle_binunicode8_setitem.py +0 -0
  512. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/detectors/test_jit_script_detector.py +0 -0
  513. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/detectors/test_network_comm_detector.py +0 -0
  514. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/detectors/test_runpy_detection.py +0 -0
  515. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/detectors/test_secrets_detector.py +0 -0
  516. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/detectors/test_suspicious_symbols.py +0 -0
  517. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/helpers/file_creators.py +0 -0
  518. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/helpers/frameworks.py +0 -0
  519. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/integrations/test_jfrog_integration.py +0 -0
  520. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/integrations/test_jfrog_redirect_security.py +0 -0
  521. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/integrations/test_license_checker.py +0 -0
  522. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/integrations/test_license_integration.py +0 -0
  523. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/integrations/test_sarif_formatter.py +0 -0
  524. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/integrations/test_sbom_license_integration.py +0 -0
  525. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/integrations/test_sbom_url_fixes.py +0 -0
  526. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/progress/__init__.py +0 -0
  527. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/progress/test_base.py +0 -0
  528. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/progress/test_hooks_egress.py +0 -0
  529. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_base_scanner.py +0 -0
  530. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_catboost_evidence_redaction.py +0 -0
  531. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_catboost_scanner.py +0 -0
  532. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_cntk_scanner.py +0 -0
  533. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_compressed_scanner.py +0 -0
  534. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_coreml_scanner.py +0 -0
  535. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_evidence_redaction.py +0 -0
  536. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_evidence_redaction_authorization_continuation.py +0 -0
  537. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_executorch_scanner.py +0 -0
  538. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_flax_msgpack_scanner.py +0 -0
  539. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_gguf_scanner.py +0 -0
  540. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_jax_checkpoint_scanner.py +0 -0
  541. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_jinja2_template_scanner.py +0 -0
  542. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_joblib_scanner.py +0 -0
  543. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_keras_h5_lambda_helpers.py +0 -0
  544. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_keras_h5_scanner.py +0 -0
  545. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_keras_utils.py +0 -0
  546. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_keras_zip_scanner.py +0 -0
  547. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_lightgbm_scanner.py +0 -0
  548. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_llamafile_scanner.py +0 -0
  549. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_manifest_scanner.py +0 -0
  550. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_metadata_scanner.py +0 -0
  551. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_mxnet_scanner.py +0 -0
  552. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_nemo_scanner.py +0 -0
  553. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_numpy_scanner.py +0 -0
  554. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_oci_layer_scanner.py +0 -0
  555. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_onnx_dependency_handling.py +0 -0
  556. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_openvino_scanner.py +0 -0
  557. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_paddle_scanner.py +0 -0
  558. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_pickle_scanner.py +0 -0
  559. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_picklescan_adapter.py +0 -0
  560. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_pmml_dependency_handling.py +0 -0
  561. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_pmml_scanner.py +0 -0
  562. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_pytorch_binary_scanner.py +0 -0
  563. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_pytorch_zip_scanner.py +0 -0
  564. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_r_serialized_scanner.py +0 -0
  565. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_rknn_scanner.py +0 -0
  566. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_rule_code_registry_consistency.py +0 -0
  567. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_rule_mapper.py +0 -0
  568. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_safetensors_scanner.py +0 -0
  569. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_scanner_registry.py +0 -0
  570. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_sevenzip_scanner.py +0 -0
  571. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_skops_content_analysis.py +0 -0
  572. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_skops_scanner.py +0 -0
  573. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_tensorrt_scanner.py +0 -0
  574. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_tf_metagraph_scanner.py +0 -0
  575. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_tf_savedmodel_scanner.py +0 -0
  576. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_tflite_scanner.py +0 -0
  577. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_torch7_scanner.py +0 -0
  578. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_torchserve_mar_scanner.py +0 -0
  579. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_weight_distribution_scanner.py +0 -0
  580. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_xgboost_scanner.py +0 -0
  581. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scanners/test_zip_scanner.py +0 -0
  582. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scripts/test_hf_whitelist_generators.py +0 -0
  583. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/scripts/test_large_pickle_corpus_qa.py +0 -0
  584. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_asset_list.py +0 -0
  585. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_basic.py +0 -0
  586. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_benchmark_report.py +0 -0
  587. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_bug1_confidence_exploit.py +0 -0
  588. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_cache_cli.py +0 -0
  589. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_cache_optimizations.py +0 -0
  590. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_checks_recording.py +0 -0
  591. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_cli.py +0 -0
  592. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_cli_cache_dir.py +0 -0
  593. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_cli_default_command.py +0 -0
  594. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_cli_file_filtering.py +0 -0
  595. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_cli_license_integration.py +0 -0
  596. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_cli_logging_handlers.py +0 -0
  597. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_cli_output.py +0 -0
  598. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_cloud_url_detection.py +0 -0
  599. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_committed_fixture_hygiene.py +0 -0
  600. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_core_asset_extraction.py +0 -0
  601. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_cve_2025_10155_bin_pickle.py +0 -0
  602. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_debug_command.py +0 -0
  603. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_directory_file_filtering.py +0 -0
  604. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_docker_workflow.py +0 -0
  605. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_double_interrupt.py +0 -0
  606. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_exit_codes.py +0 -0
  607. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_false_positive_fixes.py +0 -0
  608. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_file_hash.py +0 -0
  609. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_gguf_sbom_integration.py +0 -0
  610. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_graceful_degradation.py +0 -0
  611. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_header_discrepancy.py +0 -0
  612. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_huggingface_extensions.py +0 -0
  613. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_huggingface_fp_regression_harness.py +0 -0
  614. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_huggingface_inconclusive_coverage.py +0 -0
  615. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_huggingface_symlinks.py +0 -0
  616. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_importlib_detection.py +0 -0
  617. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_jax_flax_integration.py +0 -0
  618. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_jit_script_integration.py +0 -0
  619. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_lazy_loading.py +0 -0
  620. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_manifest_name_policy.py +0 -0
  621. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_metadata_extractor.py +0 -0
  622. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_models.py +0 -0
  623. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_nested_pickle_integration.py +0 -0
  624. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_nightly_asset_contracts.py +0 -0
  625. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_nightly_prerequisites.py +0 -0
  626. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_os_alias_detection.py +0 -0
  627. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_os_subprocess_detection.py +0 -0
  628. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_path_traversal.py +0 -0
  629. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_perf_workflow.py +0 -0
  630. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_pickle_context_filtering.py +0 -0
  631. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_progress.py +0 -0
  632. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_pydantic_models.py +0 -0
  633. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_python_version_warning.py +0 -0
  634. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_pytorch_zip_detection.py +0 -0
  635. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_regression_corpus.py +0 -0
  636. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_regular_scan_hash.py +0 -0
  637. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_rules.py +0 -0
  638. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_safetensors_optimization.py +0 -0
  639. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_scanner_selection.py +0 -0
  640. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_secure_hasher.py +0 -0
  641. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_security_enhancements.py +0 -0
  642. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_shebang_context.py +0 -0
  643. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_simple_jinja2.py +0 -0
  644. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_sklearn_joblib_false_positive.py +0 -0
  645. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_streaming_scan.py +0 -0
  646. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_telemetry.py +0 -0
  647. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_telemetry_decoupling.py +0 -0
  648. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_tensorflow_lambda_detection.py +0 -0
  649. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_timeout_configuration.py +0 -0
  650. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_utils.py +0 -0
  651. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_weak_hash_detection.py +0 -0
  652. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_webbrowser_detection.py +0 -0
  653. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_why_explanations.py +0 -0
  654. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/test_xdist_status.py +0 -0
  655. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/utils/__init__.py +0 -0
  656. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/utils/file/__init__.py +0 -0
  657. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/utils/file/test_advanced_file_handler.py +0 -0
  658. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/utils/file/test_advanced_size_limits.py +0 -0
  659. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/utils/file/test_file_filter.py +0 -0
  660. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/utils/file/test_filetype.py +0 -0
  661. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/utils/file/test_large_file_handler.py +0 -0
  662. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/utils/file/test_streaming_analysis.py +0 -0
  663. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/utils/file/test_streaming_preview.py +0 -0
  664. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/utils/helpers/test_asset_from_scan_result.py +0 -0
  665. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/utils/helpers/test_auto_defaults.py +0 -0
  666. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/utils/helpers/test_code_validation.py +0 -0
  667. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/utils/helpers/test_disk_space.py +0 -0
  668. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/utils/helpers/test_file_iterator.py +0 -0
  669. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/utils/helpers/test_ml_context_false_positives.py +0 -0
  670. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/utils/helpers/test_py_compile_improvements.py +0 -0
  671. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/utils/helpers/test_secure_hasher.py +0 -0
  672. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/utils/sources/test_cloud_storage.py +0 -0
  673. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/utils/sources/test_dvc_integration.py +0 -0
  674. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/utils/sources/test_pytorch_hub.py +0 -0
  675. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/utils/test_lfs.py +0 -0
  676. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/utils/test_result_conversion.py +0 -0
  677. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/whitelists/__init__.py +0 -0
  678. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/whitelists/test_combined.py +0 -0
  679. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/whitelists/test_huggingface_popular.py +0 -0
  680. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/whitelists/test_organizations.py +0 -0
  681. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/workflows/__init__.py +0 -0
  682. {modelaudit-0.2.49 → modelaudit-0.2.51}/tests/workflows/test_docker_workflow.py +0 -0
  683. {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='${{ steps.release.outputs.pr }}'
105
- if [ -n "$PR_OUTPUT" ] && [ "$PR_OUTPUT" != "null" ]; then
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=$(echo '${{ steps.release.outputs.pr }}' | jq -r '.headBranchName')" >> "$GITHUB_OUTPUT"
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: ${{ steps.check-pr.outputs.pr_branch }}
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
- if: steps.check-pr.outputs.has_pr == 'true'
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
- if git diff --quiet uv.lock; then
151
- echo "✓ packages/modelaudit-picklescan/uv.lock already in sync"
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: ${{ steps.check-pr.outputs.pr_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
- if git diff --quiet CHANGELOG.md packages/modelaudit-picklescan/CHANGELOG.md; then
179
- echo "✓ No formatting changes needed"
180
- else
181
- echo "→ Formatting changes detected, committing..."
182
- git config user.name "github-actions[bot]"
183
- git config user.email "github-actions[bot]@users.noreply.github.com"
184
- git add CHANGELOG.md packages/modelaudit-picklescan/CHANGELOG.md
185
- git commit -m "chore: format changelogs with prettier"
186
- git push
187
- echo "✓ Formatting committed and pushed"
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: Sync dependencies
212
- run: uv sync --extra all-ci
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@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
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@a2bbfa25375fe432b6a289bc6b6cd05ecd0c4c32 # v4
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@a2bbfa25375fe432b6a289bc6b6cd05ecd0c4c32 # v4
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@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
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
- uv python pin 3.12
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@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
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.12-${{ hashFiles('**/uv.lock', '**/pyproject.toml') }}
373
+ key: ${{ runner.os }}-uv-py3.10-${{ hashFiles('**/uv.lock', '**/pyproject.toml') }}
372
374
  restore-keys: |
373
- ${{ runner.os }}-uv-py3.12-
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@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
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@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
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@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
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+ (requires 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@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
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 + TensorFlow 2.13+
656
- # Python 3.11+: NumPy 2.x + TensorFlow 2.17+
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 -c "import numpy; print(f'NumPy version: {numpy.__version__}')"
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@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
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@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
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: |
@@ -0,0 +1,4 @@
1
+ {
2
+ ".": "0.2.51",
3
+ "packages/modelaudit-picklescan": "0.1.9"
4
+ }