entrygraph 0.1.35__tar.gz → 0.1.36__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.35 → entrygraph-0.1.36}/PKG-INFO +1 -1
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/_version.py +2 -2
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/detect/entrypoints/php.py +52 -6
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/test_entrypoint_expansion.py +48 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/.github/workflows/ci.yml +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/.github/workflows/release.yml +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/.gitignore +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/LICENSE +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/README.md +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/RELEASING.md +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/pyproject.toml +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/__init__.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/__main__.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/api.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/cli/__init__.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/cli/main.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/cli/render.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/data/sinks/csharp.toml +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/data/sinks/go.toml +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/data/sinks/java.toml +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/data/sinks/javascript.toml +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/data/sinks/lib_javascript.toml +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/data/sinks/lib_python.toml +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/data/sinks/php.toml +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/data/sinks/python.toml +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/data/sinks/ruby.toml +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/data/sinks/rust.toml +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/db/__init__.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/db/engine.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/db/meta.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/db/models.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/db/queries.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/detect/__init__.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/detect/entrypoints/__init__.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/detect/entrypoints/base.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/detect/entrypoints/configs.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/detect/entrypoints/csharp.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/detect/entrypoints/golang.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/detect/entrypoints/java.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/detect/entrypoints/javascript.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/detect/entrypoints/python.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/detect/entrypoints/ruby.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/detect/entrypoints/rust.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/detect/frameworks.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/detect/manifests.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/detect/taint.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/errors.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/extract/__init__.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/extract/base.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/extract/csharp.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/extract/golang.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/extract/ir.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/extract/java.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/extract/javascript.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/extract/php.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/extract/python.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/extract/registry.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/extract/ruby.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/extract/rust.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/fs/__init__.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/fs/hashing.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/fs/lang.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/fs/walker.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/graph/__init__.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/graph/adjacency.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/graph/cte.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/graph/scoring.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/kinds.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/parsing/__init__.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/parsing/parsers.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/parsing/queries.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/pipeline/__init__.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/pipeline/scanner.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/pipeline/worker.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/pipeline/writer.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/py.typed +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/queries/csharp/calls.scm +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/queries/csharp/definitions.scm +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/queries/csharp/imports.scm +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/queries/go/calls.scm +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/queries/go/definitions.scm +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/queries/go/imports.scm +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/queries/java/calls.scm +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/queries/java/definitions.scm +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/queries/java/imports.scm +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/queries/javascript/calls.scm +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/queries/javascript/definitions.scm +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/queries/javascript/imports.scm +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/queries/php/calls.scm +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/queries/php/definitions.scm +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/queries/php/imports.scm +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/queries/python/calls.scm +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/queries/python/definitions.scm +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/queries/python/imports.scm +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/queries/ruby/calls.scm +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/queries/ruby/definitions.scm +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/queries/ruby/imports.scm +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/queries/rust/calls.scm +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/queries/rust/definitions.scm +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/queries/rust/imports.scm +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/resolve/__init__.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/resolve/externals.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/resolve/hierarchy.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/resolve/resolver.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/resolve/symbol_table.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/src/entrygraph/results.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/conftest.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/fixtures/csharp/aspnet_app/Controllers/ReportsController.cs +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/fixtures/csharp/aspnet_app/Program.cs +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/fixtures/csharp/aspnet_app/Services/ReportService.cs +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/fixtures/csharp/aspnet_app/app.csproj +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/fixtures/csharp/minimalapi_app/Program.cs +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/fixtures/csharp/minimalapi_app/app.csproj +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/fixtures/go/gin_app/go.mod +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/fixtures/go/gin_app/main.go +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/fixtures/go/gin_app/service.go +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/fixtures/go/nethttp_app/go.mod +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/fixtures/go/nethttp_app/main.go +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/fixtures/java/methodref_app/pom.xml +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/fixtures/java/methodref_app/src/main/java/com/example/App.java +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/fixtures/java/spring_app/pom.xml +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/fixtures/java/spring_app/src/main/java/com/example/Application.java +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/fixtures/java/spring_app/src/main/java/com/example/ReportRunner.java +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/fixtures/java/spring_app/src/main/java/com/example/ReportService.java +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/fixtures/java/spring_app/src/main/java/com/example/UserController.java +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/fixtures/javascript/commonjs_app/server.js +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/fixtures/javascript/express_app/package.json +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/fixtures/javascript/express_app/src/routes.js +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/fixtures/javascript/express_app/src/services.js +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/fixtures/php/laravel_app/app/Http/Controllers/ReportController.php +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/fixtures/php/laravel_app/artisan +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/fixtures/php/laravel_app/composer.json +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/fixtures/php/laravel_app/routes/web.php +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/fixtures/python/chained_sinks/app.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/fixtures/python/flask_app/app/__init__.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/fixtures/python/flask_app/app/db.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/fixtures/python/flask_app/app/routes.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/fixtures/python/flask_app/app/services.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/fixtures/python/flask_app/cli.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/fixtures/python/flask_app/requirements.txt +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/fixtures/python/fuzzy_sink/app.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/fixtures/python/heal_fidelity/caller.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/fixtures/python/heal_fidelity/worker.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/fixtures/python/may_continue/app.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/fixtures/python/sanitizer/app.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/fixtures/python/taint_source/handler.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/fixtures/ruby/sinatra_app/Gemfile +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/fixtures/ruby/sinatra_app/app.rb +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/fixtures/ruby/sinatra_app/services/runner.rb +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/fixtures/rust/axum_app/Cargo.toml +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/fixtures/rust/axum_app/src/handlers.rs +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/fixtures/rust/axum_app/src/main.rs +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/fixtures/rust/axum_callback_app/Cargo.toml +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/fixtures/rust/axum_callback_app/src/main.rs +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/fixtures/rust/scoped_sink_app/Cargo.toml +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/fixtures/rust/scoped_sink_app/src/main.rs +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/test_api.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/test_cli.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/test_commonjs.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/test_csharp_callbacks.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/test_cte_bounds.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/test_engine_pragmas.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/test_entrypoints.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/test_extract_csharp.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/test_extract_go.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/test_extract_java.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/test_extract_javascript.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/test_extract_php.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/test_extract_python.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/test_extract_ruby.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/test_extract_rust.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/test_frameworks.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/test_fuzzy_sink.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/test_go_callbacks.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/test_hardening.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/test_heal_fidelity.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/test_incremental.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/test_indexer.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/test_java_callbacks.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/test_lang.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/test_manifests.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/test_may_continue.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/test_models.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/test_pool.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/test_reachability.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/test_registry_cache.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/test_render.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/test_resolver.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/test_rust_callbacks.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/test_rust_scoped_sinks.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/test_sanitizer_languages.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/test_scoring.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/test_sink_catalog.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/test_taint.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/test_taint_sanitizers.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/test_taint_sources.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/tests/test_walker.py +0 -0
- {entrygraph-0.1.35 → entrygraph-0.1.36}/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.36
|
|
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.36'
|
|
22
|
+
__version_tuple__ = version_tuple = (0, 1, 36)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -21,21 +21,49 @@ from entrygraph.extract.ir import EntrypointHint, FileExtraction
|
|
|
21
21
|
from entrygraph.kinds import EntrypointKind, SymbolKind
|
|
22
22
|
|
|
23
23
|
_LARAVEL_VERBS = frozenset({"get", "post", "put", "delete", "patch", "any", "match"})
|
|
24
|
+
_LARAVEL_RESOURCE = frozenset({"resource", "apiResource"})
|
|
24
25
|
_SYMFONY_ROUTE = re.compile(r"#\[\s*Route\s*\(")
|
|
25
26
|
_WORDPRESS_HOOKS = frozenset({"add_action", "add_filter"})
|
|
26
27
|
|
|
27
28
|
|
|
29
|
+
def _resource_param(name: str) -> str:
|
|
30
|
+
"""The Laravel resource param: singular of the last (dot-nested) segment —
|
|
31
|
+
`photos` -> `{photo}`, `blog.comments` -> `{comment}`."""
|
|
32
|
+
seg = name.strip("/").split(".")[-1]
|
|
33
|
+
singular = seg[:-1] if seg.endswith("s") and not seg.endswith("ss") else seg
|
|
34
|
+
return "{" + (singular or "id") + "}"
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def _resource_routes(name: str, is_api: bool) -> list[tuple[str, str]]:
|
|
38
|
+
"""Expand Route::resource/apiResource into its REST (method, path) routes.
|
|
39
|
+
|
|
40
|
+
apiResource omits the HTML create/edit forms that resource adds.
|
|
41
|
+
"""
|
|
42
|
+
base = "/" + name.strip("/").replace(".", "/")
|
|
43
|
+
param = _resource_param(name)
|
|
44
|
+
routes = [
|
|
45
|
+
("GET", base), # index
|
|
46
|
+
("POST", base), # store
|
|
47
|
+
("GET", f"{base}/{param}"), # show
|
|
48
|
+
("PUT", f"{base}/{param}"), # update
|
|
49
|
+
("DELETE", f"{base}/{param}"), # destroy
|
|
50
|
+
]
|
|
51
|
+
if not is_api:
|
|
52
|
+
routes += [
|
|
53
|
+
("GET", f"{base}/create"), # create form
|
|
54
|
+
("GET", f"{base}/{param}/edit"), # edit form
|
|
55
|
+
]
|
|
56
|
+
return routes
|
|
57
|
+
|
|
58
|
+
|
|
28
59
|
def _laravel_routes(x: FileExtraction) -> list[EntrypointHint]:
|
|
29
60
|
if not re.search(r"(^|/)routes/[^/]+\.php$", x.path):
|
|
30
61
|
return []
|
|
31
62
|
hints = []
|
|
32
63
|
for ref in x.references:
|
|
33
|
-
if
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
and ref.callee_name in _LARAVEL_VERBS
|
|
37
|
-
and ref.arg_preview
|
|
38
|
-
):
|
|
64
|
+
if ref.kind != "call" or ref.receiver_text != "Route" or not ref.arg_preview:
|
|
65
|
+
continue
|
|
66
|
+
if ref.callee_name in _LARAVEL_VERBS:
|
|
39
67
|
route = first_string_arg("(" + ref.arg_preview.lstrip("("))
|
|
40
68
|
hints.append(
|
|
41
69
|
EntrypointHint(
|
|
@@ -50,6 +78,24 @@ def _laravel_routes(x: FileExtraction) -> list[EntrypointHint]:
|
|
|
50
78
|
metadata={"registration": ref.arg_preview},
|
|
51
79
|
)
|
|
52
80
|
)
|
|
81
|
+
elif ref.callee_name in _LARAVEL_RESOURCE:
|
|
82
|
+
# Route::resource('photos', Ctrl) / apiResource(...) registers a fixed
|
|
83
|
+
# set of REST routes at once; expand them so they aren't all missed.
|
|
84
|
+
name = first_string_arg("(" + ref.arg_preview.lstrip("("))
|
|
85
|
+
if not name:
|
|
86
|
+
continue
|
|
87
|
+
for method, route in _resource_routes(name, ref.callee_name == "apiResource"):
|
|
88
|
+
hints.append(
|
|
89
|
+
EntrypointHint(
|
|
90
|
+
rule_id="php.laravel.resource",
|
|
91
|
+
kind=EntrypointKind.HTTP_ROUTE,
|
|
92
|
+
handler_qualified_name=None,
|
|
93
|
+
route=route,
|
|
94
|
+
http_methods=[method],
|
|
95
|
+
framework="laravel",
|
|
96
|
+
metadata={"registration": ref.arg_preview},
|
|
97
|
+
)
|
|
98
|
+
)
|
|
53
99
|
return hints
|
|
54
100
|
|
|
55
101
|
|
|
@@ -440,3 +440,51 @@ def test_rails_routes_read_from_split_route_files():
|
|
|
440
440
|
assert [h.route for h in main] == ["/health"]
|
|
441
441
|
assert [h.route for h in split] == ["/users"] # the split file is now read
|
|
442
442
|
assert unrelated == [] # a non-routes file is still ignored
|
|
443
|
+
|
|
444
|
+
|
|
445
|
+
def test_laravel_resource_expansion():
|
|
446
|
+
from entrygraph.detect.entrypoints.php import _resource_routes
|
|
447
|
+
|
|
448
|
+
api = _resource_routes("articles", is_api=True)
|
|
449
|
+
assert set(api) == {
|
|
450
|
+
("GET", "/articles"),
|
|
451
|
+
("POST", "/articles"),
|
|
452
|
+
("GET", "/articles/{article}"),
|
|
453
|
+
("PUT", "/articles/{article}"),
|
|
454
|
+
("DELETE", "/articles/{article}"),
|
|
455
|
+
}
|
|
456
|
+
# resource() adds the HTML create/edit forms that apiResource omits
|
|
457
|
+
full = dict.fromkeys(r for r in _resource_routes("photos", is_api=False))
|
|
458
|
+
assert ("GET", "/photos/create") in full
|
|
459
|
+
assert ("GET", "/photos/{photo}/edit") in full
|
|
460
|
+
assert len(full) == 7
|
|
461
|
+
# nested resource: last segment is singularized, dots become path separators
|
|
462
|
+
nested = _resource_routes("blog.comments", is_api=True)
|
|
463
|
+
assert ("GET", "/blog/comments/{comment}") in nested
|
|
464
|
+
|
|
465
|
+
|
|
466
|
+
def test_laravel_apiresource_rule_emits_rest_routes():
|
|
467
|
+
from entrygraph.detect.entrypoints import rules_for
|
|
468
|
+
|
|
469
|
+
ref = RawReference(
|
|
470
|
+
kind="call",
|
|
471
|
+
callee_text="Route::apiResource",
|
|
472
|
+
callee_name="apiResource",
|
|
473
|
+
receiver_text="Route",
|
|
474
|
+
span=SPAN,
|
|
475
|
+
caller_qualified_name=None,
|
|
476
|
+
arg_preview="('articles', ArticleController::class)",
|
|
477
|
+
)
|
|
478
|
+
x = FileExtraction(
|
|
479
|
+
path="routes/api.php",
|
|
480
|
+
language="php",
|
|
481
|
+
module_path="routes.api",
|
|
482
|
+
parse_ok=True,
|
|
483
|
+
error_count=0,
|
|
484
|
+
symbols=[],
|
|
485
|
+
references=[ref],
|
|
486
|
+
)
|
|
487
|
+
rule = {r.id: r for r in rules_for("php", {"laravel"})}["php.laravel.route"]
|
|
488
|
+
got = {(h.http_methods[0], h.route) for h in rule.match(x)}
|
|
489
|
+
assert ("GET", "/articles") in got and ("DELETE", "/articles/{article}") in got
|
|
490
|
+
assert ("GET", "/articles/create") not in got # apiResource omits forms
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
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.35 → entrygraph-0.1.36}/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.35 → entrygraph-0.1.36}/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
|