entrygraph 0.1.28__tar.gz → 0.1.30__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.28 → entrygraph-0.1.30}/PKG-INFO +1 -1
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/_version.py +2 -2
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/cli/main.py +5 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/pipeline/scanner.py +20 -4
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/resolve/resolver.py +10 -1
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_cli.py +14 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_incremental.py +31 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/.github/workflows/ci.yml +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/.github/workflows/release.yml +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/.gitignore +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/LICENSE +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/README.md +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/RELEASING.md +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/pyproject.toml +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/__init__.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/__main__.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/api.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/cli/__init__.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/cli/render.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/data/sinks/csharp.toml +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/data/sinks/go.toml +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/data/sinks/java.toml +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/data/sinks/javascript.toml +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/data/sinks/lib_javascript.toml +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/data/sinks/lib_python.toml +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/data/sinks/php.toml +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/data/sinks/python.toml +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/data/sinks/ruby.toml +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/data/sinks/rust.toml +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/db/__init__.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/db/engine.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/db/meta.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/db/models.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/db/queries.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/detect/__init__.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/detect/entrypoints/__init__.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/detect/entrypoints/base.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/detect/entrypoints/configs.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/detect/entrypoints/csharp.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/detect/entrypoints/golang.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/detect/entrypoints/java.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/detect/entrypoints/javascript.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/detect/entrypoints/php.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/detect/entrypoints/python.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/detect/entrypoints/ruby.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/detect/entrypoints/rust.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/detect/frameworks.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/detect/manifests.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/detect/taint.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/errors.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/extract/__init__.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/extract/base.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/extract/csharp.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/extract/golang.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/extract/ir.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/extract/java.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/extract/javascript.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/extract/php.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/extract/python.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/extract/registry.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/extract/ruby.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/extract/rust.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/fs/__init__.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/fs/hashing.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/fs/lang.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/fs/walker.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/graph/__init__.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/graph/adjacency.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/graph/cte.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/graph/scoring.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/kinds.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/parsing/__init__.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/parsing/parsers.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/parsing/queries.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/pipeline/__init__.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/pipeline/worker.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/pipeline/writer.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/py.typed +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/queries/csharp/calls.scm +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/queries/csharp/definitions.scm +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/queries/csharp/imports.scm +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/queries/go/calls.scm +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/queries/go/definitions.scm +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/queries/go/imports.scm +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/queries/java/calls.scm +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/queries/java/definitions.scm +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/queries/java/imports.scm +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/queries/javascript/calls.scm +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/queries/javascript/definitions.scm +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/queries/javascript/imports.scm +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/queries/php/calls.scm +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/queries/php/definitions.scm +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/queries/php/imports.scm +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/queries/python/calls.scm +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/queries/python/definitions.scm +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/queries/python/imports.scm +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/queries/ruby/calls.scm +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/queries/ruby/definitions.scm +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/queries/ruby/imports.scm +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/queries/rust/calls.scm +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/queries/rust/definitions.scm +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/queries/rust/imports.scm +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/resolve/__init__.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/resolve/externals.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/resolve/hierarchy.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/resolve/symbol_table.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/results.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/conftest.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/csharp/aspnet_app/Controllers/ReportsController.cs +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/csharp/aspnet_app/Program.cs +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/csharp/aspnet_app/Services/ReportService.cs +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/csharp/aspnet_app/app.csproj +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/csharp/minimalapi_app/Program.cs +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/csharp/minimalapi_app/app.csproj +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/go/gin_app/go.mod +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/go/gin_app/main.go +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/go/gin_app/service.go +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/go/nethttp_app/go.mod +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/go/nethttp_app/main.go +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/java/methodref_app/pom.xml +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/java/methodref_app/src/main/java/com/example/App.java +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/java/spring_app/pom.xml +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/java/spring_app/src/main/java/com/example/Application.java +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/java/spring_app/src/main/java/com/example/ReportRunner.java +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/java/spring_app/src/main/java/com/example/ReportService.java +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/java/spring_app/src/main/java/com/example/UserController.java +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/javascript/commonjs_app/server.js +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/javascript/express_app/package.json +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/javascript/express_app/src/routes.js +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/javascript/express_app/src/services.js +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/php/laravel_app/app/Http/Controllers/ReportController.php +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/php/laravel_app/artisan +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/php/laravel_app/composer.json +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/php/laravel_app/routes/web.php +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/python/chained_sinks/app.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/python/flask_app/app/__init__.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/python/flask_app/app/db.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/python/flask_app/app/routes.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/python/flask_app/app/services.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/python/flask_app/cli.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/python/flask_app/requirements.txt +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/python/fuzzy_sink/app.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/python/heal_fidelity/caller.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/python/heal_fidelity/worker.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/python/may_continue/app.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/python/sanitizer/app.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/python/taint_source/handler.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/ruby/sinatra_app/Gemfile +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/ruby/sinatra_app/app.rb +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/ruby/sinatra_app/services/runner.rb +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/rust/axum_app/Cargo.toml +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/rust/axum_app/src/handlers.rs +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/rust/axum_app/src/main.rs +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/rust/axum_callback_app/Cargo.toml +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/rust/axum_callback_app/src/main.rs +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/rust/scoped_sink_app/Cargo.toml +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/rust/scoped_sink_app/src/main.rs +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_api.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_commonjs.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_csharp_callbacks.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_cte_bounds.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_engine_pragmas.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_entrypoint_expansion.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_entrypoints.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_extract_csharp.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_extract_go.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_extract_java.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_extract_javascript.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_extract_php.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_extract_python.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_extract_ruby.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_extract_rust.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_frameworks.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_fuzzy_sink.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_go_callbacks.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_hardening.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_heal_fidelity.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_indexer.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_java_callbacks.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_lang.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_manifests.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_may_continue.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_models.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_pool.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_reachability.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_registry_cache.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_render.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_resolver.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_rust_callbacks.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_rust_scoped_sinks.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_sanitizer_languages.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_scoring.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_sink_catalog.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_taint.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_taint_sanitizers.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_taint_sources.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_walker.py +0 -0
- {entrygraph-0.1.28 → entrygraph-0.1.30}/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.30
|
|
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.30'
|
|
22
|
+
__version_tuple__ = version_tuple = (0, 1, 30)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -264,6 +264,11 @@ def _path_tree(index: int, path) -> Tree:
|
|
|
264
264
|
def cmd_paths(args) -> int:
|
|
265
265
|
if not args.source and not args.source_category:
|
|
266
266
|
raise EntrygraphError("provide --source and/or --source-category")
|
|
267
|
+
# A missing sink would leave the sink set empty and print "no paths found",
|
|
268
|
+
# which reads like a clean result — require an explicit sink so an incomplete
|
|
269
|
+
# query can't be mistaken for "no reachable sinks".
|
|
270
|
+
if not args.sink and not args.sink_category:
|
|
271
|
+
raise EntrygraphError("provide --sink and/or --sink-category")
|
|
267
272
|
with _open(args) as graph:
|
|
268
273
|
paths = graph.paths(
|
|
269
274
|
source=args.source,
|
|
@@ -491,13 +491,23 @@ def _write_symbols(session, extractions, file_id_by_path, alloc, table):
|
|
|
491
491
|
"is_exported": raw.is_exported,
|
|
492
492
|
}
|
|
493
493
|
)
|
|
494
|
+
# file id -> that file's module symbol id, so a top-level symbol is parented to
|
|
495
|
+
# ITS OWN module. When several files share a package/module_path (every
|
|
496
|
+
# multi-file Go package), `module_symbol_ids` keeps only the last file's module
|
|
497
|
+
# id; parenting siblings to it means wiping one file cascade-deletes the others'
|
|
498
|
+
# symbols (parent_id FK is ondelete=CASCADE). This was the incremental-reindex
|
|
499
|
+
# data loss in #41 (F-H11).
|
|
500
|
+
module_id_by_file_id = {file_id_by_path[p]: mid for p, mid in module_ids.items()}
|
|
494
501
|
for row in symbol_rows:
|
|
495
502
|
qname = row["qname"]
|
|
496
503
|
if row["kind"] is not SymbolKind.MODULE and "." in qname:
|
|
497
504
|
parent_q = qname.rsplit(".", 1)[0]
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
505
|
+
parent = symbol_id_by_qname.get(parent_q)
|
|
506
|
+
if parent is None: # parent is the module itself, not a project symbol
|
|
507
|
+
parent = module_id_by_file_id.get(row["file_id"]) or table.module_symbol_ids.get(
|
|
508
|
+
parent_q
|
|
509
|
+
)
|
|
510
|
+
row["parent_id"] = parent
|
|
501
511
|
# A row's parent has one fewer qname segment, so inserting shallowest-first
|
|
502
512
|
# guarantees the self-referential parent_id FK is satisfied within the batch.
|
|
503
513
|
symbol_rows.sort(key=lambda r: r["qname"].count("."))
|
|
@@ -535,7 +545,13 @@ def _write_edges_and_entrypoints(
|
|
|
535
545
|
|
|
536
546
|
for path, x, is_package in extractions:
|
|
537
547
|
resolver = FileResolver(
|
|
538
|
-
x,
|
|
548
|
+
x,
|
|
549
|
+
module_ids[path],
|
|
550
|
+
table,
|
|
551
|
+
externals,
|
|
552
|
+
is_package,
|
|
553
|
+
sink_registry=sink_registry,
|
|
554
|
+
local_symbol_ids=handler_ids_by_path.get(path, {}),
|
|
539
555
|
)
|
|
540
556
|
file_id = file_id_by_path[path]
|
|
541
557
|
for edge in resolver.resolve():
|
|
@@ -71,6 +71,7 @@ class FileResolver:
|
|
|
71
71
|
externals: ExternalRegistry,
|
|
72
72
|
is_package: bool = False,
|
|
73
73
|
sink_registry: SinkRegistry | None = None,
|
|
74
|
+
local_symbol_ids: dict[str, int] | None = None,
|
|
74
75
|
) -> None:
|
|
75
76
|
self.x = extraction
|
|
76
77
|
self.module_symbol_id = module_symbol_id
|
|
@@ -78,6 +79,11 @@ class FileResolver:
|
|
|
78
79
|
self.externals = externals
|
|
79
80
|
self.is_package = is_package
|
|
80
81
|
self.sink_registry = sink_registry
|
|
82
|
+
# This file's own qname -> id. The caller of every reference lives in this
|
|
83
|
+
# file, so an edge's source must resolve here first — resolving it through
|
|
84
|
+
# the global (last-wins) table would attribute a.go's edge to a same-named
|
|
85
|
+
# symbol in b.go, and wiping b.go would then cascade-delete a.go's edge.
|
|
86
|
+
self.local_symbol_ids = local_symbol_ids or {}
|
|
81
87
|
self.prefix = LANG_PREFIX.get(extraction.language, extraction.language)
|
|
82
88
|
self.import_map, self.wildcard_modules = build_import_map(extraction, is_package)
|
|
83
89
|
|
|
@@ -166,7 +172,10 @@ class FileResolver:
|
|
|
166
172
|
return edges
|
|
167
173
|
|
|
168
174
|
def _resolve_reference(self, ref: RawReference) -> ResolvedEdge | None:
|
|
169
|
-
|
|
175
|
+
caller_q = ref.caller_qualified_name or ""
|
|
176
|
+
src_id = self.local_symbol_ids.get(caller_q) or self.table.by_fqn.get(
|
|
177
|
+
caller_q, self.module_symbol_id
|
|
178
|
+
)
|
|
170
179
|
kind = _REF_EDGE_KIND.get(ref.kind, EdgeKind.REFERENCES)
|
|
171
180
|
|
|
172
181
|
if ref.kind == "callback":
|
|
@@ -62,6 +62,20 @@ def test_paths_exit_codes(db, capsys):
|
|
|
62
62
|
assert rc == 1
|
|
63
63
|
|
|
64
64
|
|
|
65
|
+
def test_paths_requires_a_sink(db, capsys):
|
|
66
|
+
# A query with a source but no sink would silently print "no paths found",
|
|
67
|
+
# which reads like a clean result — it must error instead.
|
|
68
|
+
rc = main(["paths", "--db", db, "--source", "*"])
|
|
69
|
+
assert rc == 2
|
|
70
|
+
assert "provide --sink" in capsys.readouterr().err
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def test_paths_requires_a_source(db, capsys):
|
|
74
|
+
rc = main(["paths", "--db", db, "--sink-category", "command_exec"])
|
|
75
|
+
assert rc == 2
|
|
76
|
+
assert "provide --source" in capsys.readouterr().err
|
|
77
|
+
|
|
78
|
+
|
|
65
79
|
def test_paths_by_category(db, capsys):
|
|
66
80
|
rc = main(
|
|
67
81
|
[
|
|
@@ -215,3 +215,34 @@ def test_parallel_matches_sequential(repo, tmp_path):
|
|
|
215
215
|
scanner._PARALLEL_THRESHOLD = original
|
|
216
216
|
seq.dispose()
|
|
217
217
|
par.dispose()
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
def test_reindex_shared_package_file_matches_full(tmp_path):
|
|
221
|
+
# Two files in the same Go package share a module_path and both define
|
|
222
|
+
# `func init()`. Re-indexing one file must not cascade-delete the other file's
|
|
223
|
+
# symbols/edges (parent_id and edge.src_symbol_id FKs are ondelete=CASCADE, and
|
|
224
|
+
# both were bound to the last-written colliding symbol). Regression for #41 F-H11.
|
|
225
|
+
repo = tmp_path / "gomod"
|
|
226
|
+
(repo / "middleware").mkdir(parents=True)
|
|
227
|
+
(repo / "middleware" / "a.go").write_text(
|
|
228
|
+
'package middleware\nimport "fmt"\nfunc init() { doThing() }\n'
|
|
229
|
+
'func doThing() { fmt.Println("a") }\n'
|
|
230
|
+
)
|
|
231
|
+
terminal = repo / "middleware" / "terminal.go"
|
|
232
|
+
terminal.write_text(
|
|
233
|
+
'package middleware\nimport "fmt"\nfunc init() { other() }\n'
|
|
234
|
+
'func other() { fmt.Println("b") }\n'
|
|
235
|
+
)
|
|
236
|
+
engine = make_engine(tmp_path / "inc.db")
|
|
237
|
+
index_repository(repo, engine)
|
|
238
|
+
|
|
239
|
+
terminal.write_text(terminal.read_text() + "\n// touch\n")
|
|
240
|
+
stats = index_repository(repo, engine, incremental=True)
|
|
241
|
+
assert stats.files_indexed == 1 # only terminal.go reparsed
|
|
242
|
+
incremental = _graph_snapshot(engine)
|
|
243
|
+
engine.dispose()
|
|
244
|
+
|
|
245
|
+
assert incremental == _full_reindex_snapshot(repo, tmp_path)
|
|
246
|
+
# the sibling file's symbols/edges survive the re-index
|
|
247
|
+
syms = {q for q, _ in incremental[0]}
|
|
248
|
+
assert {"middleware.doThing", "middleware.other"} <= syms
|
|
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.28 → entrygraph-0.1.30}/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
|
|
File without changes
|
|
File without changes
|
{entrygraph-0.1.28 → entrygraph-0.1.30}/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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|