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.
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/.github/workflows/ci.yml +6 -6
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/.github/workflows/publish.yml +34 -4
- pyvbaanalysis-2.3.1/.github/workflows/security.yml +141 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/CHANGELOG.md +30 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/PKG-INFO +15 -1
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/README.md +14 -0
- pyvbaanalysis-2.3.1/SECURITY.md +39 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/docs/usage.md +3 -1
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/__init__.py +1 -1
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/cli.py +12 -2
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/data/diagnostic_influence_audit.json +5 -1
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/data/manifest.json +7 -7
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/data/vbe_oracle_cases.json +353 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/declarations.py +8 -4
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_cli.py +18 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_evidence.py +1 -1
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_upstream_sync_10_14_0.py +17 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tools/generate_manifest.py +5 -2
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tools/vendor_data.py +8 -7
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/.gitattributes +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/.github/dependabot.yml +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/.gitignore +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/CONTRIBUTING.md +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/LICENSE +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/docs/api-reference.md +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/docs/diagnostics-catalogue.md +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyproject.toml +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/__main__.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/call/__init__.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/call/call_context.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/completion/__init__.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/completion/cursor_context.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/completion/event_handlers.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/completion/member_access.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/completion/type_completion.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/conditional/__init__.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/conditional/conditional_compilation.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/constants/__init__.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/constants/integer_constant_expression.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/data/access_host_model.json +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/data/event_definitions.json +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/data/excel_host_model.json +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/data/host_closed_types.json +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/data/msforms_members.json +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/data/powerpoint_host_model.json +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/data/rule_metadata.json +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/data/vb6_host_model.json +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/data/vba_runtime_tables.json +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/data/word_host_model.json +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/__init__.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/analyze_module.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/argument_inference.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/call_extraction.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/callable_signatures.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/const_expr.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/context.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/dataflow.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/exprwalk.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/inline_suppression.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/known_locals.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/model.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/module_analysis.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/registry.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rule_metadata.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/__init__.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/argument_shape.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/argument_types.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/arrays.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/assignments.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/binary_operand_scalar.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/call_arity.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/collection_state.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/control_flow.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/dead_code.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/declaration_forms.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/directive_forms.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/doc_comments.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/duplicates.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/expressions.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/file_statements.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/handler_flow.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/host_arguments.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/implements_members.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/late_binding.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/late_bound_members.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/lexical.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/line_continuations.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/missing_reference.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/module_kind.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/numeric_literals.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/object_state.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/overflow.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/parameter_defaults.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/runtime_values.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/shared.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/statement_forms.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/stray_tokens.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/type_of_is.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/undeclared.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/rules/variant_values.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/diagnostics/walker.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/docs/__init__.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/docs/doc_comment.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/evidence.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/flow/__init__.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/flow/procedure_labels.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/flow/procedure_unstructured.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/host/__init__.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/host/host_libraries.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/host/host_model.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/host/host_registry.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/host/msforms.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/host/type_extensibility.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/identity_cache.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/js_compat.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/lexer/__init__.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/lexer/contextual_keywords.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/lexer/keyword_table.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/lexer/stripped_lines.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/lexer/token_helpers.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/lexer/token_kinds.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/lexer/tokenize.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/lexer/trivia.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/parser/__init__.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/parser/fixed_length_string.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/parser/nodes.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/parser/parse_expression.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/parser/parse_module.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/parser/parser_state.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/parser/type_declaration_suffix.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/project.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/py.typed +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/reader/__init__.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/reader/loose_file.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/reader/vbe_module.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/reader/workbook.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/references/__init__.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/references/reference_kinds.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/runtime/__init__.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/runtime/vba_runtime.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/symbols/__init__.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/symbols/build_module_symbols.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/symbols/name_resolution.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/symbols/project_index.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/symbols/symbol_model.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/symbols/user_form_controls.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/types/__init__.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/types/type_inference.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/types/type_names.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/conftest.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/oracle_support.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_analyzer_lexes_module_once.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_conditional_arms.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_conditional_compilation.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_dataflow.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_deep_nesting.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_diagnostics_engine.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_host_libraries.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_host_model.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_host_seam.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_inline_suppression.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_integer_constant_expression.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_language_matrix.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_lexer.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_member_access_chains.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_module_analysis.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_parser.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_project.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_project_index.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_public_api.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_reader.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_real_world_false_positives.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_reference_kinds.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_registry_parity.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rule_metadata.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_ambiguous_enum_member.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_argument_shape.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_argument_types.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_arrays.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_assignments.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_assignments_types.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_binary_operand_scalar.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_call_arity.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_control_flow.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_dead_code.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_declarations.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_division_by_zero.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_doc_comments.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_duplicates.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_event_handler_module_scope.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_expression_calls.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_expressions.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_invalid_as_type_names.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_is_operator_non_object.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_late_binding.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_lexical.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_member_not_found.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_missing_reference.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_module_kind.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_numeric_literals.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_object_state.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_parameter_defaults.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_property_setter_value_parameters.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_runtime_values.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_scalar_and_foreach.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_type_of_is.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_typeof_is_always_false.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_rules_undeclared.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_runtime_tables.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_statement_token_derivation.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_stripped_lines.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_symbols.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_token_helpers.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_type_completion.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_type_names.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_upstream_sync_10_12_0.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_upstream_sync_10_13_0.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_upstream_sync_10_5_0.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_upstream_sync_10_6_0.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_upstream_sync_10_7_1.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tests/test_upstream_sync_6_1_2.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tools/extract_event_definitions.mjs +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tools/extract_host_model.mjs +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tools/extract_rule_metadata.mjs +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tools/extract_runtime_tables.mjs +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tools/generate_diagnostics_catalogue.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tools/oracle/build_combining_mark_probe.py +0 -0
- {pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/tools/pin_analyzer.py +0 -0
- {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.
|
|
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
|
+
[](https://github.com/WilliamSmithEdward/pyVBAanalysis/actions/workflows/ci.yml)
|
|
33
|
+
[](https://github.com/WilliamSmithEdward/pyVBAanalysis/actions/workflows/security.yml)
|
|
34
|
+
[](https://pypi.org/project/pyvbaanalysis/)
|
|
35
|
+
[](https://pypi.org/project/pyvbaanalysis/)
|
|
36
|
+
[](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
|
+
[](https://github.com/WilliamSmithEdward/pyVBAanalysis/actions/workflows/ci.yml)
|
|
4
|
+
[](https://github.com/WilliamSmithEdward/pyVBAanalysis/actions/workflows/security.yml)
|
|
5
|
+
[](https://pypi.org/project/pyvbaanalysis/)
|
|
6
|
+
[](https://pypi.org/project/pyvbaanalysis/)
|
|
7
|
+
[](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,
|
|
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`). |
|
|
@@ -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.
|
|
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
|
-
|
|
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
|
{pyvbaanalysis-2.3.0 → pyvbaanalysis-2.3.1}/pyvbaanalysis/data/diagnostic_influence_audit.json
RENAMED
|
@@ -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.
|
|
4
|
-
"xlideCommit": "
|
|
3
|
+
"xlideVersion": "10.14.1",
|
|
4
|
+
"xlideCommit": "67b844d2a573a1f1f2cf9fcfdf820603d2837190",
|
|
5
5
|
"files": {
|
|
6
6
|
"vbe_oracle_cases.json": {
|
|
7
|
-
"sha256": "
|
|
8
|
-
"bytes":
|
|
7
|
+
"sha256": "b14f2ea3a70a93911033063c8447cd74ae563ef8e3a49a1ee85f3e837d7f5253",
|
|
8
|
+
"bytes": 344580
|
|
9
9
|
},
|
|
10
10
|
"diagnostic_influence_audit.json": {
|
|
11
|
-
"sha256": "
|
|
12
|
-
"bytes":
|
|
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":
|
|
19
|
+
"oracleCaseCount": 612,
|
|
20
20
|
"diagnosticCodeCount": 168,
|
|
21
21
|
"diagnosticCodes": [
|
|
22
22
|
"ambiguous-enum-member",
|