entrygraph 0.1.44__tar.gz → 0.1.46__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.44 → entrygraph-0.1.46}/PKG-INFO +1 -1
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/_version.py +2 -2
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/detect/entrypoints/php.py +39 -2
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/detect/entrypoints/rust.py +32 -2
- entrygraph-0.1.46/tests/test_entrypoints_php.py +66 -0
- entrygraph-0.1.46/tests/test_entrypoints_rust.py +53 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/.github/workflows/ci.yml +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/.github/workflows/release.yml +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/.gitignore +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/LICENSE +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/README.md +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/RELEASING.md +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/pyproject.toml +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/__init__.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/__main__.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/api.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/cli/__init__.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/cli/main.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/cli/render.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/data/sinks/csharp.toml +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/data/sinks/go.toml +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/data/sinks/java.toml +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/data/sinks/javascript.toml +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/data/sinks/lib_javascript.toml +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/data/sinks/lib_python.toml +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/data/sinks/php.toml +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/data/sinks/python.toml +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/data/sinks/ruby.toml +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/data/sinks/rust.toml +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/db/__init__.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/db/engine.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/db/meta.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/db/models.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/db/queries.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/detect/__init__.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/detect/entrypoints/__init__.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/detect/entrypoints/base.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/detect/entrypoints/configs.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/detect/entrypoints/csharp.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/detect/entrypoints/golang.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/detect/entrypoints/java.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/detect/entrypoints/javascript.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/detect/entrypoints/python.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/detect/entrypoints/ruby.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/detect/frameworks.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/detect/manifests.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/detect/taint.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/errors.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/extract/__init__.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/extract/base.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/extract/csharp.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/extract/golang.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/extract/ir.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/extract/java.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/extract/javascript.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/extract/php.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/extract/python.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/extract/registry.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/extract/ruby.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/extract/rust.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/fs/__init__.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/fs/hashing.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/fs/lang.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/fs/walker.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/graph/__init__.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/graph/adjacency.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/graph/cte.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/graph/scoring.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/kinds.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/parsing/__init__.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/parsing/parsers.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/parsing/queries.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/pipeline/__init__.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/pipeline/scanner.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/pipeline/worker.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/pipeline/writer.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/py.typed +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/queries/csharp/calls.scm +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/queries/csharp/definitions.scm +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/queries/csharp/imports.scm +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/queries/go/calls.scm +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/queries/go/definitions.scm +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/queries/go/imports.scm +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/queries/java/calls.scm +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/queries/java/definitions.scm +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/queries/java/imports.scm +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/queries/javascript/calls.scm +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/queries/javascript/definitions.scm +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/queries/javascript/imports.scm +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/queries/php/calls.scm +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/queries/php/definitions.scm +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/queries/php/imports.scm +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/queries/python/calls.scm +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/queries/python/definitions.scm +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/queries/python/imports.scm +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/queries/ruby/calls.scm +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/queries/ruby/definitions.scm +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/queries/ruby/imports.scm +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/queries/rust/calls.scm +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/queries/rust/definitions.scm +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/queries/rust/imports.scm +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/resolve/__init__.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/resolve/externals.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/resolve/hierarchy.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/resolve/resolver.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/resolve/symbol_table.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/src/entrygraph/results.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/conftest.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/fixtures/csharp/aspnet_app/Controllers/ReportsController.cs +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/fixtures/csharp/aspnet_app/Program.cs +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/fixtures/csharp/aspnet_app/Services/ReportService.cs +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/fixtures/csharp/aspnet_app/app.csproj +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/fixtures/csharp/minimalapi_app/Program.cs +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/fixtures/csharp/minimalapi_app/app.csproj +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/fixtures/go/gin_app/go.mod +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/fixtures/go/gin_app/main.go +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/fixtures/go/gin_app/service.go +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/fixtures/go/nethttp_app/go.mod +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/fixtures/go/nethttp_app/main.go +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/fixtures/java/methodref_app/pom.xml +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/fixtures/java/methodref_app/src/main/java/com/example/App.java +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/fixtures/java/spring_app/pom.xml +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/fixtures/java/spring_app/src/main/java/com/example/Application.java +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/fixtures/java/spring_app/src/main/java/com/example/ReportRunner.java +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/fixtures/java/spring_app/src/main/java/com/example/ReportService.java +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/fixtures/java/spring_app/src/main/java/com/example/UserController.java +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/fixtures/javascript/commonjs_app/server.js +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/fixtures/javascript/express_app/package.json +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/fixtures/javascript/express_app/src/routes.js +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/fixtures/javascript/express_app/src/services.js +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/fixtures/php/laravel_app/app/Http/Controllers/ReportController.php +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/fixtures/php/laravel_app/artisan +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/fixtures/php/laravel_app/composer.json +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/fixtures/php/laravel_app/routes/web.php +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/fixtures/python/chained_sinks/app.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/fixtures/python/flask_app/app/__init__.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/fixtures/python/flask_app/app/db.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/fixtures/python/flask_app/app/routes.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/fixtures/python/flask_app/app/services.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/fixtures/python/flask_app/cli.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/fixtures/python/flask_app/requirements.txt +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/fixtures/python/fuzzy_sink/app.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/fixtures/python/heal_fidelity/caller.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/fixtures/python/heal_fidelity/worker.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/fixtures/python/may_continue/app.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/fixtures/python/sanitizer/app.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/fixtures/python/taint_source/handler.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/fixtures/ruby/sinatra_app/Gemfile +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/fixtures/ruby/sinatra_app/app.rb +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/fixtures/ruby/sinatra_app/services/runner.rb +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/fixtures/rust/axum_app/Cargo.toml +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/fixtures/rust/axum_app/src/handlers.rs +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/fixtures/rust/axum_app/src/main.rs +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/fixtures/rust/axum_callback_app/Cargo.toml +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/fixtures/rust/axum_callback_app/src/main.rs +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/fixtures/rust/scoped_sink_app/Cargo.toml +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/fixtures/rust/scoped_sink_app/src/main.rs +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/test_api.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/test_cli.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/test_commonjs.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/test_csharp_callbacks.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/test_cte_bounds.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/test_engine_pragmas.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/test_entrypoint_expansion.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/test_entrypoints.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/test_entrypoints_go.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/test_entrypoints_javascript.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/test_entrypoints_ruby.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/test_extract_csharp.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/test_extract_go.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/test_extract_java.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/test_extract_javascript.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/test_extract_php.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/test_extract_python.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/test_extract_ruby.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/test_extract_rust.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/test_frameworks.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/test_fuzzy_sink.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/test_go_callbacks.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/test_hardening.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/test_heal_fidelity.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/test_incremental.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/test_indexer.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/test_java_callbacks.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/test_lang.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/test_manifests.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/test_may_continue.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/test_models.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/test_pool.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/test_reachability.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/test_registry_cache.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/test_render.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/test_resolver.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/test_rust_callbacks.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/test_rust_scoped_sinks.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/test_sanitizer_languages.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/test_scoring.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/test_sink_catalog.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/test_taint.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/test_taint_sanitizers.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/test_taint_sources.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/tests/test_walker.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.46}/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.46
|
|
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.46'
|
|
22
|
+
__version_tuple__ = version_tuple = (0, 1, 46)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -14,6 +14,7 @@ import re
|
|
|
14
14
|
|
|
15
15
|
from entrygraph.detect.entrypoints.base import (
|
|
16
16
|
EntrypointRule,
|
|
17
|
+
compose_route,
|
|
17
18
|
first_string_arg,
|
|
18
19
|
register,
|
|
19
20
|
)
|
|
@@ -23,6 +24,12 @@ from entrygraph.kinds import EntrypointKind, SymbolKind
|
|
|
23
24
|
_LARAVEL_VERBS = frozenset({"get", "post", "put", "delete", "patch", "any", "match"})
|
|
24
25
|
_LARAVEL_RESOURCE = frozenset({"resource", "apiResource"})
|
|
25
26
|
_SYMFONY_ROUTE = re.compile(r"#\[\s*Route\s*\(")
|
|
27
|
+
# Symfony route paths can be positional (`#[Route('/x')]`) or the `path:` named arg
|
|
28
|
+
# (`#[Route(path: '/x')]`); methods live in `methods: ['GET', 'POST']` (or a bare
|
|
29
|
+
# string). `first_string_arg` covers the positional case.
|
|
30
|
+
_SYMFONY_PATH_KW = re.compile(r"""path\s*:\s*['"]([^'"]+)['"]""")
|
|
31
|
+
_SYMFONY_METHODS = re.compile(r"""methods\s*:\s*(?:\[([^\]]*)\]|['"]([^'"]+)['"])""")
|
|
32
|
+
_QUOTED_RE = re.compile(r"""['"]([^'"]+)['"]""")
|
|
26
33
|
_WORDPRESS_HOOKS = frozenset({"add_action", "add_filter"})
|
|
27
34
|
# register_rest_route($namespace, $route, ...). Anchor to the first two positional
|
|
28
35
|
# args: arg 1 is the namespace (a literal like 'wp/v2' or a variable such as
|
|
@@ -160,20 +167,50 @@ def _laravel_routes(x: FileExtraction) -> list[EntrypointHint]:
|
|
|
160
167
|
return hints
|
|
161
168
|
|
|
162
169
|
|
|
170
|
+
def _symfony_path(decorator: str) -> str | None:
|
|
171
|
+
"""The route path from a `#[Route(...)]` attribute: the `path:` named arg if
|
|
172
|
+
present, else the first positional string."""
|
|
173
|
+
m = _SYMFONY_PATH_KW.search(decorator)
|
|
174
|
+
return m.group(1) if m else first_string_arg(decorator)
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
def _symfony_methods(decorator: str) -> list[str]:
|
|
178
|
+
"""HTTP verbs from `methods: ['GET', 'POST']` / `methods: 'GET'`; empty if the
|
|
179
|
+
attribute omits `methods` (Symfony then allows all verbs)."""
|
|
180
|
+
m = _SYMFONY_METHODS.search(decorator)
|
|
181
|
+
if not m:
|
|
182
|
+
return []
|
|
183
|
+
body = m.group(1) if m.group(1) is not None else m.group(2)
|
|
184
|
+
verbs = [q.upper() for q in _QUOTED_RE.findall(body)]
|
|
185
|
+
if not verbs and body.strip(): # unquoted single value
|
|
186
|
+
verbs = [body.strip().upper()]
|
|
187
|
+
return verbs
|
|
188
|
+
|
|
189
|
+
|
|
163
190
|
def _symfony_routes(x: FileExtraction) -> list[EntrypointHint]:
|
|
191
|
+
# class qname -> class-level #[Route(...)] path prefix (composed onto each
|
|
192
|
+
# method route, mirroring @Controller in NestJS and @RequestMapping in Spring).
|
|
193
|
+
prefixes: dict[str, str] = {}
|
|
194
|
+
for symbol in x.symbols:
|
|
195
|
+
if symbol.kind is SymbolKind.CLASS:
|
|
196
|
+
for decorator in symbol.decorators:
|
|
197
|
+
if _SYMFONY_ROUTE.search(decorator):
|
|
198
|
+
prefixes[symbol.qualified_name] = _symfony_path(decorator) or ""
|
|
199
|
+
break
|
|
164
200
|
hints = []
|
|
165
201
|
for symbol in x.symbols:
|
|
166
202
|
if symbol.kind not in (SymbolKind.METHOD, SymbolKind.FUNCTION):
|
|
167
203
|
continue
|
|
168
204
|
for decorator in symbol.decorators:
|
|
169
205
|
if _SYMFONY_ROUTE.search(decorator):
|
|
206
|
+
prefix = prefixes.get(symbol.parent_qualified_name or "", "")
|
|
170
207
|
hints.append(
|
|
171
208
|
EntrypointHint(
|
|
172
209
|
rule_id="php.symfony.route",
|
|
173
210
|
kind=EntrypointKind.HTTP_ROUTE,
|
|
174
211
|
handler_qualified_name=symbol.qualified_name,
|
|
175
|
-
route=
|
|
176
|
-
http_methods=["*"],
|
|
212
|
+
route=compose_route(prefix, _symfony_path(decorator)),
|
|
213
|
+
http_methods=_symfony_methods(decorator) or ["*"],
|
|
177
214
|
framework="symfony",
|
|
178
215
|
)
|
|
179
216
|
)
|
|
@@ -15,6 +15,7 @@ import re
|
|
|
15
15
|
|
|
16
16
|
from entrygraph.detect.entrypoints.base import (
|
|
17
17
|
EntrypointRule,
|
|
18
|
+
compose_route,
|
|
18
19
|
first_string_arg,
|
|
19
20
|
register,
|
|
20
21
|
)
|
|
@@ -58,10 +59,36 @@ def _rust_main(x: FileExtraction) -> list[EntrypointHint]:
|
|
|
58
59
|
return hints
|
|
59
60
|
|
|
60
61
|
|
|
62
|
+
_AXUM_NEST_FN = re.compile(r",\s*([A-Za-z_]\w*)\s*\(") # 2nd arg of nest: funcName(
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def _axum_nest_prefixes(x: FileExtraction) -> dict[str, str]:
|
|
66
|
+
"""Map a router-builder function to the prefix it's nested under:
|
|
67
|
+
`.nest("/admin", admin_routes())` -> {admin_routes: "/admin"} (#36).
|
|
68
|
+
|
|
69
|
+
axum's other nest form, `.nest("/x", router_var)`, mounts a router built inline
|
|
70
|
+
in the same function as everything else, so its routes can't be told apart by
|
|
71
|
+
caller — that variable form stays out of static reach.
|
|
72
|
+
"""
|
|
73
|
+
prefixes: dict[str, str] = {}
|
|
74
|
+
for ref in x.references:
|
|
75
|
+
if ref.kind != "call" or ref.callee_name != "nest" or not ref.arg_preview:
|
|
76
|
+
continue
|
|
77
|
+
prefix = first_string_arg("(" + ref.arg_preview.lstrip("("))
|
|
78
|
+
if prefix is None or not prefix.startswith("/"):
|
|
79
|
+
continue
|
|
80
|
+
m = _AXUM_NEST_FN.search(ref.arg_preview)
|
|
81
|
+
if m:
|
|
82
|
+
prefixes[m.group(1)] = prefix
|
|
83
|
+
return prefixes
|
|
84
|
+
|
|
85
|
+
|
|
61
86
|
def _axum_routes(x: FileExtraction) -> list[EntrypointHint]:
|
|
62
87
|
"""`Router::new().route("/x", post(handler))` — the handler is buried in the
|
|
63
88
|
second argument, so we regex it out of the preview but can't statically bind
|
|
64
|
-
it (the Express-rule fidelity tradeoff).
|
|
89
|
+
it (the Express-rule fidelity tradeoff). Routes declared inside a function that
|
|
90
|
+
is `.nest("/prefix", fn())`-mounted are composed with that prefix."""
|
|
91
|
+
nest_prefixes = _axum_nest_prefixes(x)
|
|
65
92
|
hints = []
|
|
66
93
|
for ref in x.references:
|
|
67
94
|
if ref.kind != "call" or ref.callee_name != "route" or not ref.arg_preview:
|
|
@@ -70,12 +97,15 @@ def _axum_routes(x: FileExtraction) -> list[EntrypointHint]:
|
|
|
70
97
|
if route is None or not route.startswith("/"):
|
|
71
98
|
continue
|
|
72
99
|
method, handler = _axum_method_and_handler(ref.arg_preview)
|
|
100
|
+
# the enclosing router-builder function, if it's mounted under a nest prefix
|
|
101
|
+
builder = (ref.caller_qualified_name or "").rsplit(".", 1)[-1]
|
|
102
|
+
full = compose_route(nest_prefixes.get(builder, ""), route)
|
|
73
103
|
hints.append(
|
|
74
104
|
EntrypointHint(
|
|
75
105
|
rule_id="rust.axum.route",
|
|
76
106
|
kind=EntrypointKind.HTTP_ROUTE,
|
|
77
107
|
handler_qualified_name=None,
|
|
78
|
-
route=
|
|
108
|
+
route=full,
|
|
79
109
|
http_methods=[method],
|
|
80
110
|
framework="axum",
|
|
81
111
|
metadata={"handler_text": handler, "registration": ref.arg_preview},
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"""PHP entrypoint-rule tests (kept per-language so PRs touching different
|
|
2
|
+
languages don't serially conflict on one shared test module)."""
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
from entrygraph.detect.entrypoints import rules_for
|
|
7
|
+
from entrygraph.detect.entrypoints.php import _symfony_methods, _symfony_path
|
|
8
|
+
from entrygraph.extract.base import FileContext
|
|
9
|
+
from entrygraph.extract.php import PhpExtractor
|
|
10
|
+
from entrygraph.parsing.parsers import parse
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def _symfony_rule():
|
|
14
|
+
return {r.id: r for r in rules_for("php", {"symfony"})}["php.symfony.route"]
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def _extract(src: bytes, path="src/Controller/UserController.php"):
|
|
18
|
+
ctx = FileContext(
|
|
19
|
+
path=path,
|
|
20
|
+
language="php",
|
|
21
|
+
module_path="App.Controller.UserController",
|
|
22
|
+
source=src,
|
|
23
|
+
is_package=False,
|
|
24
|
+
)
|
|
25
|
+
return PhpExtractor().extract(parse("php", src), ctx)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def test_symfony_class_route_prefix_composed():
|
|
29
|
+
# Class-level #[Route('/profile')] must prefix each method route, and
|
|
30
|
+
# methods: [...] must be honored (symfony-demo: 11/12 routes were wrong) (#36).
|
|
31
|
+
src = (
|
|
32
|
+
b"<?php\nnamespace App\\Controller;\n"
|
|
33
|
+
b"#[Route('/profile'), IsGranted(User::ROLE_USER)]\n"
|
|
34
|
+
b"final class UserController extends AbstractController\n{\n"
|
|
35
|
+
b" #[Route('/edit', name: 'user_edit', methods: ['GET', 'POST'])]\n"
|
|
36
|
+
b" public function edit() {}\n"
|
|
37
|
+
b" #[Route(path: '/pw', name: 'pw')]\n"
|
|
38
|
+
b" public function pw() {}\n"
|
|
39
|
+
b"}\n"
|
|
40
|
+
)
|
|
41
|
+
got = {(tuple(h.http_methods), h.route) for h in _symfony_rule().match(_extract(src))}
|
|
42
|
+
assert got == {
|
|
43
|
+
(("GET", "POST"), "/profile/edit"),
|
|
44
|
+
(("*",), "/profile/pw"), # path: named arg, no methods -> all verbs
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def test_symfony_route_without_class_prefix():
|
|
49
|
+
# A controller with no class-level #[Route] leaves method routes unprefixed.
|
|
50
|
+
src = (
|
|
51
|
+
b"<?php\nnamespace App\\Controller;\n"
|
|
52
|
+
b"final class SecurityController extends AbstractController\n{\n"
|
|
53
|
+
b" #[Route('/login', name: 'login')]\n"
|
|
54
|
+
b" public function login() {}\n"
|
|
55
|
+
b"}\n"
|
|
56
|
+
)
|
|
57
|
+
got = {(tuple(h.http_methods), h.route) for h in _symfony_rule().match(_extract(src))}
|
|
58
|
+
assert got == {(("*",), "/login")}
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def test_symfony_path_and_methods_parsing():
|
|
62
|
+
assert _symfony_path("#[Route('/edit', name: 'x')]") == "/edit"
|
|
63
|
+
assert _symfony_path("#[Route(path: '/pw', name: 'x')]") == "/pw"
|
|
64
|
+
assert _symfony_methods("#[Route('/x', methods: ['GET', 'POST'])]") == ["GET", "POST"]
|
|
65
|
+
assert _symfony_methods("#[Route('/x', methods: 'DELETE')]") == ["DELETE"]
|
|
66
|
+
assert _symfony_methods("#[Route('/x', name: 'x')]") == []
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"""Rust entrypoint-rule tests (kept per-language so PRs touching different
|
|
2
|
+
languages don't serially conflict on one shared test module)."""
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
from entrygraph.detect.entrypoints import rules_for
|
|
7
|
+
from entrygraph.extract.base import FileContext
|
|
8
|
+
from entrygraph.extract.rust import RustExtractor
|
|
9
|
+
from entrygraph.parsing.parsers import parse
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def _axum_rule():
|
|
13
|
+
return {r.id: r for r in rules_for("rust", {"axum"})}["rust.axum.route"]
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def _extract(src: bytes, path="src/main.rs"):
|
|
17
|
+
ctx = FileContext(path=path, language="rust", module_path="main", source=src, is_package=False)
|
|
18
|
+
return RustExtractor().extract(parse("rust", src), ctx)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def test_axum_nest_prefix_composed_for_function_router():
|
|
22
|
+
# `.nest("/admin", admin_routes())` prefixes the routes declared inside the
|
|
23
|
+
# admin_routes builder function; top-level routes stay unprefixed (#36).
|
|
24
|
+
src = (
|
|
25
|
+
b"fn admin_routes() -> Router {\n"
|
|
26
|
+
b" Router::new()\n"
|
|
27
|
+
b' .route("/keys", delete(delete_all_keys))\n'
|
|
28
|
+
b' .route("/key/{key}", delete(remove_key))\n'
|
|
29
|
+
b"}\n"
|
|
30
|
+
b"async fn main() {\n"
|
|
31
|
+
b" let app = Router::new()\n"
|
|
32
|
+
b' .route("/keys", get(list_keys))\n'
|
|
33
|
+
b' .nest("/admin", admin_routes());\n'
|
|
34
|
+
b"}\n"
|
|
35
|
+
)
|
|
36
|
+
got = {(h.http_methods[0], h.route) for h in _axum_rule().match(_extract(src))}
|
|
37
|
+
assert got == {
|
|
38
|
+
("GET", "/keys"), # top-level, no prefix
|
|
39
|
+
("DELETE", "/admin/keys"), # composed with the nest prefix
|
|
40
|
+
("DELETE", "/admin/key/{key}"),
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def test_axum_routes_without_nest_are_unprefixed():
|
|
45
|
+
src = (
|
|
46
|
+
b"async fn main() {\n"
|
|
47
|
+
b" let app = Router::new()\n"
|
|
48
|
+
b' .route("/users", get(list_users))\n'
|
|
49
|
+
b' .route("/users/{id}", get(get_user));\n'
|
|
50
|
+
b"}\n"
|
|
51
|
+
)
|
|
52
|
+
got = {(h.http_methods[0], h.route) for h in _axum_rule().match(_extract(src))}
|
|
53
|
+
assert got == {("GET", "/users"), ("GET", "/users/{id}")}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
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.44 → entrygraph-0.1.46}/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.44 → entrygraph-0.1.46}/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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|