pyvbaanalysis 2.3.0__tar.gz → 2.3.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (229) hide show
  1. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/.github/workflows/ci.yml +6 -6
  2. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/.github/workflows/publish.yml +34 -4
  3. pyvbaanalysis-2.3.1/.github/workflows/security.yml +141 -0
  4. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/CHANGELOG.md +30 -0
  5. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/PKG-INFO +15 -1
  6. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/README.md +14 -0
  7. pyvbaanalysis-2.3.1/SECURITY.md +39 -0
  8. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/docs/usage.md +3 -1
  9. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/__init__.py +1 -1
  10. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/cli.py +12 -2
  11. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/data/diagnostic_influence_audit.json +5 -1
  12. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/data/manifest.json +7 -7
  13. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/data/vbe_oracle_cases.json +353 -0
  14. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/declarations.py +8 -4
  15. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_cli.py +18 -0
  16. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_evidence.py +1 -1
  17. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_upstream_sync_10_14_0.py +17 -0
  18. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tools/generate_manifest.py +5 -2
  19. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tools/vendor_data.py +8 -7
  20. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/.gitattributes +0 -0
  21. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/.github/dependabot.yml +0 -0
  22. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/.gitignore +0 -0
  23. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/CONTRIBUTING.md +0 -0
  24. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/LICENSE +0 -0
  25. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/docs/api-reference.md +0 -0
  26. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/docs/diagnostics-catalogue.md +0 -0
  27. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyproject.toml +0 -0
  28. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/__main__.py +0 -0
  29. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/call/__init__.py +0 -0
  30. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/call/call_context.py +0 -0
  31. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/completion/__init__.py +0 -0
  32. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/completion/cursor_context.py +0 -0
  33. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/completion/event_handlers.py +0 -0
  34. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/completion/member_access.py +0 -0
  35. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/completion/type_completion.py +0 -0
  36. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/conditional/__init__.py +0 -0
  37. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/conditional/conditional_compilation.py +0 -0
  38. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/constants/__init__.py +0 -0
  39. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/constants/integer_constant_expression.py +0 -0
  40. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/data/access_host_model.json +0 -0
  41. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/data/event_definitions.json +0 -0
  42. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/data/excel_host_model.json +0 -0
  43. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/data/host_closed_types.json +0 -0
  44. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/data/msforms_members.json +0 -0
  45. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/data/powerpoint_host_model.json +0 -0
  46. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/data/rule_metadata.json +0 -0
  47. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/data/vb6_host_model.json +0 -0
  48. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/data/vba_runtime_tables.json +0 -0
  49. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/data/word_host_model.json +0 -0
  50. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/__init__.py +0 -0
  51. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/analyze_module.py +0 -0
  52. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/argument_inference.py +0 -0
  53. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/call_extraction.py +0 -0
  54. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/callable_signatures.py +0 -0
  55. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/const_expr.py +0 -0
  56. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/context.py +0 -0
  57. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/dataflow.py +0 -0
  58. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/exprwalk.py +0 -0
  59. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/inline_suppression.py +0 -0
  60. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/known_locals.py +0 -0
  61. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/model.py +0 -0
  62. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/module_analysis.py +0 -0
  63. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/registry.py +0 -0
  64. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rule_metadata.py +0 -0
  65. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/__init__.py +0 -0
  66. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/argument_shape.py +0 -0
  67. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/argument_types.py +0 -0
  68. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/arrays.py +0 -0
  69. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/assignments.py +0 -0
  70. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/binary_operand_scalar.py +0 -0
  71. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/call_arity.py +0 -0
  72. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/collection_state.py +0 -0
  73. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/control_flow.py +0 -0
  74. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/dead_code.py +0 -0
  75. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/declaration_forms.py +0 -0
  76. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/directive_forms.py +0 -0
  77. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/doc_comments.py +0 -0
  78. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/duplicates.py +0 -0
  79. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/expressions.py +0 -0
  80. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/file_statements.py +0 -0
  81. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/handler_flow.py +0 -0
  82. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/host_arguments.py +0 -0
  83. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/implements_members.py +0 -0
  84. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/late_binding.py +0 -0
  85. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/late_bound_members.py +0 -0
  86. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/lexical.py +0 -0
  87. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/line_continuations.py +0 -0
  88. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/missing_reference.py +0 -0
  89. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/module_kind.py +0 -0
  90. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/numeric_literals.py +0 -0
  91. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/object_state.py +0 -0
  92. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/overflow.py +0 -0
  93. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/parameter_defaults.py +0 -0
  94. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/runtime_values.py +0 -0
  95. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/shared.py +0 -0
  96. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/statement_forms.py +0 -0
  97. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/stray_tokens.py +0 -0
  98. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/type_of_is.py +0 -0
  99. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/undeclared.py +0 -0
  100. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/variant_values.py +0 -0
  101. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/walker.py +0 -0
  102. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/docs/__init__.py +0 -0
  103. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/docs/doc_comment.py +0 -0
  104. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/evidence.py +0 -0
  105. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/flow/__init__.py +0 -0
  106. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/flow/procedure_labels.py +0 -0
  107. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/flow/procedure_unstructured.py +0 -0
  108. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/host/__init__.py +0 -0
  109. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/host/host_libraries.py +0 -0
  110. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/host/host_model.py +0 -0
  111. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/host/host_registry.py +0 -0
  112. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/host/msforms.py +0 -0
  113. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/host/type_extensibility.py +0 -0
  114. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/identity_cache.py +0 -0
  115. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/js_compat.py +0 -0
  116. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/lexer/__init__.py +0 -0
  117. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/lexer/contextual_keywords.py +0 -0
  118. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/lexer/keyword_table.py +0 -0
  119. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/lexer/stripped_lines.py +0 -0
  120. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/lexer/token_helpers.py +0 -0
  121. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/lexer/token_kinds.py +0 -0
  122. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/lexer/tokenize.py +0 -0
  123. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/lexer/trivia.py +0 -0
  124. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/parser/__init__.py +0 -0
  125. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/parser/fixed_length_string.py +0 -0
  126. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/parser/nodes.py +0 -0
  127. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/parser/parse_expression.py +0 -0
  128. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/parser/parse_module.py +0 -0
  129. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/parser/parser_state.py +0 -0
  130. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/parser/type_declaration_suffix.py +0 -0
  131. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/project.py +0 -0
  132. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/py.typed +0 -0
  133. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/reader/__init__.py +0 -0
  134. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/reader/loose_file.py +0 -0
  135. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/reader/vbe_module.py +0 -0
  136. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/reader/workbook.py +0 -0
  137. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/references/__init__.py +0 -0
  138. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/references/reference_kinds.py +0 -0
  139. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/runtime/__init__.py +0 -0
  140. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/runtime/vba_runtime.py +0 -0
  141. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/symbols/__init__.py +0 -0
  142. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/symbols/build_module_symbols.py +0 -0
  143. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/symbols/name_resolution.py +0 -0
  144. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/symbols/project_index.py +0 -0
  145. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/symbols/symbol_model.py +0 -0
  146. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/symbols/user_form_controls.py +0 -0
  147. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/types/__init__.py +0 -0
  148. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/types/type_inference.py +0 -0
  149. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/types/type_names.py +0 -0
  150. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/conftest.py +0 -0
  151. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/oracle_support.py +0 -0
  152. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_analyzer_lexes_module_once.py +0 -0
  153. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_conditional_arms.py +0 -0
  154. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_conditional_compilation.py +0 -0
  155. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_dataflow.py +0 -0
  156. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_deep_nesting.py +0 -0
  157. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_diagnostics_engine.py +0 -0
  158. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_host_libraries.py +0 -0
  159. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_host_model.py +0 -0
  160. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_host_seam.py +0 -0
  161. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_inline_suppression.py +0 -0
  162. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_integer_constant_expression.py +0 -0
  163. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_language_matrix.py +0 -0
  164. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_lexer.py +0 -0
  165. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_member_access_chains.py +0 -0
  166. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_module_analysis.py +0 -0
  167. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_parser.py +0 -0
  168. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_project.py +0 -0
  169. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_project_index.py +0 -0
  170. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_public_api.py +0 -0
  171. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_reader.py +0 -0
  172. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_real_world_false_positives.py +0 -0
  173. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_reference_kinds.py +0 -0
  174. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_registry_parity.py +0 -0
  175. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rule_metadata.py +0 -0
  176. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_ambiguous_enum_member.py +0 -0
  177. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_argument_shape.py +0 -0
  178. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_argument_types.py +0 -0
  179. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_arrays.py +0 -0
  180. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_assignments.py +0 -0
  181. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_assignments_types.py +0 -0
  182. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_binary_operand_scalar.py +0 -0
  183. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_call_arity.py +0 -0
  184. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_control_flow.py +0 -0
  185. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_dead_code.py +0 -0
  186. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_declarations.py +0 -0
  187. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_division_by_zero.py +0 -0
  188. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_doc_comments.py +0 -0
  189. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_duplicates.py +0 -0
  190. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_event_handler_module_scope.py +0 -0
  191. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_expression_calls.py +0 -0
  192. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_expressions.py +0 -0
  193. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_invalid_as_type_names.py +0 -0
  194. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_is_operator_non_object.py +0 -0
  195. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_late_binding.py +0 -0
  196. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_lexical.py +0 -0
  197. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_member_not_found.py +0 -0
  198. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_missing_reference.py +0 -0
  199. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_module_kind.py +0 -0
  200. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_numeric_literals.py +0 -0
  201. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_object_state.py +0 -0
  202. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_parameter_defaults.py +0 -0
  203. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_property_setter_value_parameters.py +0 -0
  204. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_runtime_values.py +0 -0
  205. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_scalar_and_foreach.py +0 -0
  206. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_type_of_is.py +0 -0
  207. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_typeof_is_always_false.py +0 -0
  208. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_undeclared.py +0 -0
  209. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_runtime_tables.py +0 -0
  210. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_statement_token_derivation.py +0 -0
  211. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_stripped_lines.py +0 -0
  212. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_symbols.py +0 -0
  213. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_token_helpers.py +0 -0
  214. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_type_completion.py +0 -0
  215. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_type_names.py +0 -0
  216. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_upstream_sync_10_12_0.py +0 -0
  217. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_upstream_sync_10_13_0.py +0 -0
  218. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_upstream_sync_10_5_0.py +0 -0
  219. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_upstream_sync_10_6_0.py +0 -0
  220. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_upstream_sync_10_7_1.py +0 -0
  221. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_upstream_sync_6_1_2.py +0 -0
  222. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tools/extract_event_definitions.mjs +0 -0
  223. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tools/extract_host_model.mjs +0 -0
  224. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tools/extract_rule_metadata.mjs +0 -0
  225. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tools/extract_runtime_tables.mjs +0 -0
  226. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tools/generate_diagnostics_catalogue.py +0 -0
  227. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tools/oracle/build_combining_mark_probe.py +0 -0
  228. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tools/pin_analyzer.py +0 -0
  229. {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tools/xlide_source.mjs +0 -0
@@ -21,8 +21,8 @@ jobs:
21
21
  name: Lint and type check
22
22
  runs-on: ubuntu-latest
23
23
  steps:
24
- - uses: actions/checkout@v7
25
- - uses: actions/setup-python@v7
24
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
25
+ - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7
26
26
  with:
27
27
  python-version: "3.12"
28
28
  cache: pip
@@ -41,8 +41,8 @@ jobs:
41
41
  matrix:
42
42
  os: [ubuntu-latest, windows-latest]
43
43
  steps:
44
- - uses: actions/checkout@v7
45
- - uses: actions/setup-python@v7
44
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
45
+ - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7
46
46
  with:
47
47
  python-version: "3.12"
48
48
  cache: pip
@@ -62,8 +62,8 @@ jobs:
62
62
  matrix:
63
63
  python-version: ["3.10", "3.11", "3.12", "3.13"]
64
64
  steps:
65
- - uses: actions/checkout@v7
66
- - uses: actions/setup-python@v7
65
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
66
+ - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7
67
67
  with:
68
68
  python-version: ${{ matrix.python-version }}
69
69
  cache: pip
@@ -20,8 +20,18 @@ permissions:
20
20
  contents: read
21
21
 
22
22
  jobs:
23
+ # CodeQL, Semgrep and pip-audit (security.yml). Any finding fails this job,
24
+ # and publishing waits on it.
25
+ security:
26
+ name: Security analysis
27
+ uses: ./.github/workflows/security.yml
28
+ permissions:
29
+ contents: read
30
+ security-events: write
31
+
23
32
  publish:
24
33
  name: Build and publish to PyPI
34
+ needs: security
25
35
  runs-on: ubuntu-latest
26
36
  environment:
27
37
  name: pypi
@@ -29,8 +39,8 @@ jobs:
29
39
  permissions:
30
40
  id-token: write # OIDC token for PyPI Trusted Publishing
31
41
  steps:
32
- - uses: actions/checkout@v7
33
- - uses: actions/setup-python@v7
42
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
43
+ - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7
34
44
  with:
35
45
  python-version: "3.12"
36
46
  cache: pip
@@ -45,9 +55,29 @@ jobs:
45
55
  - name: Build sdist + wheel
46
56
  run: python -m build
47
57
  - name: Upload build artifacts
48
- uses: actions/upload-artifact@v7
58
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
49
59
  with:
50
60
  name: dist
51
61
  path: dist/*
52
62
  - name: Publish to PyPI
53
- uses: pypa/gh-action-pypi-publish@release/v1
63
+ uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # release/v1
64
+
65
+ attach-security-report:
66
+ name: Attach the security report to the release
67
+ needs: [security, publish]
68
+ runs-on: ubuntu-latest
69
+ permissions:
70
+ contents: write
71
+ steps:
72
+ - uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7
73
+ with:
74
+ name: security-report
75
+ path: report
76
+ - name: Upload to the release
77
+ env:
78
+ GH_TOKEN: ${{ github.token }}
79
+ TAG: ${{ github.event.release.tag_name }}
80
+ run: |
81
+ cd report
82
+ tar -czf security-sarif.tar.gz *.sarif *.json
83
+ gh release upload "$TAG" security-report.md security-sarif.tar.gz --clobber --repo "$GITHUB_REPOSITORY"
@@ -0,0 +1,141 @@
1
+ name: Security
2
+
3
+ # Static security analysis: CodeQL (Python and the workflows themselves),
4
+ # Semgrep, and pip-audit over the runtime dependency tree. Any finding fails
5
+ # the run. Results go to the repository's Security tab as SARIF and to a
6
+ # `security-report` artifact, which publish.yml attaches to every release.
7
+
8
+ on:
9
+ push:
10
+ branches: [main]
11
+ pull_request:
12
+ schedule:
13
+ - cron: "17 6 * * 1" # weekly, so new advisories surface between pushes
14
+ workflow_call:
15
+
16
+ permissions:
17
+ contents: read
18
+
19
+ jobs:
20
+ codeql:
21
+ name: CodeQL (${{ matrix.language }})
22
+ runs-on: ubuntu-latest
23
+ permissions:
24
+ contents: read
25
+ security-events: write
26
+ strategy:
27
+ fail-fast: false
28
+ matrix:
29
+ language: [python, actions]
30
+ steps:
31
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
32
+ - uses: github/codeql-action/init@1190a975f95ce23525efb6a3fc21ea29567c1b52 # v3
33
+ with:
34
+ languages: ${{ matrix.language }}
35
+ queries: security-extended
36
+ - uses: github/codeql-action/analyze@1190a975f95ce23525efb6a3fc21ea29567c1b52 # v3
37
+ with:
38
+ category: codeql-${{ matrix.language }}
39
+ output: sarif
40
+ - name: Fail on any finding
41
+ run: |
42
+ count=$(jq '[.runs[].results[]] | length' sarif/*.sarif)
43
+ echo "CodeQL ${{ matrix.language }}: $count finding(s)"
44
+ jq -r '.runs[].results[] | "\(.ruleId): \(.locations[0].physicalLocation.artifactLocation.uri):\(.locations[0].physicalLocation.region.startLine) \(.message.text)"' sarif/*.sarif
45
+ test "$count" -eq 0
46
+ - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
47
+ if: always()
48
+ with:
49
+ name: sarif-codeql-${{ matrix.language }}
50
+ path: sarif/*.sarif
51
+
52
+ semgrep:
53
+ name: Semgrep
54
+ runs-on: ubuntu-latest
55
+ permissions:
56
+ contents: read
57
+ security-events: write
58
+ steps:
59
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
60
+ - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7
61
+ with:
62
+ python-version: "3.12"
63
+ - run: python -m pip install "semgrep>=1,<2"
64
+ - name: Scan (fails on any finding)
65
+ run: >
66
+ semgrep scan --metrics off --error
67
+ --config p/python --config p/security-audit
68
+ --config p/secrets --config p/github-actions
69
+ --sarif-output semgrep.sarif --text
70
+ - uses: github/codeql-action/upload-sarif@1190a975f95ce23525efb6a3fc21ea29567c1b52 # v3
71
+ if: always() && hashFiles('semgrep.sarif') != ''
72
+ with:
73
+ sarif_file: semgrep.sarif
74
+ category: semgrep
75
+ - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
76
+ if: always()
77
+ with:
78
+ name: sarif-semgrep
79
+ path: semgrep.sarif
80
+
81
+ dependencies:
82
+ name: Dependency audit
83
+ runs-on: ubuntu-latest
84
+ steps:
85
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
86
+ - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7
87
+ with:
88
+ python-version: "3.12"
89
+ # The runtime tree without pyvbaanalysis itself, whose version is not on
90
+ # PyPI until the release that ships it; frozen before pip-audit is added.
91
+ - run: |
92
+ python -m pip install .
93
+ python -m pip freeze --exclude pyvbaanalysis > runtime.txt
94
+ cat runtime.txt
95
+ python -m pip install pip-audit
96
+ - name: Audit the runtime dependencies (fails on any known vulnerability)
97
+ run: pip-audit --strict --no-deps -r runtime.txt --format json --output pip-audit.json --progress-spinner off
98
+ - if: always()
99
+ run: pip-audit --strict --no-deps -r runtime.txt --progress-spinner off || true
100
+ - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
101
+ if: always()
102
+ with:
103
+ name: pip-audit
104
+ path: pip-audit.json
105
+
106
+ report:
107
+ name: Security report
108
+ needs: [codeql, semgrep, dependencies]
109
+ if: always()
110
+ runs-on: ubuntu-latest
111
+ steps:
112
+ - uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7
113
+ with:
114
+ path: results
115
+ merge-multiple: true
116
+ - name: Write the report
117
+ env:
118
+ CODEQL: ${{ needs.codeql.result }}
119
+ SEMGREP: ${{ needs.semgrep.result }}
120
+ DEPS: ${{ needs.dependencies.result }}
121
+ run: |
122
+ count() { if [ -f "$1" ]; then jq '[.runs[].results[]] | length' "$1"; else echo "not run"; fi; }
123
+ vulns=$(if [ -f results/pip-audit.json ]; then jq '[.dependencies[].vulns[]] | length' results/pip-audit.json; else echo "not run"; fi)
124
+ {
125
+ echo "# Security report"
126
+ echo
127
+ echo "Commit \`${GITHUB_SHA}\`, run ${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}"
128
+ echo
129
+ echo "| Check | Result | Findings |"
130
+ echo "| --- | --- | --- |"
131
+ echo "| CodeQL (Python, security-extended) | $CODEQL | $(count results/python.sarif) |"
132
+ echo "| CodeQL (GitHub Actions) | $CODEQL | $(count results/actions.sarif) |"
133
+ echo "| Semgrep (python, security-audit, secrets, github-actions) | $SEMGREP | $(count results/semgrep.sarif) |"
134
+ echo "| pip-audit (runtime dependencies) | $DEPS | $vulns |"
135
+ } > security-report.md
136
+ mkdir -p report && cp security-report.md report/ && cp results/*.sarif results/*.json report/ 2>/dev/null || true
137
+ cat security-report.md >> "$GITHUB_STEP_SUMMARY"
138
+ - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
139
+ with:
140
+ name: security-report
141
+ path: report/
@@ -5,6 +5,36 @@ All notable changes to pyVBAanalysis are recorded here. The format follows
5
5
  follow [Semantic Versioning](https://semver.org/spec/v2.0.0.html): a minor version
6
6
  per milestone.
7
7
 
8
+ ## 2.3.1 - 2026-09-28
9
+
10
+ Sync to XLIDE 10.14.1 (commit 67b844d), from 10.14.0, and a command-line flag
11
+ for projects that ship as one file.
12
+
13
+ ### Added
14
+
15
+ * `--whole-project` on the command line runs the whole-project checks
16
+ (`undeclared-variable`, `unknown-call`, `member-not-found`) on any input,
17
+ a single file included, such as a single-module distribution. It cannot be
18
+ combined with `--partial-project`, and the default is unchanged (#15).
19
+ * Security checks. CodeQL, Semgrep and pip-audit run on every push and pull
20
+ request and weekly, and any finding fails the run. A release reaches PyPI
21
+ only when all three pass, and it carries `security-report.md` and the raw
22
+ results as assets. `SECURITY.md` describes private vulnerability reporting.
23
+
24
+ ### Fixed
25
+
26
+ * `property-accessor-signature-mismatch` on a Property Set beside a Get of
27
+ another type, such as a Variant Get with an Object Set. Excel compiles it:
28
+ a Set's value is never compared with the Get. A Let must still match its Get
29
+ (XLIDE issue #152).
30
+
31
+ ### Verified
32
+
33
+ * The oracle corpus (2251 diagnostics in 1289 modules), 16 real workbooks, 195
34
+ Office files, 693 further projects and 7 VB6 projects give identical findings
35
+ from both analyzers at 10.14.1. The recorded replay of upstream's test suite
36
+ did not run for this release.
37
+
8
38
  ## 2.3.0 - 2026-09-26
9
39
 
10
40
  Sync to XLIDE 10.14.0 (commit 110c76e), from 10.7.1. Upstream measured the
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: pyvbaanalysis
3
- Version: 2.3.0
3
+ Version: 2.3.1
4
4
  Summary: Pure-Python static analysis for Excel VBA
5
5
  Project-URL: Homepage, https://github.com/WilliamSmithEdward/pyVBAanalysis
6
6
  Project-URL: Repository, https://github.com/WilliamSmithEdward/pyVBAanalysis
@@ -29,6 +29,12 @@ Description-Content-Type: text/markdown
29
29
 
30
30
  # pyVBAanalysis
31
31
 
32
+ [![CI](https://github.com/WilliamSmithEdward/pyVBAanalysis/actions/workflows/ci.yml/badge.svg)](https://github.com/WilliamSmithEdward/pyVBAanalysis/actions/workflows/ci.yml)
33
+ [![Security](https://github.com/WilliamSmithEdward/pyVBAanalysis/actions/workflows/security.yml/badge.svg)](https://github.com/WilliamSmithEdward/pyVBAanalysis/actions/workflows/security.yml)
34
+ [![PyPI](https://img.shields.io/pypi/v/pyvbaanalysis)](https://pypi.org/project/pyvbaanalysis/)
35
+ [![Python](https://img.shields.io/pypi/pyversions/pyvbaanalysis)](https://pypi.org/project/pyvbaanalysis/)
36
+ [![License: MIT](https://img.shields.io/badge/license-MIT-blue)](LICENSE)
37
+
32
38
  Static analysis for Office VBA. It reads your macros and reports likely bugs and the
33
39
  errors the VBA compiler would catch, without opening Office or running any code.
34
40
 
@@ -135,6 +141,14 @@ an agent that changes a macro runs them afterwards and treats an error
135
141
  as a failure rather than a suggestion, which is most of what stops a
136
142
  model shipping VBA that does not compile.
137
143
 
144
+ ## Security
145
+
146
+ Report a vulnerability privately through
147
+ [GitHub's advisory form](https://github.com/WilliamSmithEdward/pyVBAanalysis/security/advisories/new),
148
+ not a public issue. CodeQL, Semgrep and pip-audit run on every push and gate
149
+ every release, and each release carries its security report. See
150
+ [SECURITY.md](SECURITY.md).
151
+
138
152
  ## License
139
153
 
140
154
  MIT. See [LICENSE](LICENSE).
@@ -1,5 +1,11 @@
1
1
  # pyVBAanalysis
2
2
 
3
+ [![CI](https://github.com/WilliamSmithEdward/pyVBAanalysis/actions/workflows/ci.yml/badge.svg)](https://github.com/WilliamSmithEdward/pyVBAanalysis/actions/workflows/ci.yml)
4
+ [![Security](https://github.com/WilliamSmithEdward/pyVBAanalysis/actions/workflows/security.yml/badge.svg)](https://github.com/WilliamSmithEdward/pyVBAanalysis/actions/workflows/security.yml)
5
+ [![PyPI](https://img.shields.io/pypi/v/pyvbaanalysis)](https://pypi.org/project/pyvbaanalysis/)
6
+ [![Python](https://img.shields.io/pypi/pyversions/pyvbaanalysis)](https://pypi.org/project/pyvbaanalysis/)
7
+ [![License: MIT](https://img.shields.io/badge/license-MIT-blue)](LICENSE)
8
+
3
9
  Static analysis for Office VBA. It reads your macros and reports likely bugs and the
4
10
  errors the VBA compiler would catch, without opening Office or running any code.
5
11
 
@@ -106,6 +112,14 @@ an agent that changes a macro runs them afterwards and treats an error
106
112
  as a failure rather than a suggestion, which is most of what stops a
107
113
  model shipping VBA that does not compile.
108
114
 
115
+ ## Security
116
+
117
+ Report a vulnerability privately through
118
+ [GitHub's advisory form](https://github.com/WilliamSmithEdward/pyVBAanalysis/security/advisories/new),
119
+ not a public issue. CodeQL, Semgrep and pip-audit run on every push and gate
120
+ every release, and each release carries its security report. See
121
+ [SECURITY.md](SECURITY.md).
122
+
109
123
  ## License
110
124
 
111
125
  MIT. See [LICENSE](LICENSE).
@@ -0,0 +1,39 @@
1
+ # Security
2
+
3
+ ## Supported versions
4
+
5
+ Security fixes go into the latest release on PyPI. Upgrade to it before
6
+ reporting a problem.
7
+
8
+ ## Reporting a vulnerability
9
+
10
+ Report privately through GitHub:
11
+ [Security > Report a vulnerability](https://github.com/WilliamSmithEdward/pyVBAanalysis/security/advisories/new).
12
+ Please do not open a public issue for a vulnerability.
13
+
14
+ Include the version, what you ran, the input that triggers the problem (a
15
+ minimal module or file if you can share one), and what happened. You will get a
16
+ reply within a week.
17
+
18
+ ## What counts
19
+
20
+ pyVBAanalysis reads Office files and VBA source and never runs them. A file
21
+ that makes the reader or the analyzer crash, hang, use unbounded memory, write
22
+ outside where it was asked to, or run code is a vulnerability. A wrong or
23
+ missing diagnostic is an ordinary bug; open an issue for it.
24
+
25
+ ## How the code is checked
26
+
27
+ Every push, pull request and release runs [security.yml](.github/workflows/security.yml):
28
+
29
+ - CodeQL with the `security-extended` queries, over the Python package and the
30
+ GitHub Actions workflows.
31
+ - Semgrep with the `python`, `security-audit`, `secrets` and `github-actions`
32
+ rule sets.
33
+ - pip-audit over the runtime dependencies.
34
+
35
+ Any finding fails the run, and a release is not published to PyPI until all
36
+ three pass. Each release carries the resulting `security-report.md` and the raw
37
+ SARIF and pip-audit output as assets. Dependabot keeps the dependencies and the
38
+ workflow actions current, and the run repeats weekly so new advisories surface
39
+ between releases.
@@ -235,7 +235,8 @@ for a partial view:
235
235
  Pass `whole_project=True` if that single file really is the entire project.
236
236
  * `analyze_project` defaults to whole-project; pass `whole_project=False` for a fragment.
237
237
  * On the command line, a folder or several files is a whole project, a single targeted
238
- file is partial automatically, and `--partial-project` forces partial for any input.
238
+ file is partial automatically, `--partial-project` forces partial for any input, and
239
+ `--whole-project` runs the whole-project checks on any input, a single file included.
239
240
 
240
241
  Every other check is local or resolves positively (it reports only when it can prove
241
242
  the problem), so a partial view never turns it into a false positive.
@@ -311,6 +312,7 @@ Flags:
311
312
  | `--select CODE` | Report only these codes; repeatable. Codes match case-insensitively; an unknown code exits 2. |
312
313
  | `--ignore CODE` | Hide these codes from the report; repeatable. Codes match case-insensitively; an unknown code exits 2. |
313
314
  | `--partial-project` | Treat the input as a fragment of a larger project: skip the whole-project checks (`undeclared-variable`, `unknown-call`, `member-not-found`). A single targeted file is treated as partial automatically. |
315
+ | `--whole-project` | Treat the input as the complete project and run the whole-project checks, even on a single file such as a single-module distribution. Cannot be combined with `--partial-project`. |
314
316
  | `--no-inline-suppression` | Ignore `'@pyvba-ignore` directives in the source and report every diagnostic (an audit run). |
315
317
  | `--fail-level LEVEL` | Exit non-zero only when a diagnostic at or above `error`/`warning`/`information` is reported (default `information`, meaning any). |
316
318
  | `--format text\|json` | Output format (default `text`). |
@@ -41,7 +41,7 @@ from .reader import (
41
41
  )
42
42
  from .symbols import ModuleInput, ModuleSymbolKind, ProjectIndex, ProjectIndexOptions
43
43
 
44
- __version__ = "2.3.0"
44
+ __version__ = "2.3.1"
45
45
 
46
46
  __all__ = [
47
47
  "AnalyzeModuleOptions",
@@ -288,13 +288,20 @@ def _build_parser() -> argparse.ArgumentParser:
288
288
  metavar="CODE",
289
289
  help="hide these diagnostic codes from the report; repeatable",
290
290
  )
291
- parser.add_argument(
291
+ scope = parser.add_mutually_exclusive_group()
292
+ scope.add_argument(
292
293
  "--partial-project",
293
294
  action="store_true",
294
295
  help="treat the input as a fragment of a larger project: skip the whole-project "
295
296
  "checks (undeclared-variable, unknown-call, member-not-found) that need every "
296
297
  "module. A single targeted file is treated as partial automatically.",
297
298
  )
299
+ scope.add_argument(
300
+ "--whole-project",
301
+ action="store_true",
302
+ help="treat the input as the complete project and run the whole-project checks, "
303
+ "even on a single file, such as a single-module distribution.",
304
+ )
298
305
  parser.add_argument(
299
306
  "--no-inline-suppression",
300
307
  action="store_true",
@@ -357,7 +364,10 @@ def main(argv: Sequence[str] | None = None) -> int:
357
364
 
358
365
  # A single targeted file is a partial view of any real project, so the whole-project
359
366
  # rules are suppressed for it; a folder or several files are treated as the project.
360
- loose_whole_project = not (args.partial_project or len(loose_paths) <= 1)
367
+ # --whole-project and --partial-project override either way.
368
+ loose_whole_project = args.whole_project or not (
369
+ args.partial_project or len(loose_paths) <= 1
370
+ )
361
371
  inline_suppression = not args.no_inline_suppression
362
372
  loose_results, warnings, loose_errors = _analyze_loose_group(
363
373
  loose_paths, args.only, overrides, loose_whole_project, inline_suppression
@@ -1382,7 +1382,11 @@
1382
1382
  "status": "spec-derived",
1383
1383
  "sourceOfTruth": "MS-VBAL 5.3.1.4 paired Property Get/Let/Set procedure signature consistency",
1384
1384
  "corpusInfluence": "none",
1385
- "assertedOracleCases": [],
1385
+ "assertedOracleCases": [
1386
+ "issue152_g_compile",
1387
+ "issue152_h_compile",
1388
+ "issue152_o_compile"
1389
+ ],
1386
1390
  "observeOnlyOracleCases": [],
1387
1391
  "pendingLegacyCorpusFiles": [
1388
1392
  "excel_vba_analysis_final_hardening_cases.md",
@@ -1,22 +1,22 @@
1
1
  {
2
2
  "sourceRepo": "WilliamSmithEdward/xlide_vscode",
3
- "xlideVersion": "10.14.0",
4
- "xlideCommit": "110c76e91145b322be2e1970b7cbe54eda52468f",
3
+ "xlideVersion": "10.14.1",
4
+ "xlideCommit": "67b844d2a573a1f1f2cf9fcfdf820603d2837190",
5
5
  "files": {
6
6
  "vbe_oracle_cases.json": {
7
- "sha256": "325418258ac805a05181d5954d8e35195689e879ce641a5133872bf9496ae2fc",
8
- "bytes": 329910
7
+ "sha256": "b14f2ea3a70a93911033063c8447cd74ae563ef8e3a49a1ee85f3e837d7f5253",
8
+ "bytes": 344580
9
9
  },
10
10
  "diagnostic_influence_audit.json": {
11
- "sha256": "5e3c18e122edfa141baad321e0f6c79652d3eb8f99162b8e0e0f1fdc8d1c900a",
12
- "bytes": 165870
11
+ "sha256": "5d9b938edada6b23e31ac3c836f1afd1e1cc9ff6387e4b5ebeb79e7cb30279b3",
12
+ "bytes": 165966
13
13
  },
14
14
  "rule_metadata.json": {
15
15
  "sha256": "3413c1c92e72c31442d46785c7681b39e8470f3ab40e846f183daa43e50c6c16",
16
16
  "bytes": 64383
17
17
  }
18
18
  },
19
- "oracleCaseCount": 596,
19
+ "oracleCaseCount": 612,
20
20
  "diagnosticCodeCount": 168,
21
21
  "diagnosticCodes": [
22
22
  "ambiguous-enum-member",