entrygraph 0.1.46__tar.gz → 0.1.47__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.46 → entrygraph-0.1.47}/PKG-INFO +1 -1
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/_version.py +2 -2
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/detect/entrypoints/csharp.py +79 -28
- entrygraph-0.1.47/tests/test_entrypoints_csharp.py +75 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/.github/workflows/ci.yml +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/.github/workflows/release.yml +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/.gitignore +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/LICENSE +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/README.md +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/RELEASING.md +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/pyproject.toml +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/__init__.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/__main__.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/api.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/cli/__init__.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/cli/main.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/cli/render.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/data/sinks/csharp.toml +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/data/sinks/go.toml +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/data/sinks/java.toml +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/data/sinks/javascript.toml +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/data/sinks/lib_javascript.toml +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/data/sinks/lib_python.toml +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/data/sinks/php.toml +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/data/sinks/python.toml +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/data/sinks/ruby.toml +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/data/sinks/rust.toml +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/db/__init__.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/db/engine.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/db/meta.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/db/models.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/db/queries.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/detect/__init__.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/detect/entrypoints/__init__.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/detect/entrypoints/base.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/detect/entrypoints/configs.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/detect/entrypoints/golang.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/detect/entrypoints/java.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/detect/entrypoints/javascript.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/detect/entrypoints/php.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/detect/entrypoints/python.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/detect/entrypoints/ruby.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/detect/entrypoints/rust.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/detect/frameworks.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/detect/manifests.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/detect/taint.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/errors.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/extract/__init__.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/extract/base.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/extract/csharp.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/extract/golang.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/extract/ir.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/extract/java.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/extract/javascript.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/extract/php.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/extract/python.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/extract/registry.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/extract/ruby.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/extract/rust.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/fs/__init__.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/fs/hashing.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/fs/lang.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/fs/walker.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/graph/__init__.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/graph/adjacency.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/graph/cte.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/graph/scoring.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/kinds.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/parsing/__init__.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/parsing/parsers.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/parsing/queries.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/pipeline/__init__.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/pipeline/scanner.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/pipeline/worker.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/pipeline/writer.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/py.typed +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/queries/csharp/calls.scm +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/queries/csharp/definitions.scm +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/queries/csharp/imports.scm +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/queries/go/calls.scm +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/queries/go/definitions.scm +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/queries/go/imports.scm +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/queries/java/calls.scm +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/queries/java/definitions.scm +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/queries/java/imports.scm +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/queries/javascript/calls.scm +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/queries/javascript/definitions.scm +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/queries/javascript/imports.scm +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/queries/php/calls.scm +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/queries/php/definitions.scm +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/queries/php/imports.scm +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/queries/python/calls.scm +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/queries/python/definitions.scm +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/queries/python/imports.scm +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/queries/ruby/calls.scm +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/queries/ruby/definitions.scm +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/queries/ruby/imports.scm +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/queries/rust/calls.scm +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/queries/rust/definitions.scm +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/queries/rust/imports.scm +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/resolve/__init__.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/resolve/externals.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/resolve/hierarchy.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/resolve/resolver.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/resolve/symbol_table.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/src/entrygraph/results.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/conftest.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/fixtures/csharp/aspnet_app/Controllers/ReportsController.cs +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/fixtures/csharp/aspnet_app/Program.cs +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/fixtures/csharp/aspnet_app/Services/ReportService.cs +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/fixtures/csharp/aspnet_app/app.csproj +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/fixtures/csharp/minimalapi_app/Program.cs +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/fixtures/csharp/minimalapi_app/app.csproj +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/fixtures/go/gin_app/go.mod +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/fixtures/go/gin_app/main.go +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/fixtures/go/gin_app/service.go +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/fixtures/go/nethttp_app/go.mod +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/fixtures/go/nethttp_app/main.go +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/fixtures/java/methodref_app/pom.xml +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/fixtures/java/methodref_app/src/main/java/com/example/App.java +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/fixtures/java/spring_app/pom.xml +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/fixtures/java/spring_app/src/main/java/com/example/Application.java +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/fixtures/java/spring_app/src/main/java/com/example/ReportRunner.java +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/fixtures/java/spring_app/src/main/java/com/example/ReportService.java +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/fixtures/java/spring_app/src/main/java/com/example/UserController.java +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/fixtures/javascript/commonjs_app/server.js +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/fixtures/javascript/express_app/package.json +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/fixtures/javascript/express_app/src/routes.js +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/fixtures/javascript/express_app/src/services.js +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/fixtures/php/laravel_app/app/Http/Controllers/ReportController.php +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/fixtures/php/laravel_app/artisan +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/fixtures/php/laravel_app/composer.json +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/fixtures/php/laravel_app/routes/web.php +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/fixtures/python/chained_sinks/app.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/fixtures/python/flask_app/app/__init__.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/fixtures/python/flask_app/app/db.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/fixtures/python/flask_app/app/routes.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/fixtures/python/flask_app/app/services.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/fixtures/python/flask_app/cli.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/fixtures/python/flask_app/requirements.txt +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/fixtures/python/fuzzy_sink/app.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/fixtures/python/heal_fidelity/caller.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/fixtures/python/heal_fidelity/worker.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/fixtures/python/may_continue/app.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/fixtures/python/sanitizer/app.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/fixtures/python/taint_source/handler.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/fixtures/ruby/sinatra_app/Gemfile +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/fixtures/ruby/sinatra_app/app.rb +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/fixtures/ruby/sinatra_app/services/runner.rb +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/fixtures/rust/axum_app/Cargo.toml +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/fixtures/rust/axum_app/src/handlers.rs +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/fixtures/rust/axum_app/src/main.rs +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/fixtures/rust/axum_callback_app/Cargo.toml +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/fixtures/rust/axum_callback_app/src/main.rs +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/fixtures/rust/scoped_sink_app/Cargo.toml +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/fixtures/rust/scoped_sink_app/src/main.rs +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/test_api.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/test_cli.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/test_commonjs.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/test_csharp_callbacks.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/test_cte_bounds.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/test_engine_pragmas.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/test_entrypoint_expansion.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/test_entrypoints.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/test_entrypoints_go.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/test_entrypoints_javascript.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/test_entrypoints_php.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/test_entrypoints_ruby.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/test_entrypoints_rust.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/test_extract_csharp.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/test_extract_go.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/test_extract_java.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/test_extract_javascript.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/test_extract_php.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/test_extract_python.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/test_extract_ruby.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/test_extract_rust.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/test_frameworks.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/test_fuzzy_sink.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/test_go_callbacks.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/test_hardening.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/test_heal_fidelity.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/test_incremental.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/test_indexer.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/test_java_callbacks.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/test_lang.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/test_manifests.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/test_may_continue.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/test_models.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/test_pool.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/test_reachability.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/test_registry_cache.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/test_render.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/test_resolver.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/test_rust_callbacks.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/test_rust_scoped_sinks.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/test_sanitizer_languages.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/test_scoring.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/test_sink_catalog.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/test_taint.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/test_taint_sanitizers.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/test_taint_sources.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/tests/test_walker.py +0 -0
- {entrygraph-0.1.46 → entrygraph-0.1.47}/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.47
|
|
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.47'
|
|
22
|
+
__version_tuple__ = version_tuple = (0, 1, 47)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -25,6 +25,9 @@ from entrygraph.kinds import EntrypointKind, SymbolKind
|
|
|
25
25
|
_HTTP_ATTR = re.compile(r"^\[Http(Get|Post|Put|Delete|Patch|Head|Options)\b")
|
|
26
26
|
_ROUTE_ATTR = re.compile(r"^\[Route\b")
|
|
27
27
|
_CONTROLLER_ATTR = re.compile(r"^\[(ApiController|Controller)\b")
|
|
28
|
+
_APICONTROLLER_ATTR = re.compile(r"^\[ApiController\b")
|
|
29
|
+
_AREA_ATTR = re.compile(r"^\[Area\b")
|
|
30
|
+
_NONACTION_ATTR = re.compile(r"^\[NonAction\b")
|
|
28
31
|
|
|
29
32
|
_MINIMAL_MAP = {
|
|
30
33
|
"MapGet": "GET",
|
|
@@ -64,45 +67,93 @@ def _class_route_prefix(t: RawSymbol) -> str:
|
|
|
64
67
|
return prefix.replace("[controller]", _controller_token(t.qualified_name))
|
|
65
68
|
|
|
66
69
|
|
|
70
|
+
def _is_conventional_controller(t: RawSymbol) -> bool:
|
|
71
|
+
"""A classic MVC controller reached by convention (`{controller}/{action}`),
|
|
72
|
+
not attribute routing. `[ApiController]` mandates attribute routing, and a
|
|
73
|
+
class-level `[Route]` opts the whole controller into attribute routing, so
|
|
74
|
+
neither can be convention-routed."""
|
|
75
|
+
return not any(_APICONTROLLER_ATTR.match(d) or _ROUTE_ATTR.match(d) for d in t.decorators)
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def _is_action_method(m: RawSymbol, ctor_name: str) -> bool:
|
|
79
|
+
"""A public instance method that MVC exposes as a convention-routed action.
|
|
80
|
+
|
|
81
|
+
Excludes constructors, static/override members (framework overrides like
|
|
82
|
+
`OnActionExecuting`), `[NonAction]`, and anything already carrying an
|
|
83
|
+
`[Http*]`/`[Route]` attribute (handled by the attribute-routing branches)."""
|
|
84
|
+
if "public" not in m.modifiers or "static" in m.modifiers or "override" in m.modifiers:
|
|
85
|
+
return False
|
|
86
|
+
if m.name == ctor_name:
|
|
87
|
+
return False
|
|
88
|
+
return not any(
|
|
89
|
+
_NONACTION_ATTR.match(d) or _HTTP_ATTR.match(d) or _ROUTE_ATTR.match(d)
|
|
90
|
+
for d in m.decorators
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def _conventional_route(t: RawSymbol, action: str) -> str:
|
|
95
|
+
"""`[Area("Admin")]` + FooController + Bar -> /Admin/Foo/Bar."""
|
|
96
|
+
area_dec = next((d for d in t.decorators if _AREA_ATTR.match(d)), None)
|
|
97
|
+
area = (first_string_arg(area_dec) if area_dec else None) or ""
|
|
98
|
+
parts = [area, _controller_token(t.qualified_name), action]
|
|
99
|
+
return "/" + "/".join(p.strip("/") for p in parts if p and p.strip("/"))
|
|
100
|
+
|
|
101
|
+
|
|
67
102
|
def _aspnet_controller_routes(x: FileExtraction) -> list[EntrypointHint]:
|
|
68
103
|
controller_syms = [t for t in _type_symbols(x) if _is_controller(t)]
|
|
69
104
|
controllers = {t.qualified_name for t in controller_syms}
|
|
70
105
|
if not controllers:
|
|
71
106
|
return []
|
|
72
107
|
prefixes = {t.qualified_name: _class_route_prefix(t) for t in controller_syms}
|
|
108
|
+
# controllers reached by convention -> their symbol, for building /controller/action
|
|
109
|
+
conventional = {t.qualified_name: t for t in controller_syms if _is_conventional_controller(t)}
|
|
73
110
|
hints: list[EntrypointHint] = []
|
|
74
111
|
for method in _methods(x):
|
|
75
|
-
|
|
112
|
+
parent = method.parent_qualified_name or ""
|
|
113
|
+
if parent not in controllers:
|
|
76
114
|
continue
|
|
77
|
-
prefix = prefixes.get(
|
|
78
|
-
for
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
framework="aspnetcore",
|
|
89
|
-
)
|
|
115
|
+
prefix = prefixes.get(parent, "")
|
|
116
|
+
verb_match = next((m for d in method.decorators if (m := _HTTP_ATTR.match(d))), None)
|
|
117
|
+
if verb_match is not None:
|
|
118
|
+
hints.append(
|
|
119
|
+
EntrypointHint(
|
|
120
|
+
rule_id="csharp.aspnet.controller-route",
|
|
121
|
+
kind=EntrypointKind.HTTP_ROUTE,
|
|
122
|
+
handler_qualified_name=method.qualified_name,
|
|
123
|
+
route=compose_route(prefix, first_string_arg(verb_match.string)),
|
|
124
|
+
http_methods=[verb_match.group(1).upper()],
|
|
125
|
+
framework="aspnetcore",
|
|
90
126
|
)
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
)
|
|
127
|
+
)
|
|
128
|
+
continue
|
|
129
|
+
# No Http* verb attribute; a bare [Route("...")] still exposes it.
|
|
130
|
+
route_dec = next((d for d in method.decorators if _ROUTE_ATTR.match(d)), None)
|
|
131
|
+
if route_dec is not None:
|
|
132
|
+
hints.append(
|
|
133
|
+
EntrypointHint(
|
|
134
|
+
rule_id="csharp.aspnet.controller-route",
|
|
135
|
+
kind=EntrypointKind.HTTP_ROUTE,
|
|
136
|
+
handler_qualified_name=method.qualified_name,
|
|
137
|
+
route=compose_route(prefix, first_string_arg(route_dec)),
|
|
138
|
+
http_methods=["*"],
|
|
139
|
+
framework="aspnetcore",
|
|
105
140
|
)
|
|
141
|
+
)
|
|
142
|
+
continue
|
|
143
|
+
# No attribute at all: a convention-routed MVC action (/controller/action),
|
|
144
|
+
# reachable via GET. Only for non-attribute controllers (#37).
|
|
145
|
+
controller = conventional.get(parent)
|
|
146
|
+
if controller is not None and _is_action_method(method, controller.name):
|
|
147
|
+
hints.append(
|
|
148
|
+
EntrypointHint(
|
|
149
|
+
rule_id="csharp.aspnet.mvc-conventional",
|
|
150
|
+
kind=EntrypointKind.HTTP_ROUTE,
|
|
151
|
+
handler_qualified_name=method.qualified_name,
|
|
152
|
+
route=_conventional_route(controller, method.name),
|
|
153
|
+
http_methods=["GET"],
|
|
154
|
+
framework="aspnetcore",
|
|
155
|
+
)
|
|
156
|
+
)
|
|
106
157
|
return hints
|
|
107
158
|
|
|
108
159
|
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"""C# entrypoint-rule tests (kept per-language so PRs touching different languages
|
|
2
|
+
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.csharp import CSharpExtractor
|
|
9
|
+
from entrygraph.parsing.parsers import parse
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def _controller_rule():
|
|
13
|
+
return {r.id: r for r in rules_for("csharp", {"aspnetcore"})}["csharp.aspnet.controller-route"]
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def _extract(src: bytes, path="Controllers/C.cs", module="App.Controllers"):
|
|
17
|
+
ctx = FileContext(
|
|
18
|
+
path=path, language="csharp", module_path=module, source=src, is_package=False
|
|
19
|
+
)
|
|
20
|
+
return CSharpExtractor().extract(parse("csharp", src), ctx)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def test_conventional_mvc_actions_detected():
|
|
24
|
+
# Non-attribute controller: public actions route to /{controller}/{action} via
|
|
25
|
+
# GET; constructors, [NonAction], override, and [HttpPost] methods are excluded
|
|
26
|
+
# (the POST one is emitted by the attribute branch instead) (#37).
|
|
27
|
+
src = (
|
|
28
|
+
b"namespace App.Controllers;\n"
|
|
29
|
+
b"public class HomeController : Controller\n{\n"
|
|
30
|
+
b" public HomeController() {}\n"
|
|
31
|
+
b" public IActionResult Index() { return View(); }\n"
|
|
32
|
+
b" public async Task<IActionResult> About() { return View(); }\n"
|
|
33
|
+
b" [NonAction] public void Helper() {}\n"
|
|
34
|
+
b" public override void OnActionExecuting() {}\n"
|
|
35
|
+
b"}\n"
|
|
36
|
+
)
|
|
37
|
+
got = {(tuple(h.http_methods), h.route) for h in _controller_rule().match(_extract(src))}
|
|
38
|
+
assert got == {(("GET",), "/Home/Index"), (("GET",), "/Home/About")}
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def test_conventional_route_includes_area_prefix():
|
|
42
|
+
src = (
|
|
43
|
+
b"namespace App.Areas.Admin.Controllers;\n"
|
|
44
|
+
b'[Area("Admin")]\n'
|
|
45
|
+
b"public class DashboardController : Controller\n{\n"
|
|
46
|
+
b" public IActionResult Stats() { return View(); }\n"
|
|
47
|
+
b"}\n"
|
|
48
|
+
)
|
|
49
|
+
got = {h.route for h in _controller_rule().match(_extract(src))}
|
|
50
|
+
assert got == {"/Admin/Dashboard/Stats"}
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def test_api_controllers_are_not_convention_routed():
|
|
54
|
+
# [ApiController] and a class-level [Route] both mandate attribute routing, so a
|
|
55
|
+
# bare public method must NOT get a convention route.
|
|
56
|
+
src = (
|
|
57
|
+
b"namespace App.Controllers;\n"
|
|
58
|
+
b"[ApiController]\n"
|
|
59
|
+
b'[Route("api/[controller]")]\n'
|
|
60
|
+
b"public class ThingsController : ControllerBase\n{\n"
|
|
61
|
+
b" public IActionResult NoAttr() { return Ok(); }\n"
|
|
62
|
+
b"}\n"
|
|
63
|
+
)
|
|
64
|
+
assert _controller_rule().match(_extract(src)) == []
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def test_attribute_routes_still_win_over_convention():
|
|
68
|
+
src = (
|
|
69
|
+
b"namespace App.Controllers;\n"
|
|
70
|
+
b"public class HomeController : Controller\n{\n"
|
|
71
|
+
b' [HttpGet("ping")] public IActionResult Ping() { return Ok(); }\n'
|
|
72
|
+
b"}\n"
|
|
73
|
+
)
|
|
74
|
+
got = {(tuple(h.http_methods), h.route) for h in _controller_rule().match(_extract(src))}
|
|
75
|
+
assert got == {(("GET",), "/ping")} # attribute route, not /Home/Ping
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
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.46 → entrygraph-0.1.47}/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.46 → entrygraph-0.1.47}/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
|
|
File without changes
|
|
File without changes
|