blockwatch-cli 0.16.3__tar.gz → 0.16.5__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.
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/AGENTS.md +4 -8
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/CHANGELOG.md +32 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/CLAUDE.md +4 -8
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/Cargo.lock +1 -1
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/Cargo.toml +1 -1
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/PKG-INFO +1 -1
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/README.md +5 -5
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/docs/ci.md +2 -2
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/docs/cli.md +3 -3
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/docs/symbols.md +279 -18
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/setup.py +1 -1
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/blocks.rs +4 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/c.rs +29 -41
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/c_sharp.rs +49 -120
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/go.rs +16 -18
- blockwatch_cli-0.16.5/src/language_parsers/hcl.rs +908 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/java.rs +66 -61
- blockwatch_cli-0.16.5/src/language_parsers/json.rs +453 -0
- blockwatch_cli-0.16.5/src/language_parsers/kotlin.rs +780 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/mod.rs +18 -0
- blockwatch_cli-0.16.5/src/language_parsers/proto.rs +397 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/rust.rs +16 -7
- blockwatch_cli-0.16.5/src/language_parsers/swift.rs +1165 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/toml.rs +4 -20
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/typescript.rs +7 -12
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/yaml.rs +9 -22
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/skill.md +63 -3
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/symbols/code.rs +204 -18
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/symbols/mod.rs +85 -548
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/symbol_references.rs +63 -0
- blockwatch_cli-0.16.5/tests/testdata/symbol_references/hcl_source.rs +3 -0
- blockwatch_cli-0.16.5/tests/testdata/symbol_references/hcl_target.hcl +8 -0
- blockwatch_cli-0.16.5/tests/testdata/symbol_references/kt_source.rs +3 -0
- blockwatch_cli-0.16.5/tests/testdata/symbol_references/kt_target.kt +5 -0
- blockwatch_cli-0.16.5/tests/testdata/symbol_references/kts_source.rs +3 -0
- blockwatch_cli-0.16.5/tests/testdata/symbol_references/kts_target.kts +5 -0
- blockwatch_cli-0.16.5/tests/testdata/symbol_references/nomad_source.rs +3 -0
- blockwatch_cli-0.16.5/tests/testdata/symbol_references/nomad_target.nomad +5 -0
- blockwatch_cli-0.16.5/tests/testdata/symbol_references/proto_source.rs +3 -0
- blockwatch_cli-0.16.5/tests/testdata/symbol_references/proto_target.proto +8 -0
- blockwatch_cli-0.16.5/tests/testdata/symbol_references/swift_source.rs +3 -0
- blockwatch_cli-0.16.5/tests/testdata/symbol_references/swift_target.swift +5 -0
- blockwatch_cli-0.16.5/tests/testdata/symbol_references/tf_source.rs +3 -0
- blockwatch_cli-0.16.5/tests/testdata/symbol_references/tf_target.tf +8 -0
- blockwatch_cli-0.16.5/tests/testdata/symbol_references/tfvars_source.rs +3 -0
- blockwatch_cli-0.16.5/tests/testdata/symbol_references/tfvars_target.tfvars +1 -0
- blockwatch_cli-0.16.5/tests/testdata/symbol_references/tofu_source.rs +3 -0
- blockwatch_cli-0.16.5/tests/testdata/symbol_references/tofu_target.tofu +4 -0
- blockwatch_cli-0.16.3/src/language_parsers/hcl.rs +0 -69
- blockwatch_cli-0.16.3/src/language_parsers/json.rs +0 -239
- blockwatch_cli-0.16.3/src/language_parsers/json.scm +0 -4
- blockwatch_cli-0.16.3/src/language_parsers/kotlin.rs +0 -86
- blockwatch_cli-0.16.3/src/language_parsers/proto.rs +0 -71
- blockwatch_cli-0.16.3/src/language_parsers/swift.rs +0 -91
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/.agents/.claude-plugin/plugin.json +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/.agents/skills/blockwatch/SKILL.md +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/.claude-plugin/marketplace.json +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/.github/dependabot.yml +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/.github/workflows/blockwatch.yml +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/.github/workflows/codeql.yml +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/.github/workflows/markdownlint.yml +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/.github/workflows/pypi.yml +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/.github/workflows/release.yml +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/.github/workflows/rust.yml +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/.github/workflows/trusted-checks.yml +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/.gitignore +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/.markdownlint-cli2.yaml +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/.pre-commit-config.yaml +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/.pre-commit-hooks.yaml +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/LICENSE +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/SECURITY.md +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/blockwatch.toml +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/clippy.toml +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/codecov.yml +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/demo.gif +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/dist-workspace.toml +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/docs/agents.md +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/docs/validators/README.md +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/docs/validators/affects.md +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/docs/validators/check-ai.md +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/docs/validators/check-lua.md +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/docs/validators/keep-sorted.md +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/docs/validators/keep-unique.md +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/docs/validators/line-count.md +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/docs/validators/line-pattern.md +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/docs/validators/same-as.md +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/pypi/pyproject.toml +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/pyproject.toml +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/release.toml +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/scripts/check_language_count.lua +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/scripts/check_latest_gpt_nano_model.lua +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/block_parser.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/cli.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/config.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/diff_parser.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/explain.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/flags.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/fs.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/bash.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/cmake.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/cpp.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/css.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/dart.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/dockerfile.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/elixir.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/graphql.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/groovy.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/html.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/javascript.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/lean.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/lua.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/makefile.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/markdown.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/mdx.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/nix.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/ocaml.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/php.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/python.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/ruby.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/scala.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/sql.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/starlark.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/tsx.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/xml.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/lib.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/main.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/path_arguments.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/paths_glob.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/repo_path.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/report.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/sarif.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/scan.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/settings.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/symbol_path.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/tag_parser.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/target_reference.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/validators/affects.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/validators/check_ai.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/validators/check_lua.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/validators/keep_sorted.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/validators/keep_unique.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/validators/line_count.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/validators/line_pattern.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/validators/mod.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/validators/same_as.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/violation_address.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/virtual_blocks.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/affects.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/check_ai.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/check_lua.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/common/empty.toml +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/common/mod.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/config.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/encoding.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/explain.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/general.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/keep_sorted.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/keep_unique.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/line_count.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/line_pattern.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/list.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/path_arguments.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/repository_root.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/same_as.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/sarif.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/skill.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/suppressions.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/affects/cross_file_source.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/affects/cross_file_target.md +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/affects/custom_ext_source.javascript +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/affects/custom_ext_target.javascript +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/affects/dangling.md +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/affects/missing_symbol.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/affects/more_added_than_deleted.py +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/affects/multiline_tag_source.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/affects/multiline_tag_target.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/affects/nested_mapping_source.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/affects/nested_mapping_target.yaml +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/affects/sibling.md +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/affects/symbol_source.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/affects/symbol_target.json +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/affects/table_source.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/affects/table_target.toml +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/affects/tag_and_content_source.ts +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/affects/tag_and_content_target.ts +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/affects/whole_file_source.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/affects/whole_file_target.json +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/check_ai/two_blocks.py +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/check_lua/affects.lua +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/check_lua/affects.py +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/check_lua/affects_drift.py +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/check_lua/blocking_io.lua +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/check_lua/blocking_io.py +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/check_lua/echo.lua +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/check_lua/fail.lua +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/check_lua/mode.py +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/check_lua/os.lua +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/check_lua/pathfmt/report_path.lua +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/check_lua/pathfmt/source.py +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/check_lua/pattern.py +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/check_lua/pattern_many_matches.py +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/check_lua/pattern_no_match.py +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/check_lua/success.lua +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/check_lua/success_and_failure.py +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/config/glob_target/config.toml +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/config/glob_target/package.json +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/config/glob_target/plugins/blue/package.json +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/config/glob_target/plugins/green/package.json +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/config/glob_target/plugins/red/package.json +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/explain/a.py +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/explain/check.lua +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/general/block_selection.py +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/general/custom_file_extension.javascript +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/general/custom_file_extension.python +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/general/disable_enable.py +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/general/paths/invalid.py +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/general/paths/subdir/nested_invalid.py +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/general/paths/valid.py +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/general/severity.py +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/hidden/.github/workflows/ci.yml +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/keep_sorted/orderings.py +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/keep_unique/basic_and_pattern.py +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/line_count/equality_and_greater_than.py +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/line_pattern/forbidden_text.py +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/line_pattern/hex_and_word_patterns.py +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/list/.hg/.gitkeep +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/list/a.py +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/list/b.py +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/positions/unicode_columns.py +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/same_as/custom_ext_source.javascript +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/same_as/custom_ext_target.javascript +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/same_as/package.json +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/same_as/paths/alpha/item.txt +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/same_as/paths/beta/item.txt +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/same_as/paths_and_block_source.md +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/same_as/paths_source.md +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/same_as/sibling.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/same_as/source.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/same_as/split_table_source.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/same_as/split_table_target.toml +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/same_as/symbol_mismatch_source.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/same_as/symbol_source.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/same_as/target.md +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/same_as/whole_file_mismatch_source.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/same_as/whole_file_source.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/same_as/whole_file_target.json +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/sarif/advisory.py +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/sarif/clean.py +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/sarif/sorted.py +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/sarif/unnamed.py +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/suppressions/commit_msg.txt +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/suppressions/commit_msg_gone_a.txt +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/suppressions/commit_msg_gone_b.txt +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/suppressions/commit_msg_lowercase_trailer.txt +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/suppressions/commit_msg_malformed.txt +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/suppressions/commit_msg_with_noise.txt +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/suppressions/dangling.py +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/suppressions/sorted.py +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/suppressions/symbol.py +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/suppressions/symbol_target.json +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/suppressions/two_rules.py +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/suppressions/unnamed.py +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/bzl_source.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/bzl_target.bzl +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/c_source.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/c_target.c +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/cpp_source.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/cpp_target.cpp +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/cs_source.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/cs_target.cs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/escapes_source.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/escapes_target.json +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/filter_source.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/filter_target.yaml +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/go_source.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/go_target.go +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/h_source.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/h_target.h +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/java_source.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/java_target.java +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/js_source.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/js_target.js +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/json_source.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/json_target.json +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/jsonc_source.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/jsonc_target.jsonc +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/markdown_source.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/markdown_target.markdown +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/md_source.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/md_target.md +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/mdx_source.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/mdx_target.mdx +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/mixed_list_source.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/mixed_list_target.json +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/py_source.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/py_target.py +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/rs_source.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/rs_target.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/toml_source.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/toml_target.toml +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/ts_source.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/ts_target.ts +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/tsx_source.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/tsx_target.tsx +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/yaml_source.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/yaml_target.yaml +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/yml_source.rs +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/yml_target.yml +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/verbosity/affects/pair.py +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/verbosity/clean/counted.py +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/verbosity/clean/noop.py +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/verbosity/clean/notes.txt +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/verbosity/clean/sorted.py +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/verbosity/diff/two_blocks.py +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/verbosity/failing/unsorted.py +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/verbosity/mixed/both_kinds.py +0 -0
- {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/verbosity.rs +0 -0
|
@@ -235,22 +235,18 @@ The main modules:
|
|
|
235
235
|
Some languages also have symbols. Such a language has a `SymbolsParser`, which its `parser()` passes to
|
|
236
236
|
`.with_symbols(...)`:
|
|
237
237
|
|
|
238
|
-
- JSON
|
|
238
|
+
- JSON and YAML walk their syntax trees themselves, and refuse a file with a syntax error.
|
|
239
239
|
- TOML finds its symbols with `toml_edit`. What a TOML key means depends on the order of the headers, not on how the
|
|
240
240
|
syntax tree is nested.
|
|
241
|
-
- YAML walks its syntax tree itself. An alias has a position in a sequence but can't be addressed, and a query can't
|
|
242
|
-
express that.
|
|
243
241
|
- Markdown finds its sections with the `markdown` crate, the same parser that finds its comments.
|
|
244
242
|
|
|
245
243
|
Each language's tests list every symbol it finds. When you give a language symbols, also document its paths in
|
|
246
244
|
`docs/symbols.md` and in the "Symbols" section of the skill, `src/skill.md`. A test in `language_parsers/mod.rs` and the
|
|
247
245
|
repository's own blocks keep the list of file types with symbols, and each language's section, in sync with the
|
|
248
246
|
code.
|
|
249
|
-
- `src/symbols.rs` — `Symbol`, the `SymbolsParser` trait, and `resolve`, which finds the symbol a path refers to.
|
|
250
|
-
`
|
|
251
|
-
|
|
252
|
-
a file with a syntax error, instead of resolving a path through tree-sitter's error recovery. It doesn't check the
|
|
253
|
-
query itself.
|
|
247
|
+
- `src/symbols/mod.rs` — `Symbol`, the `SymbolsParser` trait, and `resolve`, which finds the symbol a path refers to.
|
|
248
|
+
`ensure_no_syntax_error` refuses a file with a syntax error, instead of resolving a path through tree-sitter's error
|
|
249
|
+
recovery.
|
|
254
250
|
- `src/validators/` — one file for each validator (`affects`, `check_ai`, `check_lua`, `keep_sorted`, `keep_unique`,
|
|
255
251
|
`line_count`, `line_pattern`, `same_as`). Each file exports a `detect` function. `Validator::detect` in
|
|
256
252
|
`validators/mod.rs` calls them from one `match`.
|
|
@@ -12,6 +12,38 @@ Releases up to and including v0.3.11 predate this file. Their notes live on the
|
|
|
12
12
|
|
|
13
13
|
## [Unreleased] - ReleaseDate
|
|
14
14
|
|
|
15
|
+
## [0.16.5] - 2026-11-03
|
|
16
|
+
|
|
17
|
+
### Added
|
|
18
|
+
|
|
19
|
+
- Symbols in Protocol Buffers files (`.proto`). `item.proto#/Item/Color/RED` points at the number of an enum value,
|
|
20
|
+
and `#/Item/name` at the number of a field. Each message, enum and service is a symbol, and so is each field, oneof,
|
|
21
|
+
enum value and rpc in it. The package is not part of a path, and options are not symbols. See
|
|
22
|
+
[Protocol Buffers](docs/symbols.md#protocol-buffers).
|
|
23
|
+
- Symbols in HCL files: Terraform and OpenTofu (`.tf`, `.tofu`, `.tfvars`), Nomad (`.nomad`), and `.hcl` files such
|
|
24
|
+
as Terragrunt's. See [HCL](docs/symbols.md#hcl).
|
|
25
|
+
- blockwatch now checks the tags in Nomad job files (`.nomad`). Before, it skipped them.
|
|
26
|
+
|
|
27
|
+
## [0.16.4] - 2026-11-03
|
|
28
|
+
|
|
29
|
+
### Added
|
|
30
|
+
|
|
31
|
+
- Symbols in Kotlin files (`.kt` and `.kts`). `Config.kt#/Config/MAX_RETRIES` points at a property of the class
|
|
32
|
+
`Config`, and `#/MAX_RETRIES` at one at the top of the file. Each type is a symbol, and so is each property,
|
|
33
|
+
constructor property, function, enum entry and nested type in it. A companion object's members sit under the class.
|
|
34
|
+
See [Kotlin](docs/symbols.md#kotlin).
|
|
35
|
+
- Symbols in Swift files. `Config.swift#/Config/maxRetries` points at a property of the type `Config`, and
|
|
36
|
+
`#/maxRetries` at one at the top of the file. Each type is a symbol, and so is each property, function, enum case and
|
|
37
|
+
nested type in it. An extension's members sit under the type it extends, and an enum case's value is its raw value.
|
|
38
|
+
See [Swift](docs/symbols.md#swift).
|
|
39
|
+
|
|
40
|
+
### Fixed
|
|
41
|
+
|
|
42
|
+
- A Java text block with `\u` and a sign, such as `\u+041`, counted as the character, here `A`. Java rejects this
|
|
43
|
+
escape, so a path to the text block now stops the run.
|
|
44
|
+
- A Java string in `"` quotes with a line break in it counted as text. Java rejects it, so a path to it now stops the
|
|
45
|
+
run. Before, a string missing its closing quote took in the next line as its value.
|
|
46
|
+
|
|
15
47
|
## [0.16.3] - 2026-11-02
|
|
16
48
|
|
|
17
49
|
## [0.16.2] - 2026-10-30
|
|
@@ -235,22 +235,18 @@ The main modules:
|
|
|
235
235
|
Some languages also have symbols. Such a language has a `SymbolsParser`, which its `parser()` passes to
|
|
236
236
|
`.with_symbols(...)`:
|
|
237
237
|
|
|
238
|
-
- JSON
|
|
238
|
+
- JSON and YAML walk their syntax trees themselves, and refuse a file with a syntax error.
|
|
239
239
|
- TOML finds its symbols with `toml_edit`. What a TOML key means depends on the order of the headers, not on how the
|
|
240
240
|
syntax tree is nested.
|
|
241
|
-
- YAML walks its syntax tree itself. An alias has a position in a sequence but can't be addressed, and a query can't
|
|
242
|
-
express that.
|
|
243
241
|
- Markdown finds its sections with the `markdown` crate, the same parser that finds its comments.
|
|
244
242
|
|
|
245
243
|
Each language's tests list every symbol it finds. When you give a language symbols, also document its paths in
|
|
246
244
|
`docs/symbols.md` and in the "Symbols" section of the skill, `src/skill.md`. A test in `language_parsers/mod.rs` and the
|
|
247
245
|
repository's own blocks keep the list of file types with symbols, and each language's section, in sync with the
|
|
248
246
|
code.
|
|
249
|
-
- `src/symbols.rs` — `Symbol`, the `SymbolsParser` trait, and `resolve`, which finds the symbol a path refers to.
|
|
250
|
-
`
|
|
251
|
-
|
|
252
|
-
a file with a syntax error, instead of resolving a path through tree-sitter's error recovery. It doesn't check the
|
|
253
|
-
query itself.
|
|
247
|
+
- `src/symbols/mod.rs` — `Symbol`, the `SymbolsParser` trait, and `resolve`, which finds the symbol a path refers to.
|
|
248
|
+
`ensure_no_syntax_error` refuses a file with a syntax error, instead of resolving a path through tree-sitter's error
|
|
249
|
+
recovery.
|
|
254
250
|
- `src/validators/` — one file for each validator (`affects`, `check_ai`, `check_lua`, `keep_sorted`, `keep_unique`,
|
|
255
251
|
`line_count`, `line_pattern`, `same_as`). Each file exports a `detect` function. `Validator::detect` in
|
|
256
252
|
`validators/mod.rs` calls them from one `match`.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: blockwatch-cli
|
|
3
|
-
Version: 0.16.
|
|
3
|
+
Version: 0.16.5
|
|
4
4
|
Summary: Language agnostic linter that keeps your code and documentation in sync and valid
|
|
5
5
|
Keywords: linter,sync,drift,comments,agents
|
|
6
6
|
Home-Page: https://github.com/mennanov/blockwatch
|
|
@@ -89,9 +89,9 @@ Two validators work across files:
|
|
|
89
89
|
- `same-as` fails when a block and its target hold different values. It needs no diff.
|
|
90
90
|
|
|
91
91
|
Both can point to a block, a whole file, a specific value in a file like `package.json#/version`, a section of a
|
|
92
|
-
Markdown file,
|
|
93
|
-
|
|
94
|
-
nitpick in code review.
|
|
92
|
+
Markdown file, a constant in a Go, C, C++, Python, Rust, TypeScript, JavaScript, Java, C#, Kotlin or Swift file, a
|
|
93
|
+
field in a Protocol Buffers file, or a value in a Terraform or other HCL file (see [Symbols](docs/symbols.md)). The
|
|
94
|
+
other validators check a single block on their own: the things you'd otherwise have to nitpick in code review.
|
|
95
95
|
|
|
96
96
|
<!-- <block name="available-validators"
|
|
97
97
|
same-as="src/validators/mod.rs:validator-registry, docs/validators/README.md:validators-index"
|
|
@@ -219,7 +219,7 @@ exclusions, and custom extension mappings.
|
|
|
219
219
|
|
|
220
220
|
```yaml
|
|
221
221
|
- repo: https://github.com/mennanov/blockwatch
|
|
222
|
-
rev: v0.16.
|
|
222
|
+
rev: v0.16.5 # Use latest release
|
|
223
223
|
hooks:
|
|
224
224
|
- id: blockwatch
|
|
225
225
|
```
|
|
@@ -258,7 +258,7 @@ For plain git hooks, local pre-commit setups, and sandboxing untrusted Lua scrip
|
|
|
258
258
|
- Go (with `go.mod`, `go.sum` and `go.work` support)
|
|
259
259
|
- GraphQL (`.graphql`, `.graphqls`, `.gql`)
|
|
260
260
|
- Groovy (with `.gradle` and `Jenkinsfile` support)
|
|
261
|
-
- HCL (Terraform and OpenTofu: `.tf`, `.tfvars`, `.tofu`, `.hcl`)
|
|
261
|
+
- HCL (Terraform and OpenTofu: `.tf`, `.tfvars`, `.tofu`, `.hcl`; Nomad: `.nomad`)
|
|
262
262
|
- HTML (with `.xhtml` support)
|
|
263
263
|
- JSON (`.json`, `.jsonc`, `.webmanifest`)
|
|
264
264
|
- Java
|
|
@@ -19,7 +19,7 @@ To use [pre-commit](https://pre-commit.com), add the hook to `.pre-commit-config
|
|
|
19
19
|
|
|
20
20
|
```yaml
|
|
21
21
|
- repo: https://github.com/mennanov/blockwatch
|
|
22
|
-
rev: v0.16.
|
|
22
|
+
rev: v0.16.5 # Use latest release
|
|
23
23
|
hooks:
|
|
24
24
|
- id: blockwatch
|
|
25
25
|
```
|
|
@@ -59,7 +59,7 @@ The `blockwatch` hook runs before the commit message exists, so it cannot see a
|
|
|
59
59
|
|
|
60
60
|
```yaml
|
|
61
61
|
- repo: https://github.com/mennanov/blockwatch
|
|
62
|
-
rev: v0.16.
|
|
62
|
+
rev: v0.16.5 # Use latest release
|
|
63
63
|
hooks:
|
|
64
64
|
- id: blockwatch-commit-msg
|
|
65
65
|
```
|
|
@@ -557,15 +557,15 @@ Nothing else about the run changes: the same violations are found, and the exit
|
|
|
557
557
|
"tool": {
|
|
558
558
|
"driver": {
|
|
559
559
|
"name": "blockwatch",
|
|
560
|
-
"version": "0.16.
|
|
561
|
-
"semanticVersion": "0.16.
|
|
560
|
+
"version": "0.16.5",
|
|
561
|
+
"semanticVersion": "0.16.5",
|
|
562
562
|
"informationUri": "https://github.com/mennanov/blockwatch",
|
|
563
563
|
"rules": [
|
|
564
564
|
{
|
|
565
565
|
"id": "keep-sorted",
|
|
566
566
|
"name": "keep-sorted",
|
|
567
567
|
"shortDescription": { "text": "Requires the lines of a block to stay in order." },
|
|
568
|
-
"helpUri": "https://github.com/mennanov/blockwatch/blob/v0.16.
|
|
568
|
+
"helpUri": "https://github.com/mennanov/blockwatch/blob/v0.16.5/docs/validators/keep-sorted.md"
|
|
569
569
|
}
|
|
570
570
|
]
|
|
571
571
|
}
|
|
@@ -24,21 +24,25 @@ declares, instead of tags in a comment.
|
|
|
24
24
|
<!-- <block name="extensions-with-symbols" same-as="src/language_parsers/mod.rs:extensions-with-symbols"
|
|
25
25
|
same-as-pattern="`\.?(?P<value>[A-Za-z.]+)`"> -->
|
|
26
26
|
|
|
27
|
-
| Language
|
|
28
|
-
|
|
29
|
-
| JSON
|
|
30
|
-
| TOML
|
|
31
|
-
| YAML
|
|
32
|
-
| Markdown
|
|
33
|
-
| Go
|
|
34
|
-
| C, C++
|
|
35
|
-
| Python
|
|
36
|
-
| Starlark
|
|
37
|
-
| Rust
|
|
38
|
-
| TypeScript
|
|
39
|
-
| JavaScript
|
|
40
|
-
| Java
|
|
41
|
-
| C#
|
|
27
|
+
| Language | Files | Paths |
|
|
28
|
+
|------------------|--------------------------------------------------------------------------------|---------------------------------------------------------|
|
|
29
|
+
| JSON | `.json`, `.jsonc`, `.webmanifest` | [JSON](#json) |
|
|
30
|
+
| TOML | `.toml`, `Pipfile` | [TOML](#toml) |
|
|
31
|
+
| YAML | `.yaml`, `.yml`, `.cff` | [YAML](#yaml) |
|
|
32
|
+
| Markdown | `.md`, `.markdown`, `.mdx` | [Markdown](#markdown) |
|
|
33
|
+
| Go | `.go` | [Go](#go) |
|
|
34
|
+
| C, C++ | `.c`, `.h`, `.cc`, `.cpp`, `.cxx`, `.hh`, `.hpp`, `.hxx` | [C and C++](#c-and-c) |
|
|
35
|
+
| Python | `.py`, `.pyi`, `.pyw` | [Python and Starlark](#python-and-starlark) |
|
|
36
|
+
| Starlark | `.bzl`, `.bazel`, `.bzlmod`, `.star`, `BUILD`, `BUCK`, `WORKSPACE`, `Tiltfile` | [Python and Starlark](#python-and-starlark) |
|
|
37
|
+
| Rust | `.rs` | [Rust](#rust) |
|
|
38
|
+
| TypeScript | `.ts`, `.mts`, `.cts`, `.d.ts`, `.tsx` | [TypeScript and JavaScript](#typescript-and-javascript) |
|
|
39
|
+
| JavaScript | `.js`, `.mjs`, `.cjs`, `.jsx` | [TypeScript and JavaScript](#typescript-and-javascript) |
|
|
40
|
+
| Java | `.java` | [Java](#java) |
|
|
41
|
+
| C# | `.cs` | [C#](#c) |
|
|
42
|
+
| Kotlin | `.kt`, `.kts` | [Kotlin](#kotlin) |
|
|
43
|
+
| Swift | `.swift` | [Swift](#swift) |
|
|
44
|
+
| Protocol Buffers | `.proto` | [Protocol Buffers](#protocol-buffers) |
|
|
45
|
+
| HCL (Terraform) | `.tf`, `.tofu`, `.tfvars`, `.hcl`, `.nomad` | [HCL](#hcl) |
|
|
42
46
|
|
|
43
47
|
<!-- </block> -->
|
|
44
48
|
|
|
@@ -249,8 +253,9 @@ Clone the repository.
|
|
|
249
253
|
|
|
250
254
|
In a code file, each top-level name is a symbol: a constant, a variable, a type, a function or a macro. Its path is
|
|
251
255
|
`#/NAME`.
|
|
252
|
-
With `const MaxPorts = 8` in `consts.go`, `consts.go#/MaxPorts` points at `8`. In Java
|
|
253
|
-
are symbols too, under the type's name: `Config.java#/Config/MAX_PORTS`.
|
|
256
|
+
With `const MaxPorts = 8` in `consts.go`, `consts.go#/MaxPorts` points at `8`. In Java, C#, Kotlin, Swift and Protocol
|
|
257
|
+
Buffers, the members of a type are symbols too, under the type's name: `Config.java#/Config/MAX_PORTS`. In HCL, each
|
|
258
|
+
block, attribute and object key is a symbol: `main.tf#/variable/region/default`.
|
|
254
259
|
|
|
255
260
|
- **A value is the initializer as written.** blockwatch never works it out: `20 * 1024 * 1024` stays as it is, and so
|
|
256
261
|
does `0x10`. Use `same-as-pattern` to take the part you need.
|
|
@@ -264,7 +269,8 @@ are symbols too, under the type's name: `Config.java#/Config/MAX_PORTS`.
|
|
|
264
269
|
with a name from the text that the parser had to skip. Other names in the file still resolve. The message shows
|
|
265
270
|
where the error is.
|
|
266
271
|
- **A path to a string that blockwatch can't decode stops the run.** Other paths in the file still resolve.
|
|
267
|
-
- **Members are not symbols yet**, such as a method or a field, except in Java
|
|
272
|
+
- **Members are not symbols yet**, such as a method or a field, except in Java, C#, Kotlin, Swift, Protocol Buffers
|
|
273
|
+
and HCL.
|
|
268
274
|
|
|
269
275
|
<!-- </block> -->
|
|
270
276
|
|
|
@@ -595,6 +601,261 @@ public class Config
|
|
|
595
601
|
|
|
596
602
|
<!-- </block> -->
|
|
597
603
|
|
|
604
|
+
## Kotlin
|
|
605
|
+
|
|
606
|
+
<!-- <block name="kotlin-paths"> -->
|
|
607
|
+
|
|
608
|
+
```kotlin
|
|
609
|
+
const val MAX_RETRIES = 20 * 1024
|
|
610
|
+
|
|
611
|
+
data class Config(val timeout: Int = 30, val name: String) {
|
|
612
|
+
@JvmField
|
|
613
|
+
val url = "https://example.com"
|
|
614
|
+
|
|
615
|
+
fun run() {}
|
|
616
|
+
fun run(times: Int) {}
|
|
617
|
+
|
|
618
|
+
companion object {
|
|
619
|
+
const val ORIGIN = 0
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
enum class Mode { RED, GREEN }
|
|
623
|
+
}
|
|
624
|
+
```
|
|
625
|
+
|
|
626
|
+
| Path | Points at |
|
|
627
|
+
|-----------------------|--------------------------------------------|
|
|
628
|
+
| `#/MAX_RETRIES` | `20 * 1024` |
|
|
629
|
+
| `#/Config` | the whole class |
|
|
630
|
+
| `#/Config/timeout` | `30` |
|
|
631
|
+
| `#/Config/name` | `val name: String`, as it has no default |
|
|
632
|
+
| `#/Config/url` | `https://example.com` |
|
|
633
|
+
| `#/Config/run` | a violation, as `run` is defined twice |
|
|
634
|
+
| `#/Config/ORIGIN` | `0` |
|
|
635
|
+
| `#/Config/Mode/GREEN` | `GREEN`, as it has no value |
|
|
636
|
+
|
|
637
|
+
- **Each top-level property, function, type and type alias is a symbol, and so is each member of a type**: a property,
|
|
638
|
+
a function, an enum entry, or a nested class, interface or object. A path goes from the top-level type down:
|
|
639
|
+
`#/Config/Mode/GREEN`.
|
|
640
|
+
- **A constructor parameter with `val` or `var` is a symbol.** Its value is its default. A parameter without `val` or
|
|
641
|
+
`var` is not a symbol.
|
|
642
|
+
- **A companion object's members sit under the class**, as code reads them: `#/Config/ORIGIN`. A companion with a
|
|
643
|
+
name works the same way: `companion object Builder` still gives `#/Config/ORIGIN`.
|
|
644
|
+
- **Overloads are defined twice.** So are a property and a function with one name, and two extension functions with
|
|
645
|
+
one name, such as `fun Foo.toDto()` and `fun Bar.toDto()`. Wrap the one you mean in a block instead.
|
|
646
|
+
- **A property's value is its initializer, or the `v` of `get() = v`.** A property with `by`, such as
|
|
647
|
+
`by lazy { 3 }`, has no value, and neither has one whose getter has a block body.
|
|
648
|
+
- **A name in backticks loses them.** `` fun `parses empty input`() `` in `Config` is
|
|
649
|
+
`#/Config/parses empty input`.
|
|
650
|
+
- **Annotations are part of a definition. KDoc is not.** One case is left out: at the top of a file, an annotation with
|
|
651
|
+
arguments on its own line, before a `fun` or `val` with no other modifier. The parser reads it as a separate
|
|
652
|
+
expression.
|
|
653
|
+
- **Constructors, `init` blocks, the companion object itself, local declarations, and the members in the body of an
|
|
654
|
+
enum entry are not symbols.** In a `.kts` script, the top-level properties, functions and types are symbols. Calls
|
|
655
|
+
such as `plugins { ... }` and everything inside them are not.
|
|
656
|
+
- **Strings follow Kotlin's escapes.** `"caf\u00e9"` is `café`. A raw string (`"""..."""`) has no escapes, and each line
|
|
657
|
+
end in it is a line feed. A string with a template, such as `"v$major"` or `"${a + b}"`, stays as written, and so
|
|
658
|
+
does a character such as `'a'`. A path to a string that Kotlin rejects stops the run, such as `"\q"`.
|
|
659
|
+
- **A syntax error stops the run for the member that holds it, and for each type around that member.** The other
|
|
660
|
+
members still resolve. The parser doesn't read some newer syntax, such as context parameters and `$$"..."` strings.
|
|
661
|
+
It also fails on a class body on one line with a property in it, such as `class A { val x = 1 }`.
|
|
662
|
+
|
|
663
|
+
<!-- </block> -->
|
|
664
|
+
|
|
665
|
+
## Swift
|
|
666
|
+
|
|
667
|
+
<!-- <block name="swift-paths"> -->
|
|
668
|
+
|
|
669
|
+
```swift
|
|
670
|
+
public let maxRetries = 20 * 1024
|
|
671
|
+
|
|
672
|
+
struct Config {
|
|
673
|
+
static let timeout = 30
|
|
674
|
+
var name: String
|
|
675
|
+
var ready: Bool { timeout > 0 }
|
|
676
|
+
|
|
677
|
+
func run() {}
|
|
678
|
+
func run(times: Int) {}
|
|
679
|
+
|
|
680
|
+
enum Mode: String {
|
|
681
|
+
case red = "r", green
|
|
682
|
+
}
|
|
683
|
+
}
|
|
684
|
+
|
|
685
|
+
extension Config {
|
|
686
|
+
static let url = "https://example.com"
|
|
687
|
+
}
|
|
688
|
+
```
|
|
689
|
+
|
|
690
|
+
| Path | Points at |
|
|
691
|
+
|-----------------------|--------------------------------------------|
|
|
692
|
+
| `#/maxRetries` | `20 * 1024` |
|
|
693
|
+
| `#/Config` | the whole struct, without its extension |
|
|
694
|
+
| `#/Config/timeout` | `30` |
|
|
695
|
+
| `#/Config/name` | `var name: String`, as it has no value |
|
|
696
|
+
| `#/Config/ready` | `timeout > 0` |
|
|
697
|
+
| `#/Config/run` | a violation, as `run` is defined twice |
|
|
698
|
+
| `#/Config/Mode/red` | `r` |
|
|
699
|
+
| `#/Config/Mode/green` | `green`, as its raw value is implicit |
|
|
700
|
+
| `#/Config/url` | `https://example.com` |
|
|
701
|
+
|
|
702
|
+
- **Each top-level property, function, type, type alias and macro is a symbol, and so is each member of a type**: a
|
|
703
|
+
property, a function, an enum case, an associated type or a nested type. A protocol is a type, and its requirements
|
|
704
|
+
are members. A path goes from the top-level type down: `#/Config/Mode/red`.
|
|
705
|
+
- **An extension's members sit under the type it extends**, as code reads them: `#/Config/url`. The type can come from
|
|
706
|
+
another file too, so `String+Format.swift` can have `#/String/trimmed`. The path follows the type's name as written:
|
|
707
|
+
`extension Outer.Inner` gives `#/Outer/Inner/...`, and `extension Swift.String` gives `#/Swift/String/...`. An
|
|
708
|
+
extension of a type without a name, such as `extension [Int]`, has no symbols.
|
|
709
|
+
- **Overloads are defined twice.** So are a property and a function with one name, copies of a name in `#if` and
|
|
710
|
+
`#else`, and a protocol requirement and its default in an extension. Wrap the one you mean in a block instead.
|
|
711
|
+
- **A property's value is its initializer, or the `v` of `{ v }` or `{ return v }`.** A computed property with `get`
|
|
712
|
+
or `set`, with several statements, or with one statement that is not an expression, such as a `for` loop, has no
|
|
713
|
+
value. An enum case's value is its raw value, the `v` of `= v`. A case
|
|
714
|
+
without one has no value, even when Swift gives it one.
|
|
715
|
+
- **In `let a = 1, b = 2` and `case a = 1, b`, each name covers only its own part.** The first part also covers the
|
|
716
|
+
attributes, the modifiers and `let`, `var` or `case`: `#/a` is `let a = 1`, and `#/b` is `b = 2`.
|
|
717
|
+
- **A name in backticks loses them.** Attributes are part of a definition. Doc comments are not.
|
|
718
|
+
- **`init`, `deinit`, `subscript`, operators, precedence groups, extensions themselves, local declarations and
|
|
719
|
+
top-level statements are not symbols.**
|
|
720
|
+
- **Strings follow Swift's escapes.** `"caf\u{e9}"` is `café`. A raw string, such as `#"C:\new"#`, reads only the
|
|
721
|
+
escapes with as many `#` as its quotes, such as `\#n`. A multi-line string loses the white space before its closing
|
|
722
|
+
quotes on each line, and each line end in it is a line feed. A string with an interpolation, such as `"v\(major)"`,
|
|
723
|
+
stays as written, and so does a regex. A path to a string that Swift rejects stops the run, such as `"\u{D800}"`.
|
|
724
|
+
- **A syntax error stops the run for the member that holds it, and for each type around that member.** The other
|
|
725
|
+
members still resolve. An extension is not part of the type it extends, so an error in an extension's member leaves
|
|
726
|
+
the type readable. The parser fails on an empty tuple passed to a function, as in `f(())`, so a function with one in
|
|
727
|
+
its body stops the run too.
|
|
728
|
+
|
|
729
|
+
<!-- </block> -->
|
|
730
|
+
|
|
731
|
+
## Protocol Buffers
|
|
732
|
+
|
|
733
|
+
<!-- <block name="proto-paths"> -->
|
|
734
|
+
|
|
735
|
+
```protobuf
|
|
736
|
+
syntax = "proto3";
|
|
737
|
+
|
|
738
|
+
package shop.v1;
|
|
739
|
+
|
|
740
|
+
option go_package = "shop/v1";
|
|
741
|
+
|
|
742
|
+
message Item {
|
|
743
|
+
string name = 1;
|
|
744
|
+
map<string, int32> counts = 2;
|
|
745
|
+
enum Color {
|
|
746
|
+
COLOR_UNSPECIFIED = 0;
|
|
747
|
+
RED = 1;
|
|
748
|
+
BLUE = -2;
|
|
749
|
+
}
|
|
750
|
+
oneof price {
|
|
751
|
+
int64 cents = 3;
|
|
752
|
+
}
|
|
753
|
+
}
|
|
754
|
+
|
|
755
|
+
service Items {
|
|
756
|
+
rpc Get(Item) returns (Item);
|
|
757
|
+
}
|
|
758
|
+
```
|
|
759
|
+
|
|
760
|
+
| Path | Points at |
|
|
761
|
+
|----------------------|------------------------------|
|
|
762
|
+
| `#/Item` | the whole message |
|
|
763
|
+
| `#/Item/name` | `1` |
|
|
764
|
+
| `#/Item/counts` | `2` |
|
|
765
|
+
| `#/Item/Color` | the whole enum |
|
|
766
|
+
| `#/Item/Color/RED` | `1` |
|
|
767
|
+
| `#/Item/Color/BLUE` | `-2` |
|
|
768
|
+
| `#/Item/price` | the whole oneof |
|
|
769
|
+
| `#/Item/cents` | `3` |
|
|
770
|
+
| `#/Items/Get` | the whole rpc |
|
|
771
|
+
|
|
772
|
+
- **Each message, enum and service is a symbol, at any depth, and so is each field, map field, oneof, enum value and
|
|
773
|
+
rpc in it.** A proto2 group, such as `optional group Result = 4 { ... }` in `Item`, is a symbol too, with its
|
|
774
|
+
fields under it: `#/Item/Result/code`. It has no value, though it has a number.
|
|
775
|
+
- **The package is not part of a path.** A file has only one, so `#/Item` is enough.
|
|
776
|
+
- **An enum value sits under its enum:** `#/Item/Color/RED`.
|
|
777
|
+
- **A field's value is its number, and an enum value's value is its number.** Both stay as written: `0x3` stays `0x3`,
|
|
778
|
+
and `- 2` stays `- 2`. Options after the number don't change it: `BLUE = -2 [deprecated = true]` is `-2`.
|
|
779
|
+
- **A oneof's fields sit in its message**, as code reads them: `#/Item/cents`, not `#/Item/price/cents`.
|
|
780
|
+
- **An extension field sits where its `extend` is written**, not in the message it extends.
|
|
781
|
+
`extend Other { int32 tag = 100; }` at the top of the file gives `#/tag`, and inside `Item` it gives `#/Item/tag`.
|
|
782
|
+
- **A definition covers its whole statement**, with its label, its options and its `;`, but not the comments above it.
|
|
783
|
+
- **Options are not symbols**, and neither are `syntax`, `package`, `import`, `extend` blocks, `reserved` and
|
|
784
|
+
`extensions`. To check an option such as `go_package`, wrap it in a `[[block]]` entry with a `target-pattern`.
|
|
785
|
+
- **A syntax error stops the run for the definition that holds it, and for each message around it.** The other
|
|
786
|
+
definitions still resolve.
|
|
787
|
+
|
|
788
|
+
<!-- </block> -->
|
|
789
|
+
|
|
790
|
+
## HCL
|
|
791
|
+
|
|
792
|
+
Terraform, OpenTofu, Terragrunt, Nomad and Packer files are HCL.
|
|
793
|
+
|
|
794
|
+
<!-- <block name="hcl-paths"> -->
|
|
795
|
+
|
|
796
|
+
```hcl
|
|
797
|
+
terraform {
|
|
798
|
+
required_providers {
|
|
799
|
+
aws = {
|
|
800
|
+
source = "hashicorp/aws"
|
|
801
|
+
version = "~> 5.0"
|
|
802
|
+
}
|
|
803
|
+
}
|
|
804
|
+
}
|
|
805
|
+
|
|
806
|
+
variable "region" {
|
|
807
|
+
default = "us-east-1"
|
|
808
|
+
}
|
|
809
|
+
|
|
810
|
+
locals {
|
|
811
|
+
name = "app-${var.env}"
|
|
812
|
+
tags = { Team = "core", "cost center" = 42 }
|
|
813
|
+
}
|
|
814
|
+
|
|
815
|
+
resource "aws_instance" "web" {
|
|
816
|
+
ami = data.aws_ami.ubuntu.id
|
|
817
|
+
count = (3)
|
|
818
|
+
user_data = <<-EOT
|
|
819
|
+
#!/bin/sh
|
|
820
|
+
echo hi
|
|
821
|
+
EOT
|
|
822
|
+
}
|
|
823
|
+
```
|
|
824
|
+
|
|
825
|
+
| Path | Points at |
|
|
826
|
+
|----------------------------------------------|-------------------------------------------|
|
|
827
|
+
| `#/terraform/required_providers/aws/version` | `~> 5.0` |
|
|
828
|
+
| `#/variable/region` | the whole block |
|
|
829
|
+
| `#/variable/region/default` | `us-east-1` |
|
|
830
|
+
| `#/locals/name` | `"app-${var.env}"`, as written |
|
|
831
|
+
| `#/locals/tags` | the whole object, as written |
|
|
832
|
+
| `#/locals/tags/cost center` | `42` |
|
|
833
|
+
| `#/resource/aws_instance/web/ami` | `data.aws_ami.ubuntu.id` |
|
|
834
|
+
| `#/resource/aws_instance/web/count` | `3` |
|
|
835
|
+
| `#/resource/aws_instance/web/user_data` | `#!/bin/sh` and `echo hi`, each on a line |
|
|
836
|
+
|
|
837
|
+
- **Each block is a symbol, at any depth, and so is each attribute and each key of an object.** A block's path is its
|
|
838
|
+
type, then each of its labels: `#/resource/aws_instance/web`. In a `.tfvars` file, each attribute sits at the top:
|
|
839
|
+
`#/region`.
|
|
840
|
+
- **A path with only some of a block's labels points at nothing.** `#/resource/aws_instance` is no symbol.
|
|
841
|
+
- **A block written twice in one body makes its path a violation**, such as two `ingress` blocks in a resource. Two
|
|
842
|
+
`locals` blocks make `#/locals` a violation, but `#/locals/name` still resolves when only one of them sets `name`.
|
|
843
|
+
- **A key of an object is a segment when it is a name, a plain string, `true` or `false`**, such as `Team` or
|
|
844
|
+
`"cost center"`. A key written as a number or an expression, such as `3` or `(var.k)`, is not. The items of a list
|
|
845
|
+
are not symbols.
|
|
846
|
+
- **A label or key with an escape, such as `"a\"b"`, gives no symbol**, and neither does anything under it.
|
|
847
|
+
- **A value is the expression as written**, without parentheses around it: `count = (3)` is `3`.
|
|
848
|
+
- **Strings follow HCL's escapes.** `"caf\u00e9"` is `café`, `$${` is `${`, and `%%{` is `%{`. A heredoc is its text,
|
|
849
|
+
with each line end. A `<<-` heredoc loses the indent that HCL removes. A string or heredoc with `${...}` or `%{...}`
|
|
850
|
+
stays as written. blockwatch doesn't turn text into Unicode NFC, as HCL does. A path to an escape that stands for no
|
|
851
|
+
character, such as `"\uD800"`, stops the run.
|
|
852
|
+
- **A block covers its type, labels and body.** An attribute or a key covers its name and its value. Comments above
|
|
853
|
+
them are not part of them.
|
|
854
|
+
- **A syntax error stops the run for the definition that holds it, and for each block around it.** After an error, the
|
|
855
|
+
parser can read the rest of the file wrongly, so a later path may not resolve.
|
|
856
|
+
|
|
857
|
+
<!-- </block> -->
|
|
858
|
+
|
|
598
859
|
---
|
|
599
860
|
|
|
600
861
|
[← Return to README](../README.md)
|
|
@@ -6,7 +6,7 @@ setup(
|
|
|
6
6
|
name='blockwatch-pre-commit-placeholder',
|
|
7
7
|
version='0.0.0',
|
|
8
8
|
# <block name="blockwatch-cli-version" same-as-pattern="blockwatch-cli==(?P<value>\d+\.\d+\.\d+)">
|
|
9
|
-
install_requires=['blockwatch-cli==0.16.
|
|
9
|
+
install_requires=['blockwatch-cli==0.16.5'],
|
|
10
10
|
# </block>
|
|
11
11
|
# Without it, setuptools takes the directories under src/ for Python packages.
|
|
12
12
|
packages=[],
|
|
@@ -899,6 +899,10 @@ mod supported_languages_tests {
|
|
|
899
899
|
"tofu.tofu".to_string(),
|
|
900
900
|
"# <block>\nregion = \"eu-central-1\"\n# </block>".to_string(),
|
|
901
901
|
),
|
|
902
|
+
(
|
|
903
|
+
"nomad.nomad".to_string(),
|
|
904
|
+
"# <block>\ndatacenters = [\"dc1\"]\n# </block>".to_string(),
|
|
905
|
+
),
|
|
902
906
|
(
|
|
903
907
|
"htm.htm".to_string(),
|
|
904
908
|
"<!-- <block> -->\n<div>Content</div>\n<!-- </block> -->".to_string(),
|