entrygraph 0.1.44__tar.gz → 0.1.45__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.45}/PKG-INFO +1 -1
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/_version.py +2 -2
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/detect/entrypoints/php.py +39 -2
- entrygraph-0.1.45/tests/test_entrypoints_php.py +66 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/.github/workflows/ci.yml +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/.github/workflows/release.yml +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/.gitignore +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/LICENSE +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/README.md +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/RELEASING.md +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/pyproject.toml +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/__init__.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/__main__.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/api.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/cli/__init__.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/cli/main.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/cli/render.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/data/sinks/csharp.toml +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/data/sinks/go.toml +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/data/sinks/java.toml +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/data/sinks/javascript.toml +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/data/sinks/lib_javascript.toml +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/data/sinks/lib_python.toml +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/data/sinks/php.toml +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/data/sinks/python.toml +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/data/sinks/ruby.toml +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/data/sinks/rust.toml +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/db/__init__.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/db/engine.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/db/meta.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/db/models.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/db/queries.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/detect/__init__.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/detect/entrypoints/__init__.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/detect/entrypoints/base.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/detect/entrypoints/configs.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/detect/entrypoints/csharp.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/detect/entrypoints/golang.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/detect/entrypoints/java.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/detect/entrypoints/javascript.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/detect/entrypoints/python.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/detect/entrypoints/ruby.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/detect/entrypoints/rust.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/detect/frameworks.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/detect/manifests.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/detect/taint.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/errors.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/extract/__init__.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/extract/base.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/extract/csharp.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/extract/golang.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/extract/ir.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/extract/java.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/extract/javascript.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/extract/php.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/extract/python.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/extract/registry.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/extract/ruby.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/extract/rust.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/fs/__init__.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/fs/hashing.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/fs/lang.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/fs/walker.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/graph/__init__.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/graph/adjacency.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/graph/cte.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/graph/scoring.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/kinds.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/parsing/__init__.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/parsing/parsers.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/parsing/queries.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/pipeline/__init__.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/pipeline/scanner.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/pipeline/worker.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/pipeline/writer.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/py.typed +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/queries/csharp/calls.scm +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/queries/csharp/definitions.scm +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/queries/csharp/imports.scm +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/queries/go/calls.scm +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/queries/go/definitions.scm +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/queries/go/imports.scm +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/queries/java/calls.scm +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/queries/java/definitions.scm +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/queries/java/imports.scm +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/queries/javascript/calls.scm +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/queries/javascript/definitions.scm +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/queries/javascript/imports.scm +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/queries/php/calls.scm +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/queries/php/definitions.scm +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/queries/php/imports.scm +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/queries/python/calls.scm +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/queries/python/definitions.scm +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/queries/python/imports.scm +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/queries/ruby/calls.scm +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/queries/ruby/definitions.scm +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/queries/ruby/imports.scm +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/queries/rust/calls.scm +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/queries/rust/definitions.scm +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/queries/rust/imports.scm +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/resolve/__init__.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/resolve/externals.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/resolve/hierarchy.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/resolve/resolver.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/resolve/symbol_table.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/results.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/conftest.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/csharp/aspnet_app/Controllers/ReportsController.cs +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/csharp/aspnet_app/Program.cs +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/csharp/aspnet_app/Services/ReportService.cs +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/csharp/aspnet_app/app.csproj +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/csharp/minimalapi_app/Program.cs +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/csharp/minimalapi_app/app.csproj +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/go/gin_app/go.mod +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/go/gin_app/main.go +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/go/gin_app/service.go +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/go/nethttp_app/go.mod +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/go/nethttp_app/main.go +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/java/methodref_app/pom.xml +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/java/methodref_app/src/main/java/com/example/App.java +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/java/spring_app/pom.xml +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/java/spring_app/src/main/java/com/example/Application.java +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/java/spring_app/src/main/java/com/example/ReportRunner.java +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/java/spring_app/src/main/java/com/example/ReportService.java +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/java/spring_app/src/main/java/com/example/UserController.java +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/javascript/commonjs_app/server.js +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/javascript/express_app/package.json +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/javascript/express_app/src/routes.js +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/javascript/express_app/src/services.js +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/php/laravel_app/app/Http/Controllers/ReportController.php +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/php/laravel_app/artisan +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/php/laravel_app/composer.json +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/php/laravel_app/routes/web.php +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/python/chained_sinks/app.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/python/flask_app/app/__init__.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/python/flask_app/app/db.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/python/flask_app/app/routes.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/python/flask_app/app/services.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/python/flask_app/cli.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/python/flask_app/requirements.txt +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/python/fuzzy_sink/app.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/python/heal_fidelity/caller.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/python/heal_fidelity/worker.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/python/may_continue/app.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/python/sanitizer/app.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/python/taint_source/handler.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/ruby/sinatra_app/Gemfile +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/ruby/sinatra_app/app.rb +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/ruby/sinatra_app/services/runner.rb +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/rust/axum_app/Cargo.toml +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/rust/axum_app/src/handlers.rs +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/rust/axum_app/src/main.rs +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/rust/axum_callback_app/Cargo.toml +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/rust/axum_callback_app/src/main.rs +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/rust/scoped_sink_app/Cargo.toml +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/rust/scoped_sink_app/src/main.rs +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_api.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_cli.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_commonjs.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_csharp_callbacks.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_cte_bounds.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_engine_pragmas.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_entrypoint_expansion.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_entrypoints.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_entrypoints_go.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_entrypoints_javascript.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_entrypoints_ruby.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_extract_csharp.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_extract_go.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_extract_java.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_extract_javascript.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_extract_php.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_extract_python.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_extract_ruby.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_extract_rust.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_frameworks.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_fuzzy_sink.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_go_callbacks.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_hardening.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_heal_fidelity.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_incremental.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_indexer.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_java_callbacks.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_lang.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_manifests.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_may_continue.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_models.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_pool.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_reachability.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_registry_cache.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_render.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_resolver.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_rust_callbacks.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_rust_scoped_sinks.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_sanitizer_languages.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_scoring.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_sink_catalog.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_taint.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_taint_sanitizers.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_taint_sources.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_walker.py +0 -0
- {entrygraph-0.1.44 → entrygraph-0.1.45}/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.45
|
|
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.45'
|
|
22
|
+
__version_tuple__ = version_tuple = (0, 1, 45)
|
|
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
|
)
|
|
@@ -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')]") == []
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
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.45}/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.45}/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
|