entrygraph 0.1.38__tar.gz → 0.1.40__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.38 → entrygraph-0.1.40}/PKG-INFO +1 -1
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/_version.py +2 -2
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/detect/entrypoints/golang.py +57 -1
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/detect/entrypoints/javascript.py +32 -15
- entrygraph-0.1.40/tests/test_entrypoints_go.py +73 -0
- entrygraph-0.1.40/tests/test_entrypoints_javascript.py +75 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/.github/workflows/ci.yml +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/.github/workflows/release.yml +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/.gitignore +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/LICENSE +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/README.md +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/RELEASING.md +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/pyproject.toml +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/__init__.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/__main__.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/api.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/cli/__init__.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/cli/main.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/cli/render.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/data/sinks/csharp.toml +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/data/sinks/go.toml +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/data/sinks/java.toml +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/data/sinks/javascript.toml +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/data/sinks/lib_javascript.toml +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/data/sinks/lib_python.toml +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/data/sinks/php.toml +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/data/sinks/python.toml +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/data/sinks/ruby.toml +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/data/sinks/rust.toml +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/db/__init__.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/db/engine.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/db/meta.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/db/models.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/db/queries.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/detect/__init__.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/detect/entrypoints/__init__.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/detect/entrypoints/base.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/detect/entrypoints/configs.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/detect/entrypoints/csharp.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/detect/entrypoints/java.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/detect/entrypoints/php.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/detect/entrypoints/python.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/detect/entrypoints/ruby.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/detect/entrypoints/rust.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/detect/frameworks.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/detect/manifests.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/detect/taint.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/errors.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/extract/__init__.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/extract/base.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/extract/csharp.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/extract/golang.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/extract/ir.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/extract/java.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/extract/javascript.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/extract/php.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/extract/python.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/extract/registry.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/extract/ruby.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/extract/rust.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/fs/__init__.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/fs/hashing.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/fs/lang.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/fs/walker.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/graph/__init__.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/graph/adjacency.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/graph/cte.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/graph/scoring.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/kinds.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/parsing/__init__.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/parsing/parsers.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/parsing/queries.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/pipeline/__init__.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/pipeline/scanner.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/pipeline/worker.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/pipeline/writer.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/py.typed +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/queries/csharp/calls.scm +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/queries/csharp/definitions.scm +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/queries/csharp/imports.scm +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/queries/go/calls.scm +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/queries/go/definitions.scm +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/queries/go/imports.scm +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/queries/java/calls.scm +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/queries/java/definitions.scm +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/queries/java/imports.scm +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/queries/javascript/calls.scm +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/queries/javascript/definitions.scm +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/queries/javascript/imports.scm +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/queries/php/calls.scm +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/queries/php/definitions.scm +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/queries/php/imports.scm +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/queries/python/calls.scm +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/queries/python/definitions.scm +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/queries/python/imports.scm +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/queries/ruby/calls.scm +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/queries/ruby/definitions.scm +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/queries/ruby/imports.scm +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/queries/rust/calls.scm +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/queries/rust/definitions.scm +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/queries/rust/imports.scm +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/resolve/__init__.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/resolve/externals.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/resolve/hierarchy.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/resolve/resolver.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/resolve/symbol_table.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/src/entrygraph/results.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/conftest.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/fixtures/csharp/aspnet_app/Controllers/ReportsController.cs +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/fixtures/csharp/aspnet_app/Program.cs +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/fixtures/csharp/aspnet_app/Services/ReportService.cs +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/fixtures/csharp/aspnet_app/app.csproj +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/fixtures/csharp/minimalapi_app/Program.cs +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/fixtures/csharp/minimalapi_app/app.csproj +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/fixtures/go/gin_app/go.mod +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/fixtures/go/gin_app/main.go +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/fixtures/go/gin_app/service.go +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/fixtures/go/nethttp_app/go.mod +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/fixtures/go/nethttp_app/main.go +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/fixtures/java/methodref_app/pom.xml +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/fixtures/java/methodref_app/src/main/java/com/example/App.java +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/fixtures/java/spring_app/pom.xml +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/fixtures/java/spring_app/src/main/java/com/example/Application.java +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/fixtures/java/spring_app/src/main/java/com/example/ReportRunner.java +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/fixtures/java/spring_app/src/main/java/com/example/ReportService.java +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/fixtures/java/spring_app/src/main/java/com/example/UserController.java +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/fixtures/javascript/commonjs_app/server.js +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/fixtures/javascript/express_app/package.json +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/fixtures/javascript/express_app/src/routes.js +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/fixtures/javascript/express_app/src/services.js +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/fixtures/php/laravel_app/app/Http/Controllers/ReportController.php +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/fixtures/php/laravel_app/artisan +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/fixtures/php/laravel_app/composer.json +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/fixtures/php/laravel_app/routes/web.php +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/fixtures/python/chained_sinks/app.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/fixtures/python/flask_app/app/__init__.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/fixtures/python/flask_app/app/db.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/fixtures/python/flask_app/app/routes.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/fixtures/python/flask_app/app/services.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/fixtures/python/flask_app/cli.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/fixtures/python/flask_app/requirements.txt +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/fixtures/python/fuzzy_sink/app.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/fixtures/python/heal_fidelity/caller.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/fixtures/python/heal_fidelity/worker.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/fixtures/python/may_continue/app.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/fixtures/python/sanitizer/app.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/fixtures/python/taint_source/handler.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/fixtures/ruby/sinatra_app/Gemfile +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/fixtures/ruby/sinatra_app/app.rb +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/fixtures/ruby/sinatra_app/services/runner.rb +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/fixtures/rust/axum_app/Cargo.toml +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/fixtures/rust/axum_app/src/handlers.rs +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/fixtures/rust/axum_app/src/main.rs +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/fixtures/rust/axum_callback_app/Cargo.toml +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/fixtures/rust/axum_callback_app/src/main.rs +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/fixtures/rust/scoped_sink_app/Cargo.toml +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/fixtures/rust/scoped_sink_app/src/main.rs +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/test_api.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/test_cli.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/test_commonjs.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/test_csharp_callbacks.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/test_cte_bounds.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/test_engine_pragmas.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/test_entrypoint_expansion.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/test_entrypoints.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/test_extract_csharp.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/test_extract_go.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/test_extract_java.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/test_extract_javascript.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/test_extract_php.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/test_extract_python.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/test_extract_ruby.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/test_extract_rust.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/test_frameworks.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/test_fuzzy_sink.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/test_go_callbacks.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/test_hardening.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/test_heal_fidelity.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/test_incremental.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/test_indexer.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/test_java_callbacks.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/test_lang.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/test_manifests.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/test_may_continue.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/test_models.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/test_pool.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/test_reachability.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/test_registry_cache.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/test_render.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/test_resolver.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/test_rust_callbacks.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/test_rust_scoped_sinks.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/test_sanitizer_languages.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/test_scoring.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/test_sink_catalog.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/test_taint.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/test_taint_sanitizers.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/test_taint_sources.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/tests/test_walker.py +0 -0
- {entrygraph-0.1.38 → entrygraph-0.1.40}/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.40
|
|
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.40'
|
|
22
|
+
__version_tuple__ = version_tuple = (0, 1, 40)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -116,6 +116,62 @@ def _gin_style(framework: str):
|
|
|
116
116
|
return matcher
|
|
117
117
|
|
|
118
118
|
|
|
119
|
+
def _compose_prefixes(parts: list[str]) -> str:
|
|
120
|
+
segs = [p.strip("/") for p in parts if p and p.strip("/")]
|
|
121
|
+
return "/" + "/".join(segs)
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
def _chi_routes(x: FileExtraction) -> list[EntrypointHint]:
|
|
125
|
+
"""chi routes, with `r.Route("/prefix", func(r){...})` sub-router prefixes.
|
|
126
|
+
|
|
127
|
+
Route nests its sub-routes in an inline closure, so a verb route whose line
|
|
128
|
+
falls inside a Route call's span gets that prefix (nested Routes stack). Mount
|
|
129
|
+
(`r.Mount("/api", subRouter())`) points at a router built in another function,
|
|
130
|
+
which is out of static reach, so its prefix isn't composed."""
|
|
131
|
+
scopes: list[tuple[int, int, str]] = []
|
|
132
|
+
for ref in x.references:
|
|
133
|
+
if (
|
|
134
|
+
ref.kind == "call"
|
|
135
|
+
and ref.callee_name in ("Route", "Mount")
|
|
136
|
+
and ref.receiver_text is not None
|
|
137
|
+
and ref.arg_preview
|
|
138
|
+
and ref.span.end_line > ref.span.start_line # has an inline closure body
|
|
139
|
+
):
|
|
140
|
+
prefix = first_string_arg("(" + ref.arg_preview.lstrip("("))
|
|
141
|
+
if prefix and prefix.startswith("/"):
|
|
142
|
+
scopes.append((ref.span.start_line, ref.span.end_line, prefix))
|
|
143
|
+
scopes.sort()
|
|
144
|
+
|
|
145
|
+
hints = []
|
|
146
|
+
for ref in x.references:
|
|
147
|
+
if (
|
|
148
|
+
ref.kind != "call"
|
|
149
|
+
or ref.receiver_text is None
|
|
150
|
+
or ref.callee_name not in _GIN_METHODS
|
|
151
|
+
or not ref.arg_preview
|
|
152
|
+
):
|
|
153
|
+
continue
|
|
154
|
+
route = first_string_arg("(" + ref.arg_preview.lstrip("("))
|
|
155
|
+
if route is None or not route.startswith("/"):
|
|
156
|
+
continue
|
|
157
|
+
verb = ref.callee_name.upper()
|
|
158
|
+
method = verb if verb in _HTTP_VERBS else "*"
|
|
159
|
+
line = ref.span.start_line
|
|
160
|
+
prefixes = [p for (s, e, p) in scopes if s < line <= e]
|
|
161
|
+
hints.append(
|
|
162
|
+
EntrypointHint(
|
|
163
|
+
rule_id="go.chi.route",
|
|
164
|
+
kind=EntrypointKind.HTTP_ROUTE,
|
|
165
|
+
handler_qualified_name=ref.caller_qualified_name,
|
|
166
|
+
route=_compose_prefixes([*prefixes, route]),
|
|
167
|
+
http_methods=[method],
|
|
168
|
+
framework="chi",
|
|
169
|
+
metadata={"registration": ref.arg_preview},
|
|
170
|
+
)
|
|
171
|
+
)
|
|
172
|
+
return hints
|
|
173
|
+
|
|
174
|
+
|
|
119
175
|
_QUOTED = re.compile(r'"([^"]+)"')
|
|
120
176
|
|
|
121
177
|
|
|
@@ -185,7 +241,7 @@ register(
|
|
|
185
241
|
EntrypointRule("go.nethttp.route", "go", "net/http", EntrypointKind.HTTP_ROUTE, _nethttp_routes)
|
|
186
242
|
)
|
|
187
243
|
register(EntrypointRule("go.gin.route", "go", "gin", EntrypointKind.HTTP_ROUTE, _gin_routes))
|
|
188
|
-
register(EntrypointRule("go.chi.route", "go", "chi", EntrypointKind.HTTP_ROUTE,
|
|
244
|
+
register(EntrypointRule("go.chi.route", "go", "chi", EntrypointKind.HTTP_ROUTE, _chi_routes))
|
|
189
245
|
register(
|
|
190
246
|
EntrypointRule("go.fiber.route", "go", "fiber", EntrypointKind.HTTP_ROUTE, _gin_style("fiber"))
|
|
191
247
|
)
|
|
@@ -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
|
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"""Go 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.ir import FileExtraction, RawReference, Span
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def _go_ext(references, path="main.go"):
|
|
11
|
+
return FileExtraction(
|
|
12
|
+
path=path,
|
|
13
|
+
language="go",
|
|
14
|
+
module_path="app",
|
|
15
|
+
parse_ok=True,
|
|
16
|
+
error_count=0,
|
|
17
|
+
symbols=[],
|
|
18
|
+
references=list(references),
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _call(callee, receiver, arg, start=1, end=None):
|
|
23
|
+
return RawReference(
|
|
24
|
+
kind="call",
|
|
25
|
+
callee_text=f"{receiver}.{callee}" if receiver else callee,
|
|
26
|
+
callee_name=callee,
|
|
27
|
+
receiver_text=receiver,
|
|
28
|
+
span=Span(start, 0, end if end is not None else start, 40),
|
|
29
|
+
caller_qualified_name="app.routes",
|
|
30
|
+
arg_preview=arg,
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def _chi_rule():
|
|
35
|
+
return {r.id: r for r in rules_for("go", {"chi"})}["go.chi.route"]
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def test_chi_route_prefix_is_composed():
|
|
39
|
+
# r.Route("/admin", func(r){ r.Get("/users", h); r.Post("/users", h) }) — the
|
|
40
|
+
# inner verb routes fall inside the Route call's span and get the prefix (#37).
|
|
41
|
+
refs = [
|
|
42
|
+
_call("Get", "r", '("/health", health)', start=2),
|
|
43
|
+
_call("Route", "r", '("/admin", func(r chi.Router) { ... })', start=3, end=6),
|
|
44
|
+
_call("Get", "r", '("/users", listUsers)', start=4),
|
|
45
|
+
_call("Post", "r", '("/users", createUser)', start=5),
|
|
46
|
+
]
|
|
47
|
+
got = {(h.http_methods[0], h.route) for h in _chi_rule().match(_go_ext(refs))}
|
|
48
|
+
assert got == {
|
|
49
|
+
("GET", "/health"), # top-level, no prefix
|
|
50
|
+
("GET", "/admin/users"), # composed with the enclosing Route prefix
|
|
51
|
+
("POST", "/admin/users"),
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def test_chi_nested_route_prefixes_stack():
|
|
56
|
+
refs = [
|
|
57
|
+
_call("Route", "r", '("/api", func(r){ ... })', start=1, end=6),
|
|
58
|
+
_call("Route", "r", '("/v1", func(r){ ... })', start=2, end=5),
|
|
59
|
+
_call("Get", "r", '("/users", h)', start=3),
|
|
60
|
+
]
|
|
61
|
+
got = {(h.http_methods[0], h.route) for h in _chi_rule().match(_go_ext(refs))}
|
|
62
|
+
assert got == {("GET", "/api/v1/users")} # both enclosing prefixes stack
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def test_chi_mount_prefix_not_composed_across_functions():
|
|
66
|
+
# r.Mount("/api", apiRouter()) points at a router built elsewhere (single-line,
|
|
67
|
+
# no inline body) — its prefix is out of static reach and must not be applied.
|
|
68
|
+
refs = [
|
|
69
|
+
_call("Mount", "r", '("/api", apiRouter())', start=1),
|
|
70
|
+
_call("Get", "r", '("/health", h)', start=2),
|
|
71
|
+
]
|
|
72
|
+
got = {(h.http_methods[0], h.route) for h in _chi_rule().match(_go_ext(refs))}
|
|
73
|
+
assert got == {("GET", "/health")} # no phantom /api prefix
|
|
@@ -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
|
|
File without changes
|
{entrygraph-0.1.38 → entrygraph-0.1.40}/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.38 → entrygraph-0.1.40}/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
|