entrygraph 0.1.22__tar.gz → 0.1.24__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.
- {entrygraph-0.1.22 → entrygraph-0.1.24}/PKG-INFO +1 -1
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/_version.py +2 -2
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/extract/rust.py +32 -2
- entrygraph-0.1.24/tests/fixtures/rust/axum_callback_app/Cargo.toml +7 -0
- entrygraph-0.1.24/tests/fixtures/rust/axum_callback_app/src/main.rs +10 -0
- entrygraph-0.1.24/tests/fixtures/rust/scoped_sink_app/Cargo.toml +4 -0
- entrygraph-0.1.24/tests/fixtures/rust/scoped_sink_app/src/main.rs +7 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_extract_rust.py +23 -1
- entrygraph-0.1.24/tests/test_rust_callbacks.py +44 -0
- entrygraph-0.1.24/tests/test_rust_scoped_sinks.py +43 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/.github/workflows/ci.yml +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/.github/workflows/release.yml +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/.gitignore +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/LICENSE +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/README.md +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/RELEASING.md +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/pyproject.toml +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/__init__.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/__main__.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/api.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/cli/__init__.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/cli/main.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/cli/render.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/data/sinks/csharp.toml +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/data/sinks/go.toml +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/data/sinks/java.toml +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/data/sinks/javascript.toml +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/data/sinks/lib_javascript.toml +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/data/sinks/lib_python.toml +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/data/sinks/php.toml +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/data/sinks/python.toml +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/data/sinks/ruby.toml +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/data/sinks/rust.toml +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/db/__init__.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/db/engine.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/db/meta.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/db/models.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/db/queries.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/detect/__init__.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/detect/entrypoints/__init__.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/detect/entrypoints/base.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/detect/entrypoints/configs.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/detect/entrypoints/csharp.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/detect/entrypoints/golang.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/detect/entrypoints/java.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/detect/entrypoints/javascript.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/detect/entrypoints/php.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/detect/entrypoints/python.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/detect/entrypoints/ruby.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/detect/entrypoints/rust.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/detect/frameworks.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/detect/manifests.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/detect/taint.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/errors.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/extract/__init__.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/extract/base.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/extract/csharp.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/extract/golang.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/extract/ir.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/extract/java.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/extract/javascript.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/extract/php.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/extract/python.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/extract/registry.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/extract/ruby.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/fs/__init__.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/fs/hashing.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/fs/lang.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/fs/walker.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/graph/__init__.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/graph/adjacency.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/graph/cte.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/graph/scoring.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/kinds.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/parsing/__init__.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/parsing/parsers.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/parsing/queries.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/pipeline/__init__.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/pipeline/scanner.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/pipeline/worker.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/pipeline/writer.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/py.typed +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/queries/csharp/calls.scm +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/queries/csharp/definitions.scm +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/queries/csharp/imports.scm +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/queries/go/calls.scm +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/queries/go/definitions.scm +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/queries/go/imports.scm +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/queries/java/calls.scm +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/queries/java/definitions.scm +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/queries/java/imports.scm +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/queries/javascript/calls.scm +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/queries/javascript/definitions.scm +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/queries/javascript/imports.scm +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/queries/php/calls.scm +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/queries/php/definitions.scm +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/queries/php/imports.scm +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/queries/python/calls.scm +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/queries/python/definitions.scm +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/queries/python/imports.scm +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/queries/ruby/calls.scm +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/queries/ruby/definitions.scm +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/queries/ruby/imports.scm +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/queries/rust/calls.scm +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/queries/rust/definitions.scm +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/queries/rust/imports.scm +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/resolve/__init__.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/resolve/externals.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/resolve/hierarchy.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/resolve/resolver.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/resolve/symbol_table.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/results.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/conftest.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/csharp/aspnet_app/Controllers/ReportsController.cs +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/csharp/aspnet_app/Program.cs +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/csharp/aspnet_app/Services/ReportService.cs +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/csharp/aspnet_app/app.csproj +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/csharp/minimalapi_app/Program.cs +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/csharp/minimalapi_app/app.csproj +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/go/gin_app/go.mod +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/go/gin_app/main.go +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/go/gin_app/service.go +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/go/nethttp_app/go.mod +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/go/nethttp_app/main.go +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/java/spring_app/pom.xml +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/java/spring_app/src/main/java/com/example/Application.java +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/java/spring_app/src/main/java/com/example/ReportRunner.java +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/java/spring_app/src/main/java/com/example/ReportService.java +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/java/spring_app/src/main/java/com/example/UserController.java +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/javascript/commonjs_app/server.js +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/javascript/express_app/package.json +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/javascript/express_app/src/routes.js +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/javascript/express_app/src/services.js +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/php/laravel_app/app/Http/Controllers/ReportController.php +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/php/laravel_app/artisan +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/php/laravel_app/composer.json +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/php/laravel_app/routes/web.php +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/python/chained_sinks/app.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/python/flask_app/app/__init__.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/python/flask_app/app/db.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/python/flask_app/app/routes.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/python/flask_app/app/services.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/python/flask_app/cli.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/python/flask_app/requirements.txt +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/python/fuzzy_sink/app.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/python/heal_fidelity/caller.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/python/heal_fidelity/worker.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/python/may_continue/app.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/python/sanitizer/app.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/python/taint_source/handler.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/ruby/sinatra_app/Gemfile +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/ruby/sinatra_app/app.rb +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/ruby/sinatra_app/services/runner.rb +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/rust/axum_app/Cargo.toml +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/rust/axum_app/src/handlers.rs +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/rust/axum_app/src/main.rs +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_api.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_cli.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_commonjs.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_csharp_callbacks.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_cte_bounds.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_engine_pragmas.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_entrypoint_expansion.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_entrypoints.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_extract_csharp.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_extract_go.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_extract_java.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_extract_javascript.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_extract_php.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_extract_python.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_extract_ruby.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_frameworks.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_fuzzy_sink.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_go_callbacks.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_hardening.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_heal_fidelity.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_incremental.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_indexer.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_lang.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_manifests.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_may_continue.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_models.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_pool.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_reachability.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_registry_cache.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_render.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_resolver.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_scoring.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_sink_catalog.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_taint.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_taint_sanitizers.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_taint_sources.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_walker.py +0 -0
- {entrygraph-0.1.22 → entrygraph-0.1.24}/uv.lock +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: entrygraph
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.24
|
|
4
4
|
Summary: Language-agnostic code graph: query symbols, entrypoints, and source-to-sink call paths from a SQLite index
|
|
5
5
|
Project-URL: Repository, https://github.com/brettbergin/entrygraph
|
|
6
6
|
Author-email: Brett Bergin <brettberginbc@yahoo.com>
|
|
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
|
|
|
18
18
|
commit_id: str | None
|
|
19
19
|
__commit_id__: str | None
|
|
20
20
|
|
|
21
|
-
__version__ = version = '0.1.
|
|
22
|
-
__version_tuple__ = version_tuple = (0, 1,
|
|
21
|
+
__version__ = version = '0.1.24'
|
|
22
|
+
__version_tuple__ = version_tuple = (0, 1, 24)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -322,10 +322,17 @@ class RustExtractor:
|
|
|
322
322
|
callee_text = callee_name = node_text(fn)
|
|
323
323
|
receiver = None
|
|
324
324
|
elif fn.type == "scoped_identifier":
|
|
325
|
+
# A `::`-scoped call (`std::process::Command::new`) is a fully
|
|
326
|
+
# qualified path, not a method on an unknown-typed value. Leave the
|
|
327
|
+
# receiver unset so the resolver keeps the whole path
|
|
328
|
+
# (`rs:std.process.Command.new`) instead of collapsing it to
|
|
329
|
+
# `rs:*.new`, which no sink pattern matches. Rust `Type::new`
|
|
330
|
+
# associated functions are METHODs, so an unset receiver can't
|
|
331
|
+
# fuzzy-bind them by name either.
|
|
325
332
|
text = _norm(node_text(fn))
|
|
326
333
|
callee_text = text
|
|
327
334
|
callee_name = text.rsplit(".", 1)[-1]
|
|
328
|
-
receiver =
|
|
335
|
+
receiver = None
|
|
329
336
|
elif fn.type == "field_expression":
|
|
330
337
|
field = fn.child_by_field_name("field")
|
|
331
338
|
value = fn.child_by_field_name("value")
|
|
@@ -336,6 +343,7 @@ class RustExtractor:
|
|
|
336
343
|
callee_text = f"{receiver}.{callee_name}" if receiver else callee_name
|
|
337
344
|
else:
|
|
338
345
|
continue
|
|
346
|
+
caller = self._caller(node, ctx)
|
|
339
347
|
out.references.append(
|
|
340
348
|
RawReference(
|
|
341
349
|
kind="call",
|
|
@@ -343,11 +351,12 @@ class RustExtractor:
|
|
|
343
351
|
callee_name=callee_name,
|
|
344
352
|
receiver_text=receiver,
|
|
345
353
|
span=span_of(node),
|
|
346
|
-
caller_qualified_name=
|
|
354
|
+
caller_qualified_name=caller,
|
|
347
355
|
arg_count=len(args.named_children) if args is not None else 0,
|
|
348
356
|
arg_preview=truncate(node_text(args)) if args is not None else None,
|
|
349
357
|
)
|
|
350
358
|
)
|
|
359
|
+
self._emit_callbacks(args, caller, out)
|
|
351
360
|
|
|
352
361
|
for node in caps.get("macro", []):
|
|
353
362
|
path_node = node.child_by_field_name("macro")
|
|
@@ -379,6 +388,27 @@ class RustExtractor:
|
|
|
379
388
|
)
|
|
380
389
|
)
|
|
381
390
|
|
|
391
|
+
def _emit_callbacks(self, args: Node | None, caller: str | None, out: FileExtraction) -> None:
|
|
392
|
+
"""Bare-identifier arguments passed to a call — a function value invoked
|
|
393
|
+
later, e.g. ``axum::routing::post(handler)``. Resolution keeps only those
|
|
394
|
+
binding to a project function, so a plain data value is a no-op edge."""
|
|
395
|
+
if args is None:
|
|
396
|
+
return
|
|
397
|
+
for arg in args.named_children:
|
|
398
|
+
if arg.type != "identifier":
|
|
399
|
+
continue
|
|
400
|
+
name = node_text(arg)
|
|
401
|
+
out.references.append(
|
|
402
|
+
RawReference(
|
|
403
|
+
kind="callback",
|
|
404
|
+
callee_text=name,
|
|
405
|
+
callee_name=name,
|
|
406
|
+
receiver_text=None,
|
|
407
|
+
span=span_of(arg),
|
|
408
|
+
caller_qualified_name=caller,
|
|
409
|
+
)
|
|
410
|
+
)
|
|
411
|
+
|
|
382
412
|
# ---------------- attributes (decorators) ----------------
|
|
383
413
|
|
|
384
414
|
def _attribute_nodes(self, node: Node) -> list[Node]:
|
|
@@ -172,10 +172,32 @@ fn run(cmd: &str) {
|
|
|
172
172
|
calls = {r.callee_text: r for r in x.references if r.kind == "call"}
|
|
173
173
|
cmd = calls["Command.new"]
|
|
174
174
|
assert cmd.callee_name == "new"
|
|
175
|
-
|
|
175
|
+
# a `::`-scoped call is a qualified path, not a value.method — the receiver is
|
|
176
|
+
# left unset so the resolver keeps the full path (rs:Command.new / the imported
|
|
177
|
+
# rs:std.process.Command.new) rather than collapsing to rs:*.new.
|
|
178
|
+
assert cmd.receiver_text is None
|
|
176
179
|
assert cmd.caller_qualified_name == "handlers.run"
|
|
177
180
|
|
|
178
181
|
|
|
182
|
+
def test_function_value_argument_is_a_callback():
|
|
183
|
+
# post(handler) passes `handler` as a value; it must be a callback so the
|
|
184
|
+
# handler is reachable from the route registration.
|
|
185
|
+
x = extract(
|
|
186
|
+
"""
|
|
187
|
+
fn register(app: Router) {
|
|
188
|
+
app.route("/run", post(handler));
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
async fn handler() {}
|
|
192
|
+
"""
|
|
193
|
+
)
|
|
194
|
+
callbacks = {r.callee_name: r for r in x.references if r.kind == "callback"}
|
|
195
|
+
assert "handler" in callbacks
|
|
196
|
+
assert callbacks["handler"].caller_qualified_name == "_root.register"
|
|
197
|
+
# string literal arg is not a callback
|
|
198
|
+
assert "/run" not in callbacks
|
|
199
|
+
|
|
200
|
+
|
|
179
201
|
def test_partial_tree_still_extracts():
|
|
180
202
|
x = extract("fn good() {}\n\nfn broken( {\n", path="src/lib.rs")
|
|
181
203
|
assert not x.parse_ok
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"""End-to-end: Rust function-value callbacks connect handlers to their route
|
|
2
|
+
registration (Phase 4).
|
|
3
|
+
|
|
4
|
+
Regression: the Rust extractor emitted no callback references, so a handler passed
|
|
5
|
+
to `post(handler)` had no inbound edge and was unreachable in the call graph.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
|
|
12
|
+
import pytest
|
|
13
|
+
|
|
14
|
+
from entrygraph import CodeGraph
|
|
15
|
+
|
|
16
|
+
AXUM_APP = Path(__file__).parent / "fixtures" / "rust" / "axum_callback_app"
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@pytest.fixture(scope="module")
|
|
20
|
+
def graph(tmp_path_factory) -> CodeGraph:
|
|
21
|
+
db = tmp_path_factory.mktemp("db") / "graph.db"
|
|
22
|
+
g = CodeGraph.index(AXUM_APP, db=db)
|
|
23
|
+
yield g
|
|
24
|
+
g.close()
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def test_callback_edge_created(graph):
|
|
28
|
+
rows = graph.sql(
|
|
29
|
+
"SELECT src.qname AS src, e.dst_qname AS dst FROM edges e "
|
|
30
|
+
"JOIN symbols src ON e.src_symbol_id = src.id WHERE e.kind = 'callback'"
|
|
31
|
+
)
|
|
32
|
+
pairs = {(r["src"], r["dst"]) for r in rows}
|
|
33
|
+
assert ("_root.register", "_root.handler") in pairs
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def test_handler_reachable_only_with_callbacks(graph):
|
|
37
|
+
# the callback edge is what makes the handler (and the command_exec sink in its
|
|
38
|
+
# body) reachable from the route registration site
|
|
39
|
+
kw = {"source": "_root.register", "sink_category": "command_exec", "include_unresolved": True}
|
|
40
|
+
assert graph.paths(**kw) == []
|
|
41
|
+
withcb = graph.paths(**kw, include_callbacks=True)
|
|
42
|
+
assert withcb
|
|
43
|
+
assert "_root.handler" in [s.qname for s in withcb[0].symbols]
|
|
44
|
+
assert withcb[0].symbols[-1].qname == "rs:std.process.Command.new"
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"""Fully-scoped Rust calls stamp their sink (Phase 4 follow-up).
|
|
2
|
+
|
|
3
|
+
Regression: a `::`-scoped call like `std::process::Command::new(...)` resolved to
|
|
4
|
+
`rs:*.new` (receiver collapsed to a `*.name` guess), so the command_exec sink
|
|
5
|
+
pattern `rs:{std.process.Command.new,...}` never matched. Scoped paths are now
|
|
6
|
+
kept whole, so the sink stamps.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
|
|
13
|
+
import pytest
|
|
14
|
+
|
|
15
|
+
from entrygraph import CodeGraph
|
|
16
|
+
|
|
17
|
+
SCOPED_SINK_APP = Path(__file__).parent / "fixtures" / "rust" / "scoped_sink_app"
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
@pytest.fixture(scope="module")
|
|
21
|
+
def graph(tmp_path_factory) -> CodeGraph:
|
|
22
|
+
db = tmp_path_factory.mktemp("db") / "graph.db"
|
|
23
|
+
g = CodeGraph.index(SCOPED_SINK_APP, db=db)
|
|
24
|
+
yield g
|
|
25
|
+
g.close()
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def test_scoped_command_sink_stamped(graph):
|
|
29
|
+
sinks = {
|
|
30
|
+
r["dst_qname"]: r["sink_id"]
|
|
31
|
+
for r in graph.sql("SELECT dst_qname, sink_id FROM edges WHERE sink_id IS NOT NULL")
|
|
32
|
+
}
|
|
33
|
+
assert sinks.get("rs:std.process.Command.new") == "rust.command-exec"
|
|
34
|
+
assert sinks.get("rs:std.fs.read") == "rust.path-traversal"
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def test_scoped_command_sink_reachable(graph):
|
|
38
|
+
# the sink is an external guess (UNRESOLVED tier), so opt into it
|
|
39
|
+
paths = graph.paths(
|
|
40
|
+
source="_root.run_inline", sink_category="command_exec", include_unresolved=True
|
|
41
|
+
)
|
|
42
|
+
assert paths
|
|
43
|
+
assert paths[0].symbols[-1].qname == "rs:std.process.Command.new"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/csharp/aspnet_app/Services/ReportService.cs
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/javascript/express_app/src/services.js
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|