coderadar-rs 0.9.0__tar.gz → 0.9.2__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.
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/Cargo.lock +1 -1
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/Cargo.toml +1 -1
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/PKG-INFO +25 -7
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/README.md +23 -5
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/fs/git.rs +8 -13
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/module_resolution.rs +74 -5
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/projection_ops.rs +2 -5
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/lib.rs +4 -7
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/__init__.py +98 -90
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/agent/graphrag.py +14 -15
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/cli.py +28 -24
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/coldstart.py +7 -8
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/config.py +10 -11
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/embedding/__init__.py +14 -5
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/embedding/dedup.py +7 -8
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/excludes.py +3 -3
- coderadar_rs-0.9.2/py_agent/src/coderadar/lsp/__init__.py +4 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/lsp/pool.py +16 -16
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/mcp/__init__.py +2 -2
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/mcp/lazy.py +8 -10
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/mcp/lifecycle.py +10 -9
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/mcp/roots.py +13 -13
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/mcp/server.py +112 -95
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/mcp/startup.py +13 -11
- coderadar_rs-0.9.2/py_agent/src/coderadar/mutation/__init__.py +4 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/mutation/tool_router.py +6 -5
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/project_state.py +4 -5
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/query/cache.py +6 -5
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/query/executor.py +19 -20
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/query/planner.py +2 -2
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/resolvers/actix.py +7 -15
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/resolvers/aspnet.py +17 -22
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/resolvers/base.py +7 -7
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/resolvers/django.py +24 -28
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/resolvers/exports.py +11 -11
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/resolvers/express.py +15 -23
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/resolvers/fastapi.py +26 -25
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/resolvers/flask.py +27 -26
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/resolvers/go.py +11 -22
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/resolvers/laravel.py +11 -14
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/resolvers/nestjs.py +9 -13
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/resolvers/rails.py +6 -14
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/resolvers/reactrouter.py +8 -13
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/resolvers/resolution.py +11 -11
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/resolvers/springboot.py +21 -20
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/resolvers/vuerouter.py +9 -15
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/visualizers/__init__.py +8 -4
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/visualizers/call_graph.py +6 -6
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/visualizers/graphviz_viz.py +22 -23
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/visualizers/mermaid.py +12 -14
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/pyproject.toml +9 -2
- coderadar_rs-0.9.0/py_agent/src/coderadar/lsp/__init__.py +0 -4
- coderadar_rs-0.9.0/py_agent/src/coderadar/mutation/__init__.py +0 -4
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/LICENSE +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/Cargo.toml +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/bash.scm +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/c.scm +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/clojure.scm +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/cmake.scm +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/cpp.scm +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/csharp.scm +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/dart.scm +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/dockerfile.scm +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/elisp.scm +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/elixir.scm +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/erlang.scm +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/fsharp.scm +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/go.scm +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/graphql.scm +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/groovy.scm +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/haskell.scm +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/hcl.scm +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/java.scm +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/javascript.scm +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/julia.scm +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/kotlin.scm +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/lua.scm +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/nix.scm +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/objc.scm +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/ocaml.scm +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/perl.scm +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/php.scm +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/powershell.scm +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/protobuf.scm +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/python.scm +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/r.scm +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/ruby.scm +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/rust.scm +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/scala.scm +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/shell.scm +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/sql.scm +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/swift.scm +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/systemverilog.scm +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/typescript.scm +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/verilog.scm +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/zig.scm +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/clones/apted.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/clones/lsh_index.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/clones/minhash.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/clones/mod.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/clones/tokens.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/extract/decorators.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/extract/docstring.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/extract/mod.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/extract/single_pass.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/extract/spans.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/extract/tagger.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/extract/walker.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/fs/mod.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/fs/watcher.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/call_graph.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/centrality.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/cfg.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/cold_start.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/config.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/deadcode/entry_points.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/deadcode/mod.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/deadcode/reachability.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/embeddings.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/import_graph.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/indexing.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/inheritance.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/mod.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/mro.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/persistence.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/resolve_calls.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/rta_lite.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/tests/call_graph_tests.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/tests/embedding_tests.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/tests/import_graph_tests.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/tests/indexing_tests.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/tests/inheritance_tests.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/tests/mod.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/tests/mro_tests.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/tests/persistence_tests.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/tests/projection_tests.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/tests/query_compile_tests.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/tests/traversal_tests.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/traversal.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/mutation/edit.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/mutation/indent.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/mutation/mod.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/mutation/write_guard.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/query/exec.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/query/grammar.pest +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/query/grammar.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/query/mod.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/resolve/cache.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/resolve/import_graph.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/resolve/mod.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/resolve/orchestrator.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/resolve/signature.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/scaffold/mod.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/scaffold/secrets.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/scoring/mod.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/smells/const_eval.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/smells/engine.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/smells/metrics.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/smells/mod.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/smells/profile.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/smells/rule.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/smells/rules/brain_method.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/smells/rules/data_class.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/smells/rules/dead_branch.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/smells/rules/dead_code.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/smells/rules/deep_nesting.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/smells/rules/excessive_returns.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/smells/rules/god_class.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/smells/rules/high_cyclomatic_complexity.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/smells/rules/intra_dead_statements.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/smells/rules/long_method.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/smells/rules/long_parameter_list.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/smells/rules/mod.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/smells/rules/too_many_fields.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/smells/types.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/storage.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/types.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/update/wal.rs +0 -0
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/agent/__init__.py +4 -4
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/query/__init__.py +5 -5
- {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/resolvers/__init__.py +21 -21
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: coderadar-rs
|
|
3
|
-
Version: 0.9.
|
|
3
|
+
Version: 0.9.2
|
|
4
4
|
Classifier: Development Status :: 4 - Beta
|
|
5
5
|
Classifier: Intended Audience :: Developers
|
|
6
6
|
Classifier: License :: OSI Approved :: MIT License
|
|
@@ -21,7 +21,7 @@ Requires-Dist: pytest>=7.0 ; extra == 'dev'
|
|
|
21
21
|
Requires-Dist: pytest-asyncio>=0.21 ; extra == 'dev'
|
|
22
22
|
Requires-Dist: hypothesis>=6.0 ; extra == 'dev'
|
|
23
23
|
Requires-Dist: mypy>=1.0 ; extra == 'dev'
|
|
24
|
-
Requires-Dist: ruff
|
|
24
|
+
Requires-Dist: ruff==0.16.5 ; extra == 'dev'
|
|
25
25
|
Requires-Dist: graphviz>=0.20 ; extra == 'visualizers'
|
|
26
26
|
Provides-Extra: dev
|
|
27
27
|
Provides-Extra: visualizers
|
|
@@ -32,7 +32,7 @@ License: MIT
|
|
|
32
32
|
Requires-Python: >=3.10
|
|
33
33
|
Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
|
|
34
34
|
|
|
35
|
-
# CodeRadar v0.9.
|
|
35
|
+
# CodeRadar v0.9.2
|
|
36
36
|
|
|
37
37
|
[](https://github.com/opticsWolf/coderadar/actions/workflows/ci.yml)
|
|
38
38
|
[](https://pypi.org/project/coderadar-rs/)
|
|
@@ -89,7 +89,7 @@ Rust Core (ProjectedGraph, Tree-sitter 41-lang, Parallel Extraction,
|
|
|
89
89
|
| Metric | Value |
|
|
90
90
|
|--------|-------|
|
|
91
91
|
| **Languages indexed** | 41 (12 Tier 1, 29 Tier 2, 330+ Tier 3) |
|
|
92
|
-
| **Tests** |
|
|
92
|
+
| **Tests** | 1128 (369 Rust + 759 Python) |
|
|
93
93
|
| **MCP Tools** | 22 — 17 `codegraph_*` (explore, search, node, affected, query, search_similar, compute_embeddings, module_children, as_of, traverse, get_smells, dead_code, find_clones, find_scaffolding, reindex, update_file, set_project) + 5 `coderadar_*` (resolve, replace_body, update_signature, rename, create_entity) |
|
|
94
94
|
| **Query surface** | Pest structural + Macrame agent traversals + vector search |
|
|
95
95
|
| **Frameworks** | Django, Flask, FastAPI, Go, Actix, Express, Spring Boot, Laravel, ASP.NET, Rails, NestJS, Vue Router, React Router |
|
|
@@ -264,7 +264,7 @@ not assume the cwd is the project:
|
|
|
264
264
|
|------|-----------|------------|----------|
|
|
265
265
|
| **Tier 1** | Python, TypeScript, JavaScript, Rust, Go, Java, C, C++, Ruby, PHP, C#, Kotlin | Import → Signature → Framework | Full tool suite |
|
|
266
266
|
| **Tier 2** | Swift, Scala, Lua, Elixir, Zig, R, Bash, Dart, Protobuf, Dockerfile, SQL, HCL, CMake, GraphQL, Erlang, Haskell, **Nix, Shell, Groovy, Perl, SystemVerilog, OCaml, Clojure, F#, Verilog, Julia, PowerShell, Emacs Lisp, Objective-C** | Import → Signature | replace_body, create_entity |
|
|
267
|
-
| **Tier 3** |
|
|
267
|
+
| **Tier 3** | HTML, CSS, YAML, TOML, JSON, Markdown + 280 more | Signature Match only | replace_body, create_entity |
|
|
268
268
|
|
|
269
269
|
## Resolution Cascade
|
|
270
270
|
|
|
@@ -402,6 +402,24 @@ tracked finding with a battery anchor (see
|
|
|
402
402
|
(`#[pyfunction]` never reached the graph before) with `#[pymodule]`
|
|
403
403
|
added as a production root.
|
|
404
404
|
|
|
405
|
+
## v0.9.1–v0.9.2 Highlights — CI reds closed + docs refresh
|
|
406
|
+
|
|
407
|
+
- **Temporal traversal on aliased roots (v0.9.1).** Windows CI failed
|
|
408
|
+
`test_as_of_temporal_traversal` 3/3 runs (`got []`) while local +
|
|
409
|
+
Ubuntu passed: GitHub runners set `TEMP` with an 8.3 short component
|
|
410
|
+
(`C:\Users\RUNNER~1\…`), the walk spells paths as passed while
|
|
411
|
+
`INDEXED_ROOT` is filesystem-canonicalized, the lexical strip missed,
|
|
412
|
+
ids fell back to absolute form, and analyze retired all 3 fixture
|
|
413
|
+
concepts as orphans in the same run. `canonical_file_form` now
|
|
414
|
+
FS-canonicalizes once on a strip miss and retries (mismatch path only),
|
|
415
|
+
with verbatim-alias (Windows) and symlink-alias (unix) regression tests.
|
|
416
|
+
- **Lint fully green.** The 951-error ruff backlog is cleaned to zero
|
|
417
|
+
against pinned `ruff@0.16.5` (fixture excludes, mechanical fixes,
|
|
418
|
+
per-site `noqa` where deliberate) — `cargo fmt` + clippy + ruff all pass.
|
|
419
|
+
- **This refresh (v0.9.2).** Test counts 1119 → 1128 (369 Rust + 759
|
|
420
|
+
Python), query files 18 → 41 (one per Tier-1/2 language), Shell/SQL
|
|
421
|
+
de-duplicated out of the Tier-3 row (both ship `.scm` files in Tier 2).
|
|
422
|
+
|
|
405
423
|
## v0.7.18 Feature Highlights — the fossil-mcp port
|
|
406
424
|
|
|
407
425
|
v0.7.3 through v0.7.18 ported the best of fossil-mcp's detector suite onto CodeRadar's graph
|
|
@@ -639,7 +657,7 @@ truth, scaling, dead-code retirement, configuration, and the MCP layer.
|
|
|
639
657
|
|
|
640
658
|
```
|
|
641
659
|
core_indexer/ # Rust core
|
|
642
|
-
queries/ #
|
|
660
|
+
queries/ # 41 .scm query files (one per Tier-1/2 language)
|
|
643
661
|
src/
|
|
644
662
|
extract/ # Tree-sitter: tagger (query cursor) + walker (hierarchy) + docstring + decorators
|
|
645
663
|
update/ # Incremental diff + patch + WAL
|
|
@@ -676,7 +694,7 @@ py_agent/src/coderadar/ # Python layer
|
|
|
676
694
|
visualizers/ # Mermaid + Graphviz (SCC cycle highlighting)
|
|
677
695
|
|
|
678
696
|
docs/ # Specifications + code review + performance roadmap
|
|
679
|
-
tests/ #
|
|
697
|
+
tests/ # 759 Python tests (E2E incl. dead-code/clones/scaffold/CFG/
|
|
680
698
|
# centrality/dead-branch/RTA goldens, mutation E2E, MCP,
|
|
681
699
|
# framework resolvers, ingest parity, benchmarks)
|
|
682
700
|
mcp/ # Root resolution, background init, lifecycle, project_path
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# CodeRadar v0.9.
|
|
1
|
+
# CodeRadar v0.9.2
|
|
2
2
|
|
|
3
3
|
[](https://github.com/opticsWolf/coderadar/actions/workflows/ci.yml)
|
|
4
4
|
[](https://pypi.org/project/coderadar-rs/)
|
|
@@ -55,7 +55,7 @@ Rust Core (ProjectedGraph, Tree-sitter 41-lang, Parallel Extraction,
|
|
|
55
55
|
| Metric | Value |
|
|
56
56
|
|--------|-------|
|
|
57
57
|
| **Languages indexed** | 41 (12 Tier 1, 29 Tier 2, 330+ Tier 3) |
|
|
58
|
-
| **Tests** |
|
|
58
|
+
| **Tests** | 1128 (369 Rust + 759 Python) |
|
|
59
59
|
| **MCP Tools** | 22 — 17 `codegraph_*` (explore, search, node, affected, query, search_similar, compute_embeddings, module_children, as_of, traverse, get_smells, dead_code, find_clones, find_scaffolding, reindex, update_file, set_project) + 5 `coderadar_*` (resolve, replace_body, update_signature, rename, create_entity) |
|
|
60
60
|
| **Query surface** | Pest structural + Macrame agent traversals + vector search |
|
|
61
61
|
| **Frameworks** | Django, Flask, FastAPI, Go, Actix, Express, Spring Boot, Laravel, ASP.NET, Rails, NestJS, Vue Router, React Router |
|
|
@@ -230,7 +230,7 @@ not assume the cwd is the project:
|
|
|
230
230
|
|------|-----------|------------|----------|
|
|
231
231
|
| **Tier 1** | Python, TypeScript, JavaScript, Rust, Go, Java, C, C++, Ruby, PHP, C#, Kotlin | Import → Signature → Framework | Full tool suite |
|
|
232
232
|
| **Tier 2** | Swift, Scala, Lua, Elixir, Zig, R, Bash, Dart, Protobuf, Dockerfile, SQL, HCL, CMake, GraphQL, Erlang, Haskell, **Nix, Shell, Groovy, Perl, SystemVerilog, OCaml, Clojure, F#, Verilog, Julia, PowerShell, Emacs Lisp, Objective-C** | Import → Signature | replace_body, create_entity |
|
|
233
|
-
| **Tier 3** |
|
|
233
|
+
| **Tier 3** | HTML, CSS, YAML, TOML, JSON, Markdown + 280 more | Signature Match only | replace_body, create_entity |
|
|
234
234
|
|
|
235
235
|
## Resolution Cascade
|
|
236
236
|
|
|
@@ -368,6 +368,24 @@ tracked finding with a battery anchor (see
|
|
|
368
368
|
(`#[pyfunction]` never reached the graph before) with `#[pymodule]`
|
|
369
369
|
added as a production root.
|
|
370
370
|
|
|
371
|
+
## v0.9.1–v0.9.2 Highlights — CI reds closed + docs refresh
|
|
372
|
+
|
|
373
|
+
- **Temporal traversal on aliased roots (v0.9.1).** Windows CI failed
|
|
374
|
+
`test_as_of_temporal_traversal` 3/3 runs (`got []`) while local +
|
|
375
|
+
Ubuntu passed: GitHub runners set `TEMP` with an 8.3 short component
|
|
376
|
+
(`C:\Users\RUNNER~1\…`), the walk spells paths as passed while
|
|
377
|
+
`INDEXED_ROOT` is filesystem-canonicalized, the lexical strip missed,
|
|
378
|
+
ids fell back to absolute form, and analyze retired all 3 fixture
|
|
379
|
+
concepts as orphans in the same run. `canonical_file_form` now
|
|
380
|
+
FS-canonicalizes once on a strip miss and retries (mismatch path only),
|
|
381
|
+
with verbatim-alias (Windows) and symlink-alias (unix) regression tests.
|
|
382
|
+
- **Lint fully green.** The 951-error ruff backlog is cleaned to zero
|
|
383
|
+
against pinned `ruff@0.16.5` (fixture excludes, mechanical fixes,
|
|
384
|
+
per-site `noqa` where deliberate) — `cargo fmt` + clippy + ruff all pass.
|
|
385
|
+
- **This refresh (v0.9.2).** Test counts 1119 → 1128 (369 Rust + 759
|
|
386
|
+
Python), query files 18 → 41 (one per Tier-1/2 language), Shell/SQL
|
|
387
|
+
de-duplicated out of the Tier-3 row (both ship `.scm` files in Tier 2).
|
|
388
|
+
|
|
371
389
|
## v0.7.18 Feature Highlights — the fossil-mcp port
|
|
372
390
|
|
|
373
391
|
v0.7.3 through v0.7.18 ported the best of fossil-mcp's detector suite onto CodeRadar's graph
|
|
@@ -605,7 +623,7 @@ truth, scaling, dead-code retirement, configuration, and the MCP layer.
|
|
|
605
623
|
|
|
606
624
|
```
|
|
607
625
|
core_indexer/ # Rust core
|
|
608
|
-
queries/ #
|
|
626
|
+
queries/ # 41 .scm query files (one per Tier-1/2 language)
|
|
609
627
|
src/
|
|
610
628
|
extract/ # Tree-sitter: tagger (query cursor) + walker (hierarchy) + docstring + decorators
|
|
611
629
|
update/ # Incremental diff + patch + WAL
|
|
@@ -642,7 +660,7 @@ py_agent/src/coderadar/ # Python layer
|
|
|
642
660
|
visualizers/ # Mermaid + Graphviz (SCC cycle highlighting)
|
|
643
661
|
|
|
644
662
|
docs/ # Specifications + code review + performance roadmap
|
|
645
|
-
tests/ #
|
|
663
|
+
tests/ # 759 Python tests (E2E incl. dead-code/clones/scaffold/CFG/
|
|
646
664
|
# centrality/dead-branch/RTA goldens, mutation E2E, MCP,
|
|
647
665
|
# framework resolvers, ingest parity, benchmarks)
|
|
648
666
|
mcp/ # Root resolution, background init, lifecycle, project_path
|
|
@@ -105,9 +105,7 @@ pub fn is_worktree_clean(repo_path: &str) -> Result<bool, GitError> {
|
|
|
105
105
|
.recurse_untracked_dirs(true)
|
|
106
106
|
.include_ignored(false)
|
|
107
107
|
.recurse_ignored_dirs(false);
|
|
108
|
-
let statuses = repo
|
|
109
|
-
.statuses(Some(&mut opts))
|
|
110
|
-
.map_err(GitError::Status)?;
|
|
108
|
+
let statuses = repo.statuses(Some(&mut opts)).map_err(GitError::Status)?;
|
|
111
109
|
Ok(statuses.is_empty())
|
|
112
110
|
}
|
|
113
111
|
|
|
@@ -135,12 +133,8 @@ mod tests {
|
|
|
135
133
|
std::fs::write(dir.join(".gitignore"), ".coderadar/\n*.log\n").unwrap();
|
|
136
134
|
let repo = git2::Repository::init(dir).unwrap();
|
|
137
135
|
let mut index = repo.index().unwrap();
|
|
138
|
-
index
|
|
139
|
-
|
|
140
|
-
.unwrap();
|
|
141
|
-
index
|
|
142
|
-
.add_path(std::path::Path::new(".gitignore"))
|
|
143
|
-
.unwrap();
|
|
136
|
+
index.add_path(std::path::Path::new("a.txt")).unwrap();
|
|
137
|
+
index.add_path(std::path::Path::new(".gitignore")).unwrap();
|
|
144
138
|
index.write().unwrap();
|
|
145
139
|
let tree_id = index.write_tree().unwrap();
|
|
146
140
|
let tree = repo.find_tree(tree_id).unwrap();
|
|
@@ -156,7 +150,10 @@ mod tests {
|
|
|
156
150
|
let dir = tempfile::tempdir().unwrap();
|
|
157
151
|
init_commit_repo(dir.path());
|
|
158
152
|
let root = dir.path().to_str().unwrap();
|
|
159
|
-
assert!(
|
|
153
|
+
assert!(
|
|
154
|
+
is_worktree_clean(root).unwrap(),
|
|
155
|
+
"committed base must be clean"
|
|
156
|
+
);
|
|
160
157
|
|
|
161
158
|
std::fs::write(dir.path().join("top.log"), "x\n").unwrap();
|
|
162
159
|
std::fs::create_dir_all(dir.path().join(".coderadar/store")).unwrap();
|
|
@@ -187,9 +184,7 @@ mod revision_tests {
|
|
|
187
184
|
std::fs::write(dir.join(name), "v\n").unwrap();
|
|
188
185
|
let repo = Repository::open(dir).unwrap();
|
|
189
186
|
let mut index = repo.index().unwrap();
|
|
190
|
-
index
|
|
191
|
-
.add_path(std::path::Path::new(name))
|
|
192
|
-
.unwrap();
|
|
187
|
+
index.add_path(std::path::Path::new(name)).unwrap();
|
|
193
188
|
index.write().unwrap();
|
|
194
189
|
let tree_id = index.write_tree().unwrap();
|
|
195
190
|
let tree = repo.find_tree(tree_id).unwrap();
|
|
@@ -46,23 +46,48 @@ fn clean_lexical(p: &std::path::Path) -> std::path::PathBuf {
|
|
|
46
46
|
/// yield the same ids. Paths outside the indexed root keep absolute form
|
|
47
47
|
/// (no worse than today; they never matched anything anyway).
|
|
48
48
|
pub(crate) fn canonical_file_form(path: &str) -> String {
|
|
49
|
-
|
|
49
|
+
canonical_file_form_with_root(path, &crate::indexed_root())
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/// Inner funnel with the root injectable (unit tests must not touch the
|
|
53
|
+
/// process-global `INDEXED_ROOT`; parallel tests share it).
|
|
54
|
+
fn canonical_file_form_with_root(path: &str, root: &std::path::Path) -> String {
|
|
50
55
|
let cwd = std::env::current_dir().unwrap_or_else(|_| std::path::PathBuf::from("."));
|
|
51
56
|
let p = std::path::Path::new(path);
|
|
52
57
|
let abs = if p.is_absolute() {
|
|
53
58
|
clean_lexical(p)
|
|
54
59
|
} else {
|
|
55
60
|
let via_cwd = clean_lexical(&cwd.join(p));
|
|
56
|
-
if via_cwd.starts_with(
|
|
61
|
+
if via_cwd.starts_with(root) {
|
|
57
62
|
via_cwd
|
|
58
63
|
} else {
|
|
59
64
|
clean_lexical(&root.join(p))
|
|
60
65
|
}
|
|
61
66
|
};
|
|
62
|
-
let rel = match abs.strip_prefix(
|
|
67
|
+
let rel = match abs.strip_prefix(root) {
|
|
63
68
|
Ok(r) if !r.as_os_str().is_empty() => r.to_path_buf(),
|
|
64
|
-
//
|
|
65
|
-
|
|
69
|
+
// Aliased root: the walk spells the path as passed (8.3 short
|
|
70
|
+
// names like C:\Users\RUNNER~1\… on CI, symlinks, verbatim
|
|
71
|
+
// `\\?\` form, on-disk case) while INDEXED_ROOT is
|
|
72
|
+
// filesystem-canonicalized — a lexical strip can never match
|
|
73
|
+
// those. Resolve through the FS once (mismatch path only, never
|
|
74
|
+
// the hot path) and retry before falling back to absolute form,
|
|
75
|
+
// which `retire_noncanonical_concepts` would close as an orphan
|
|
76
|
+
// (Windows CI's `test_as_of_temporal_traversal`: 3 concepts
|
|
77
|
+
// retired, as_of reads []).
|
|
78
|
+
_ => match std::fs::canonicalize(&abs) {
|
|
79
|
+
Ok(canon) => {
|
|
80
|
+
let canon = crate::strip_verbatim_prefix(canon);
|
|
81
|
+
match canon.strip_prefix(root) {
|
|
82
|
+
Ok(r) if !r.as_os_str().is_empty() => r.to_path_buf(),
|
|
83
|
+
// Outside the root (or the root itself): absolute form.
|
|
84
|
+
_ => return normalize_path_str(path),
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// Unresolvable (update_file mints ids for files that may not
|
|
88
|
+
// exist yet): absolute form, as before.
|
|
89
|
+
_ => return normalize_path_str(path),
|
|
90
|
+
},
|
|
66
91
|
};
|
|
67
92
|
let sep = std::path::MAIN_SEPARATOR;
|
|
68
93
|
let joined = rel
|
|
@@ -389,6 +414,50 @@ mod canonical_form_tests {
|
|
|
389
414
|
assert_eq!(canonical_file_form("some/dir/x.py"), c);
|
|
390
415
|
}
|
|
391
416
|
|
|
417
|
+
/// Aliased root (Windows): the walk may spell a path verbatim
|
|
418
|
+
/// (`\\\\?\\C:\\…`) while INDEXED_ROOT is the stripped form — same
|
|
419
|
+
/// file, lexical mismatch. Models CI's 8.3 TEMP (`RUNNER~1`), which
|
|
420
|
+
/// retired all 3 concepts of `test_as_of_temporal_traversal`'s fixture
|
|
421
|
+
/// as "non-canonical" and made as_of read [].
|
|
422
|
+
#[cfg(windows)]
|
|
423
|
+
#[test]
|
|
424
|
+
fn verbatim_aliased_path_still_mints_relative_id() {
|
|
425
|
+
let base = std::env::temp_dir().join(format!("cr_alias_{}", std::process::id()));
|
|
426
|
+
let real = base.join("real");
|
|
427
|
+
std::fs::create_dir_all(&real).unwrap();
|
|
428
|
+
std::fs::write(real.join("a.py"), "x = 1\n").unwrap();
|
|
429
|
+
// What INDEXED_ROOT holds: canonicalized, verbatim stripped.
|
|
430
|
+
let root = crate::strip_verbatim_prefix(std::fs::canonicalize(&real).unwrap());
|
|
431
|
+
// What the walk may yield for the same file: verbatim spelling.
|
|
432
|
+
let verbatim = std::path::PathBuf::from(format!(r"\\?\{}", real.join("a.py").display()));
|
|
433
|
+
let got = canonical_file_form_with_root(&verbatim.to_string_lossy(), &root);
|
|
434
|
+
assert!(
|
|
435
|
+
got.starts_with(r".\"),
|
|
436
|
+
"aliased path must mint a canonical relative id, got {got:?}"
|
|
437
|
+
);
|
|
438
|
+
std::fs::remove_dir_all(&base).ok();
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
/// Aliased root (POSIX): same mismatch class via symlink — lexical
|
|
442
|
+
/// strip of the unresolved spelling fails, the FS fallback resolves.
|
|
443
|
+
#[cfg(unix)]
|
|
444
|
+
#[test]
|
|
445
|
+
fn symlinked_path_still_mints_relative_id() {
|
|
446
|
+
let base = std::env::temp_dir().join(format!("cr_alias_{}", std::process::id()));
|
|
447
|
+
let real = base.join("real");
|
|
448
|
+
std::fs::create_dir_all(&real).unwrap();
|
|
449
|
+
std::fs::write(real.join("a.py"), "x = 1\n").unwrap();
|
|
450
|
+
std::os::unix::fs::symlink(&real, base.join("alias")).unwrap();
|
|
451
|
+
let root = std::fs::canonicalize(&real).unwrap();
|
|
452
|
+
let via_alias = base.join("alias").join("a.py");
|
|
453
|
+
let got = canonical_file_form_with_root(&via_alias.to_string_lossy(), &root);
|
|
454
|
+
assert!(
|
|
455
|
+
got.starts_with("./"),
|
|
456
|
+
"aliased path must mint a canonical relative id, got {got:?}"
|
|
457
|
+
);
|
|
458
|
+
std::fs::remove_dir_all(&base).ok();
|
|
459
|
+
}
|
|
460
|
+
|
|
392
461
|
#[test]
|
|
393
462
|
fn canonical_head_predicate_sorts_all_three_historical_forms() {
|
|
394
463
|
assert!(is_canonical_file_head(r".\tests\x.py"));
|
|
@@ -63,12 +63,9 @@ impl CodeGraph {
|
|
|
63
63
|
// too, or this whole branch silently keeps everything. Collect
|
|
64
64
|
// across ALL entity maps (functions/classes alone left
|
|
65
65
|
// constants, aliases, imports and the module itself behind).
|
|
66
|
-
let canon =
|
|
67
|
-
super::module_resolution::canonical_file_form(file_path);
|
|
66
|
+
let canon = super::module_resolution::canonical_file_form(file_path);
|
|
68
67
|
let prefixes = [format!("{}::", lookup), format!("{}::", canon)];
|
|
69
|
-
let matches = |id: &str|
|
|
70
|
-
prefixes.iter().any(|p| id.starts_with(p.as_str()))
|
|
71
|
-
};
|
|
68
|
+
let matches = |id: &str| prefixes.iter().any(|p| id.starts_with(p.as_str()));
|
|
72
69
|
for (func_id, _) in projection.functions.iter() {
|
|
73
70
|
if matches(func_id) && !removed.contains(func_id) {
|
|
74
71
|
removed.insert(func_id.clone());
|
|
@@ -112,7 +112,7 @@ pub(crate) fn indexed_root() -> std::path::PathBuf {
|
|
|
112
112
|
|
|
113
113
|
/// `std::fs::canonicalize` returns verbatim paths on Windows (`\\?\D:\…`),
|
|
114
114
|
/// which defeat `starts_with`/`strip_prefix` against regular paths.
|
|
115
|
-
fn strip_verbatim_prefix(p: std::path::PathBuf) -> std::path::PathBuf {
|
|
115
|
+
pub(crate) fn strip_verbatim_prefix(p: std::path::PathBuf) -> std::path::PathBuf {
|
|
116
116
|
let s = p.to_string_lossy();
|
|
117
117
|
if let Some(rest) = s.strip_prefix(r"\\?\UNC\") {
|
|
118
118
|
return std::path::PathBuf::from(format!(r"\\{rest}"));
|
|
@@ -2039,8 +2039,8 @@ fn search_entities(
|
|
|
2039
2039
|
with_graph(|_graph, snap| {
|
|
2040
2040
|
let tokens = search_tokens(query);
|
|
2041
2041
|
let mut results: Vec<(usize, PyObject)> = Vec::new(); // (score, dict)
|
|
2042
|
-
|
|
2043
|
-
|
|
2042
|
+
// Issue 5 (schema enums): a garbage kind used to match nothing and
|
|
2043
|
+
// read as "no results". Refuse loudly like Strictness::parse.
|
|
2044
2044
|
const KNOWN_KINDS: &[&str] = &[
|
|
2045
2045
|
"function",
|
|
2046
2046
|
"class",
|
|
@@ -3529,10 +3529,7 @@ mod tests {
|
|
|
3529
3529
|
assert_eq!(unresolved_ref_kind("external::len"), "builtin");
|
|
3530
3530
|
assert_eq!(unresolved_ref_kind("external::isinstance"), "builtin");
|
|
3531
3531
|
assert_eq!(unresolved_ref_kind("external::combine"), "external");
|
|
3532
|
-
assert_eq!(
|
|
3533
|
-
unresolved_ref_kind("external::requests.get"),
|
|
3534
|
-
"external"
|
|
3535
|
-
);
|
|
3532
|
+
assert_eq!(unresolved_ref_kind("external::requests.get"), "external");
|
|
3536
3533
|
assert_eq!(unresolved_ref_kind("Date::now"), "unresolved");
|
|
3537
3534
|
assert_eq!(unresolved_ref_kind("C::run"), "unresolved");
|
|
3538
3535
|
}
|