entrygraph 0.1.39__tar.gz → 0.1.41__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.39 → entrygraph-0.1.41}/PKG-INFO +1 -1
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/_version.py +2 -2
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/detect/entrypoints/golang.py +48 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/detect/entrypoints/javascript.py +32 -15
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/kinds.py +1 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/test_entrypoints_go.py +47 -0
- entrygraph-0.1.41/tests/test_entrypoints_javascript.py +75 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/.github/workflows/ci.yml +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/.github/workflows/release.yml +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/.gitignore +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/LICENSE +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/README.md +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/RELEASING.md +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/pyproject.toml +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/__init__.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/__main__.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/api.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/cli/__init__.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/cli/main.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/cli/render.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/data/sinks/csharp.toml +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/data/sinks/go.toml +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/data/sinks/java.toml +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/data/sinks/javascript.toml +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/data/sinks/lib_javascript.toml +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/data/sinks/lib_python.toml +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/data/sinks/php.toml +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/data/sinks/python.toml +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/data/sinks/ruby.toml +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/data/sinks/rust.toml +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/db/__init__.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/db/engine.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/db/meta.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/db/models.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/db/queries.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/detect/__init__.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/detect/entrypoints/__init__.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/detect/entrypoints/base.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/detect/entrypoints/configs.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/detect/entrypoints/csharp.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/detect/entrypoints/java.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/detect/entrypoints/php.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/detect/entrypoints/python.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/detect/entrypoints/ruby.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/detect/entrypoints/rust.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/detect/frameworks.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/detect/manifests.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/detect/taint.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/errors.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/extract/__init__.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/extract/base.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/extract/csharp.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/extract/golang.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/extract/ir.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/extract/java.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/extract/javascript.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/extract/php.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/extract/python.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/extract/registry.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/extract/ruby.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/extract/rust.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/fs/__init__.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/fs/hashing.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/fs/lang.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/fs/walker.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/graph/__init__.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/graph/adjacency.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/graph/cte.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/graph/scoring.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/parsing/__init__.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/parsing/parsers.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/parsing/queries.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/pipeline/__init__.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/pipeline/scanner.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/pipeline/worker.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/pipeline/writer.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/py.typed +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/queries/csharp/calls.scm +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/queries/csharp/definitions.scm +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/queries/csharp/imports.scm +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/queries/go/calls.scm +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/queries/go/definitions.scm +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/queries/go/imports.scm +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/queries/java/calls.scm +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/queries/java/definitions.scm +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/queries/java/imports.scm +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/queries/javascript/calls.scm +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/queries/javascript/definitions.scm +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/queries/javascript/imports.scm +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/queries/php/calls.scm +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/queries/php/definitions.scm +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/queries/php/imports.scm +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/queries/python/calls.scm +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/queries/python/definitions.scm +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/queries/python/imports.scm +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/queries/ruby/calls.scm +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/queries/ruby/definitions.scm +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/queries/ruby/imports.scm +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/queries/rust/calls.scm +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/queries/rust/definitions.scm +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/queries/rust/imports.scm +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/resolve/__init__.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/resolve/externals.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/resolve/hierarchy.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/resolve/resolver.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/resolve/symbol_table.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/src/entrygraph/results.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/conftest.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/fixtures/csharp/aspnet_app/Controllers/ReportsController.cs +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/fixtures/csharp/aspnet_app/Program.cs +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/fixtures/csharp/aspnet_app/Services/ReportService.cs +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/fixtures/csharp/aspnet_app/app.csproj +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/fixtures/csharp/minimalapi_app/Program.cs +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/fixtures/csharp/minimalapi_app/app.csproj +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/fixtures/go/gin_app/go.mod +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/fixtures/go/gin_app/main.go +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/fixtures/go/gin_app/service.go +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/fixtures/go/nethttp_app/go.mod +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/fixtures/go/nethttp_app/main.go +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/fixtures/java/methodref_app/pom.xml +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/fixtures/java/methodref_app/src/main/java/com/example/App.java +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/fixtures/java/spring_app/pom.xml +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/fixtures/java/spring_app/src/main/java/com/example/Application.java +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/fixtures/java/spring_app/src/main/java/com/example/ReportRunner.java +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/fixtures/java/spring_app/src/main/java/com/example/ReportService.java +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/fixtures/java/spring_app/src/main/java/com/example/UserController.java +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/fixtures/javascript/commonjs_app/server.js +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/fixtures/javascript/express_app/package.json +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/fixtures/javascript/express_app/src/routes.js +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/fixtures/javascript/express_app/src/services.js +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/fixtures/php/laravel_app/app/Http/Controllers/ReportController.php +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/fixtures/php/laravel_app/artisan +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/fixtures/php/laravel_app/composer.json +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/fixtures/php/laravel_app/routes/web.php +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/fixtures/python/chained_sinks/app.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/fixtures/python/flask_app/app/__init__.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/fixtures/python/flask_app/app/db.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/fixtures/python/flask_app/app/routes.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/fixtures/python/flask_app/app/services.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/fixtures/python/flask_app/cli.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/fixtures/python/flask_app/requirements.txt +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/fixtures/python/fuzzy_sink/app.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/fixtures/python/heal_fidelity/caller.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/fixtures/python/heal_fidelity/worker.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/fixtures/python/may_continue/app.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/fixtures/python/sanitizer/app.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/fixtures/python/taint_source/handler.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/fixtures/ruby/sinatra_app/Gemfile +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/fixtures/ruby/sinatra_app/app.rb +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/fixtures/ruby/sinatra_app/services/runner.rb +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/fixtures/rust/axum_app/Cargo.toml +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/fixtures/rust/axum_app/src/handlers.rs +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/fixtures/rust/axum_app/src/main.rs +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/fixtures/rust/axum_callback_app/Cargo.toml +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/fixtures/rust/axum_callback_app/src/main.rs +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/fixtures/rust/scoped_sink_app/Cargo.toml +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/fixtures/rust/scoped_sink_app/src/main.rs +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/test_api.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/test_cli.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/test_commonjs.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/test_csharp_callbacks.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/test_cte_bounds.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/test_engine_pragmas.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/test_entrypoint_expansion.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/test_entrypoints.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/test_extract_csharp.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/test_extract_go.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/test_extract_java.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/test_extract_javascript.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/test_extract_php.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/test_extract_python.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/test_extract_ruby.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/test_extract_rust.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/test_frameworks.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/test_fuzzy_sink.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/test_go_callbacks.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/test_hardening.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/test_heal_fidelity.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/test_incremental.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/test_indexer.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/test_java_callbacks.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/test_lang.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/test_manifests.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/test_may_continue.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/test_models.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/test_pool.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/test_reachability.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/test_registry_cache.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/test_render.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/test_resolver.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/test_rust_callbacks.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/test_rust_scoped_sinks.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/test_sanitizer_languages.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/test_scoring.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/test_sink_catalog.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/test_taint.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/test_taint_sanitizers.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/test_taint_sources.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/tests/test_walker.py +0 -0
- {entrygraph-0.1.39 → entrygraph-0.1.41}/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.41
|
|
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.41'
|
|
22
|
+
__version_tuple__ = version_tuple = (0, 1, 41)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -236,6 +236,51 @@ def _cobra_commands(x: FileExtraction) -> list[EntrypointHint]:
|
|
|
236
236
|
return hints
|
|
237
237
|
|
|
238
238
|
|
|
239
|
+
# gRPC service registration: `pb.RegisterFooServer(grpcServer, impl)`. The `Server`
|
|
240
|
+
# suffix anchor keeps grpc-gateway's `RegisterFooHandler` / `...HandlerFromEndpoint`
|
|
241
|
+
# out. Definitions (`func RegisterFooServer(...)`) are not call references, so only
|
|
242
|
+
# real registration call sites match.
|
|
243
|
+
_GRPC_REGISTER = re.compile(r"^Register(?P<service>[A-Za-z0-9]+)Server$")
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
def _grpc_services(x: FileExtraction) -> list[EntrypointHint]:
|
|
247
|
+
"""Mark each registered gRPC service as an RPC entrypoint (one per service).
|
|
248
|
+
|
|
249
|
+
This is a service-level marker: the implementation (arg 2) is almost always a
|
|
250
|
+
field/local var (`t.Ingester`, `frontendV1`) whose concrete type the IR can't
|
|
251
|
+
infer, so the entrypoint anchors on the registration file's module rather than
|
|
252
|
+
expanding to the impl's individual RPC methods. The service name rides in
|
|
253
|
+
`route` — the Entrypoint row has no name column, and it keeps distinct services
|
|
254
|
+
from collapsing in dedup (they all share `handler_qualified_name=None`).
|
|
255
|
+
"""
|
|
256
|
+
if x.path.endswith("_test.go"):
|
|
257
|
+
return [] # test harnesses spin up real services; not production surface (#33)
|
|
258
|
+
hints = []
|
|
259
|
+
seen: set[str] = set()
|
|
260
|
+
for ref in x.references:
|
|
261
|
+
if ref.kind != "call":
|
|
262
|
+
continue
|
|
263
|
+
m = _GRPC_REGISTER.match(ref.callee_name)
|
|
264
|
+
if m is None:
|
|
265
|
+
continue
|
|
266
|
+
service = m.group("service")
|
|
267
|
+
if service in seen:
|
|
268
|
+
continue
|
|
269
|
+
seen.add(service)
|
|
270
|
+
hints.append(
|
|
271
|
+
EntrypointHint(
|
|
272
|
+
rule_id="go.grpc.service",
|
|
273
|
+
kind=EntrypointKind.RPC_HANDLER,
|
|
274
|
+
handler_qualified_name=None,
|
|
275
|
+
route=f"/{service}",
|
|
276
|
+
name=service,
|
|
277
|
+
framework="grpc-go",
|
|
278
|
+
span=ref.span,
|
|
279
|
+
)
|
|
280
|
+
)
|
|
281
|
+
return hints
|
|
282
|
+
|
|
283
|
+
|
|
239
284
|
register(EntrypointRule("go.core.main", "go", None, EntrypointKind.MAIN, _go_main))
|
|
240
285
|
register(
|
|
241
286
|
EntrypointRule("go.nethttp.route", "go", "net/http", EntrypointKind.HTTP_ROUTE, _nethttp_routes)
|
|
@@ -253,3 +298,6 @@ register(
|
|
|
253
298
|
register(
|
|
254
299
|
EntrypointRule("go.cobra.command", "go", "cobra", EntrypointKind.CLI_COMMAND, _cobra_commands)
|
|
255
300
|
)
|
|
301
|
+
register(
|
|
302
|
+
EntrypointRule("go.grpc.service", "go", "grpc-go", EntrypointKind.RPC_HANDLER, _grpc_services)
|
|
303
|
+
)
|
|
@@ -199,25 +199,42 @@ def _nest_routes(x: FileExtraction) -> list[EntrypointHint]:
|
|
|
199
199
|
|
|
200
200
|
|
|
201
201
|
def _next_handlers(x: FileExtraction) -> list[EntrypointHint]:
|
|
202
|
-
"""Next.js
|
|
203
|
-
|
|
202
|
+
"""Next.js App Router route handlers in app/**/route.{ts,js}.
|
|
203
|
+
|
|
204
|
+
Matches both the plain `export async function GET() {}` form and the
|
|
205
|
+
wrapper-const form `export const GET = withAuth(getHandler)` — calcom's
|
|
206
|
+
dominant idiom, where nearly every method export wraps the real handler in
|
|
207
|
+
a responder. In the wrapper form the exported symbol is a VARIABLE whose own
|
|
208
|
+
qname is not the handler body, so we leave the handler unbound and set
|
|
209
|
+
`span` to the declaration line: the scanner then binds the route to the
|
|
210
|
+
handler passed by reference into the wrapper (the callback edge emitted at
|
|
211
|
+
that same line), falling back to the module when nothing was passed inline.
|
|
212
|
+
"""
|
|
213
|
+
normalized = f"/{x.path}" # leading slash so a top-level `app/` dir also matches
|
|
214
|
+
if not (x.path.endswith(("route.ts", "route.js")) and "/app/" in normalized):
|
|
204
215
|
return []
|
|
216
|
+
route = "/" + normalized.split("/app/", 1)[1].rsplit("/", 1)[0]
|
|
205
217
|
hints = []
|
|
206
218
|
for symbol in x.symbols:
|
|
207
|
-
if
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
219
|
+
if symbol.name not in _HTTP_METHODS_UPPER:
|
|
220
|
+
continue
|
|
221
|
+
if symbol.kind in (SymbolKind.FUNCTION, SymbolKind.METHOD):
|
|
222
|
+
handler, span = symbol.qualified_name, None
|
|
223
|
+
elif symbol.kind is SymbolKind.VARIABLE:
|
|
224
|
+
handler, span = None, symbol.span
|
|
225
|
+
else:
|
|
226
|
+
continue
|
|
227
|
+
hints.append(
|
|
228
|
+
EntrypointHint(
|
|
229
|
+
rule_id="javascript.next.route",
|
|
230
|
+
kind=EntrypointKind.HTTP_ROUTE,
|
|
231
|
+
handler_qualified_name=handler,
|
|
232
|
+
route=route,
|
|
233
|
+
http_methods=[symbol.name],
|
|
234
|
+
framework="next",
|
|
235
|
+
span=span,
|
|
220
236
|
)
|
|
237
|
+
)
|
|
221
238
|
return hints
|
|
222
239
|
|
|
223
240
|
|
|
@@ -40,6 +40,7 @@ class EntrypointKind(enum.Enum):
|
|
|
40
40
|
LAMBDA_HANDLER = "lambda_handler"
|
|
41
41
|
EVENT_HANDLER = "event_handler"
|
|
42
42
|
MIDDLEWARE = "middleware" # request/response interceptor (before_request, app.use, ...)
|
|
43
|
+
RPC_HANDLER = "rpc_handler" # gRPC / RPC service registration (RegisterXxxServer)
|
|
43
44
|
|
|
44
45
|
|
|
45
46
|
class Confidence(enum.IntEnum):
|
|
@@ -71,3 +71,50 @@ def test_chi_mount_prefix_not_composed_across_functions():
|
|
|
71
71
|
]
|
|
72
72
|
got = {(h.http_methods[0], h.route) for h in _chi_rule().match(_go_ext(refs))}
|
|
73
73
|
assert got == {("GET", "/health")} # no phantom /api prefix
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def _grpc_rule():
|
|
77
|
+
return {r.id: r for r in rules_for("go", {"grpc-go"})}["go.grpc.service"]
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def test_grpc_service_registration_detected():
|
|
81
|
+
# pb.RegisterPusherServer(grpcServer, t.Ingester) -> one RPC entrypoint whose
|
|
82
|
+
# service name rides in `route` (no name column; keeps services distinct in
|
|
83
|
+
# dedup since they all share handler=None). Impl type is unresolvable, so the
|
|
84
|
+
# handler is left unbound (scanner anchors it on the module) (#37).
|
|
85
|
+
refs = [
|
|
86
|
+
_call("RegisterPusherServer", "logproto", "(t.Server.GRPC, t.Ingester)"),
|
|
87
|
+
_call("RegisterQuerierServer", "logproto", "(t.Server.GRPC, t.Ingester)", start=2),
|
|
88
|
+
]
|
|
89
|
+
hints = _grpc_rule().match(_go_ext(refs, path="pkg/loki/modules.go"))
|
|
90
|
+
got = {(h.route, h.name, h.framework, h.handler_qualified_name) for h in hints}
|
|
91
|
+
assert got == {
|
|
92
|
+
("/Pusher", "Pusher", "grpc-go", None),
|
|
93
|
+
("/Querier", "Querier", "grpc-go", None),
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def test_grpc_same_service_deduped_within_file():
|
|
98
|
+
refs = [
|
|
99
|
+
_call("RegisterPusherServer", "logproto", "(s, t.distributor)"),
|
|
100
|
+
_call("RegisterPusherServer", "logproto", "(s, t.Ingester)", start=2),
|
|
101
|
+
]
|
|
102
|
+
hints = _grpc_rule().match(_go_ext(refs, path="pkg/loki/modules.go"))
|
|
103
|
+
assert [h.route for h in hints] == ["/Pusher"]
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def test_grpc_gateway_and_non_server_calls_ignored():
|
|
107
|
+
# grpc-gateway registrars end in `Handler`/`HandlerFromEndpoint`, not `Server`,
|
|
108
|
+
# and must not be treated as service registrations.
|
|
109
|
+
refs = [
|
|
110
|
+
_call("RegisterPusherHandler", "gw", "(ctx, mux, conn)"),
|
|
111
|
+
_call("RegisterPusherHandlerFromEndpoint", "gw", "(ctx, mux, addr, opts)", start=2),
|
|
112
|
+
_call("Serve", "grpcServer", "(lis)", start=3),
|
|
113
|
+
]
|
|
114
|
+
assert _grpc_rule().match(_go_ext(refs, path="pkg/loki/modules.go")) == []
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def test_grpc_test_harness_registrations_excluded():
|
|
118
|
+
# A real service registered inside a *_test.go harness is not production surface.
|
|
119
|
+
refs = [_call("RegisterFrontendServer", "frontendv1pb", "(grpcServer, v1)")]
|
|
120
|
+
assert _grpc_rule().match(_go_ext(refs, path="pkg/frontend/frontend_test.go")) == []
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"""JavaScript/TypeScript entrypoint-rule tests (kept per-language so PRs touching
|
|
2
|
+
different 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.ir import FileExtraction, RawSymbol, Span
|
|
8
|
+
from entrygraph.kinds import EntrypointKind, SymbolKind
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def _js_ext(symbols=(), path="apps/web/app/api/me/route.ts"):
|
|
12
|
+
return FileExtraction(
|
|
13
|
+
path=path,
|
|
14
|
+
language="typescript",
|
|
15
|
+
module_path=path.rsplit("/", 1)[0].replace("/", "."),
|
|
16
|
+
parse_ok=True,
|
|
17
|
+
error_count=0,
|
|
18
|
+
symbols=list(symbols),
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _sym(name, kind, line=1):
|
|
23
|
+
qname = f"apps.web.app.api.me.route.{name}"
|
|
24
|
+
return RawSymbol(kind=kind, name=name, qualified_name=qname, span=Span(line, 0, line, 40))
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def _next_rule():
|
|
28
|
+
return {r.id: r for r in rules_for("javascript", {"next"})}["javascript.next.route"]
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def test_next_wrapper_const_handlers_detected():
|
|
32
|
+
# calcom's dominant App Router idiom: `export const GET = wrap(getHandler)` —
|
|
33
|
+
# the export is a VARIABLE, not a function, and was previously missed (#37).
|
|
34
|
+
symbols = [
|
|
35
|
+
_sym("getHandler", SymbolKind.FUNCTION, line=1),
|
|
36
|
+
_sym("postHandler", SymbolKind.FUNCTION, line=2),
|
|
37
|
+
_sym("GET", SymbolKind.VARIABLE, line=10),
|
|
38
|
+
_sym("POST", SymbolKind.VARIABLE, line=11),
|
|
39
|
+
]
|
|
40
|
+
hints = _next_rule().match(_js_ext(symbols))
|
|
41
|
+
by_method = {h.http_methods[0]: h for h in hints}
|
|
42
|
+
assert set(by_method) == {"GET", "POST"}
|
|
43
|
+
assert all(h.route == "/api/me" for h in hints)
|
|
44
|
+
# handler left unbound + span set to the declaration line, so the scanner
|
|
45
|
+
# binds the route to the handler passed by reference into the wrapper.
|
|
46
|
+
assert by_method["GET"].handler_qualified_name is None
|
|
47
|
+
assert by_method["GET"].span is not None
|
|
48
|
+
assert by_method["GET"].span.start_line == 10
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def test_next_plain_function_handler_still_bound_directly():
|
|
52
|
+
# `export async function GET() {}` — the function IS the handler, so its qname
|
|
53
|
+
# is bound directly (no callback indirection needed).
|
|
54
|
+
hint = _next_rule().match(_js_ext([_sym("GET", SymbolKind.FUNCTION)]))[0]
|
|
55
|
+
assert hint.kind is EntrypointKind.HTTP_ROUTE
|
|
56
|
+
assert hint.handler_qualified_name == "apps.web.app.api.me.route.GET"
|
|
57
|
+
assert hint.span is None
|
|
58
|
+
assert hint.route == "/api/me"
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def test_next_route_at_top_level_app_dir():
|
|
62
|
+
# A repo whose app-router lives at the top level yields paths like
|
|
63
|
+
# `app/api/me/route.ts` (no leading slash before `app`); route derivation must
|
|
64
|
+
# still resolve rather than IndexError.
|
|
65
|
+
ext = _js_ext([_sym("GET", SymbolKind.FUNCTION)], path="app/api/me/route.ts")
|
|
66
|
+
hint = _next_rule().match(ext)[0]
|
|
67
|
+
assert hint.route == "/api/me"
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def test_next_ignores_non_method_symbols_and_non_route_files():
|
|
71
|
+
# A non-method export in a route file, and a method-named export outside a
|
|
72
|
+
# route file, must both be ignored.
|
|
73
|
+
assert _next_rule().match(_js_ext([_sym("helper", SymbolKind.VARIABLE)])) == []
|
|
74
|
+
off_route = _js_ext([_sym("GET", SymbolKind.VARIABLE)], path="apps/web/app/api/me/page.ts")
|
|
75
|
+
assert _next_rule().match(off_route) == []
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
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.39 → entrygraph-0.1.41}/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.39 → entrygraph-0.1.41}/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
|