entrygraph 0.1.44__tar.gz → 0.1.45__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (202) hide show
  1. {entrygraph-0.1.44 → entrygraph-0.1.45}/PKG-INFO +1 -1
  2. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/_version.py +2 -2
  3. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/detect/entrypoints/php.py +39 -2
  4. entrygraph-0.1.45/tests/test_entrypoints_php.py +66 -0
  5. {entrygraph-0.1.44 → entrygraph-0.1.45}/.github/workflows/ci.yml +0 -0
  6. {entrygraph-0.1.44 → entrygraph-0.1.45}/.github/workflows/release.yml +0 -0
  7. {entrygraph-0.1.44 → entrygraph-0.1.45}/.gitignore +0 -0
  8. {entrygraph-0.1.44 → entrygraph-0.1.45}/LICENSE +0 -0
  9. {entrygraph-0.1.44 → entrygraph-0.1.45}/README.md +0 -0
  10. {entrygraph-0.1.44 → entrygraph-0.1.45}/RELEASING.md +0 -0
  11. {entrygraph-0.1.44 → entrygraph-0.1.45}/pyproject.toml +0 -0
  12. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/__init__.py +0 -0
  13. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/__main__.py +0 -0
  14. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/api.py +0 -0
  15. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/cli/__init__.py +0 -0
  16. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/cli/main.py +0 -0
  17. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/cli/render.py +0 -0
  18. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/data/sinks/csharp.toml +0 -0
  19. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/data/sinks/go.toml +0 -0
  20. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/data/sinks/java.toml +0 -0
  21. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/data/sinks/javascript.toml +0 -0
  22. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/data/sinks/lib_javascript.toml +0 -0
  23. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/data/sinks/lib_python.toml +0 -0
  24. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/data/sinks/php.toml +0 -0
  25. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/data/sinks/python.toml +0 -0
  26. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/data/sinks/ruby.toml +0 -0
  27. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/data/sinks/rust.toml +0 -0
  28. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/db/__init__.py +0 -0
  29. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/db/engine.py +0 -0
  30. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/db/meta.py +0 -0
  31. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/db/models.py +0 -0
  32. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/db/queries.py +0 -0
  33. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/detect/__init__.py +0 -0
  34. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/detect/entrypoints/__init__.py +0 -0
  35. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/detect/entrypoints/base.py +0 -0
  36. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/detect/entrypoints/configs.py +0 -0
  37. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/detect/entrypoints/csharp.py +0 -0
  38. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/detect/entrypoints/golang.py +0 -0
  39. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/detect/entrypoints/java.py +0 -0
  40. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/detect/entrypoints/javascript.py +0 -0
  41. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/detect/entrypoints/python.py +0 -0
  42. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/detect/entrypoints/ruby.py +0 -0
  43. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/detect/entrypoints/rust.py +0 -0
  44. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/detect/frameworks.py +0 -0
  45. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/detect/manifests.py +0 -0
  46. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/detect/taint.py +0 -0
  47. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/errors.py +0 -0
  48. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/extract/__init__.py +0 -0
  49. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/extract/base.py +0 -0
  50. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/extract/csharp.py +0 -0
  51. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/extract/golang.py +0 -0
  52. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/extract/ir.py +0 -0
  53. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/extract/java.py +0 -0
  54. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/extract/javascript.py +0 -0
  55. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/extract/php.py +0 -0
  56. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/extract/python.py +0 -0
  57. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/extract/registry.py +0 -0
  58. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/extract/ruby.py +0 -0
  59. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/extract/rust.py +0 -0
  60. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/fs/__init__.py +0 -0
  61. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/fs/hashing.py +0 -0
  62. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/fs/lang.py +0 -0
  63. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/fs/walker.py +0 -0
  64. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/graph/__init__.py +0 -0
  65. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/graph/adjacency.py +0 -0
  66. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/graph/cte.py +0 -0
  67. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/graph/scoring.py +0 -0
  68. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/kinds.py +0 -0
  69. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/parsing/__init__.py +0 -0
  70. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/parsing/parsers.py +0 -0
  71. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/parsing/queries.py +0 -0
  72. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/pipeline/__init__.py +0 -0
  73. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/pipeline/scanner.py +0 -0
  74. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/pipeline/worker.py +0 -0
  75. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/pipeline/writer.py +0 -0
  76. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/py.typed +0 -0
  77. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/queries/csharp/calls.scm +0 -0
  78. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/queries/csharp/definitions.scm +0 -0
  79. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/queries/csharp/imports.scm +0 -0
  80. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/queries/go/calls.scm +0 -0
  81. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/queries/go/definitions.scm +0 -0
  82. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/queries/go/imports.scm +0 -0
  83. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/queries/java/calls.scm +0 -0
  84. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/queries/java/definitions.scm +0 -0
  85. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/queries/java/imports.scm +0 -0
  86. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/queries/javascript/calls.scm +0 -0
  87. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/queries/javascript/definitions.scm +0 -0
  88. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/queries/javascript/imports.scm +0 -0
  89. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/queries/php/calls.scm +0 -0
  90. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/queries/php/definitions.scm +0 -0
  91. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/queries/php/imports.scm +0 -0
  92. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/queries/python/calls.scm +0 -0
  93. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/queries/python/definitions.scm +0 -0
  94. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/queries/python/imports.scm +0 -0
  95. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/queries/ruby/calls.scm +0 -0
  96. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/queries/ruby/definitions.scm +0 -0
  97. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/queries/ruby/imports.scm +0 -0
  98. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/queries/rust/calls.scm +0 -0
  99. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/queries/rust/definitions.scm +0 -0
  100. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/queries/rust/imports.scm +0 -0
  101. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/resolve/__init__.py +0 -0
  102. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/resolve/externals.py +0 -0
  103. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/resolve/hierarchy.py +0 -0
  104. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/resolve/resolver.py +0 -0
  105. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/resolve/symbol_table.py +0 -0
  106. {entrygraph-0.1.44 → entrygraph-0.1.45}/src/entrygraph/results.py +0 -0
  107. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/conftest.py +0 -0
  108. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/csharp/aspnet_app/Controllers/ReportsController.cs +0 -0
  109. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/csharp/aspnet_app/Program.cs +0 -0
  110. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/csharp/aspnet_app/Services/ReportService.cs +0 -0
  111. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/csharp/aspnet_app/app.csproj +0 -0
  112. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/csharp/minimalapi_app/Program.cs +0 -0
  113. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/csharp/minimalapi_app/app.csproj +0 -0
  114. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/go/gin_app/go.mod +0 -0
  115. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/go/gin_app/main.go +0 -0
  116. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/go/gin_app/service.go +0 -0
  117. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/go/nethttp_app/go.mod +0 -0
  118. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/go/nethttp_app/main.go +0 -0
  119. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/java/methodref_app/pom.xml +0 -0
  120. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/java/methodref_app/src/main/java/com/example/App.java +0 -0
  121. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/java/spring_app/pom.xml +0 -0
  122. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/java/spring_app/src/main/java/com/example/Application.java +0 -0
  123. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/java/spring_app/src/main/java/com/example/ReportRunner.java +0 -0
  124. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/java/spring_app/src/main/java/com/example/ReportService.java +0 -0
  125. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/java/spring_app/src/main/java/com/example/UserController.java +0 -0
  126. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/javascript/commonjs_app/server.js +0 -0
  127. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/javascript/express_app/package.json +0 -0
  128. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/javascript/express_app/src/routes.js +0 -0
  129. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/javascript/express_app/src/services.js +0 -0
  130. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/php/laravel_app/app/Http/Controllers/ReportController.php +0 -0
  131. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/php/laravel_app/artisan +0 -0
  132. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/php/laravel_app/composer.json +0 -0
  133. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/php/laravel_app/routes/web.php +0 -0
  134. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/python/chained_sinks/app.py +0 -0
  135. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/python/flask_app/app/__init__.py +0 -0
  136. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/python/flask_app/app/db.py +0 -0
  137. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/python/flask_app/app/routes.py +0 -0
  138. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/python/flask_app/app/services.py +0 -0
  139. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/python/flask_app/cli.py +0 -0
  140. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/python/flask_app/requirements.txt +0 -0
  141. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/python/fuzzy_sink/app.py +0 -0
  142. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/python/heal_fidelity/caller.py +0 -0
  143. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/python/heal_fidelity/worker.py +0 -0
  144. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/python/may_continue/app.py +0 -0
  145. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/python/sanitizer/app.py +0 -0
  146. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/python/taint_source/handler.py +0 -0
  147. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/ruby/sinatra_app/Gemfile +0 -0
  148. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/ruby/sinatra_app/app.rb +0 -0
  149. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/ruby/sinatra_app/services/runner.rb +0 -0
  150. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/rust/axum_app/Cargo.toml +0 -0
  151. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/rust/axum_app/src/handlers.rs +0 -0
  152. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/rust/axum_app/src/main.rs +0 -0
  153. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/rust/axum_callback_app/Cargo.toml +0 -0
  154. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/rust/axum_callback_app/src/main.rs +0 -0
  155. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/rust/scoped_sink_app/Cargo.toml +0 -0
  156. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/fixtures/rust/scoped_sink_app/src/main.rs +0 -0
  157. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_api.py +0 -0
  158. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_cli.py +0 -0
  159. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_commonjs.py +0 -0
  160. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_csharp_callbacks.py +0 -0
  161. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_cte_bounds.py +0 -0
  162. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_engine_pragmas.py +0 -0
  163. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_entrypoint_expansion.py +0 -0
  164. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_entrypoints.py +0 -0
  165. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_entrypoints_go.py +0 -0
  166. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_entrypoints_javascript.py +0 -0
  167. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_entrypoints_ruby.py +0 -0
  168. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_extract_csharp.py +0 -0
  169. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_extract_go.py +0 -0
  170. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_extract_java.py +0 -0
  171. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_extract_javascript.py +0 -0
  172. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_extract_php.py +0 -0
  173. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_extract_python.py +0 -0
  174. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_extract_ruby.py +0 -0
  175. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_extract_rust.py +0 -0
  176. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_frameworks.py +0 -0
  177. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_fuzzy_sink.py +0 -0
  178. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_go_callbacks.py +0 -0
  179. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_hardening.py +0 -0
  180. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_heal_fidelity.py +0 -0
  181. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_incremental.py +0 -0
  182. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_indexer.py +0 -0
  183. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_java_callbacks.py +0 -0
  184. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_lang.py +0 -0
  185. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_manifests.py +0 -0
  186. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_may_continue.py +0 -0
  187. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_models.py +0 -0
  188. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_pool.py +0 -0
  189. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_reachability.py +0 -0
  190. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_registry_cache.py +0 -0
  191. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_render.py +0 -0
  192. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_resolver.py +0 -0
  193. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_rust_callbacks.py +0 -0
  194. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_rust_scoped_sinks.py +0 -0
  195. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_sanitizer_languages.py +0 -0
  196. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_scoring.py +0 -0
  197. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_sink_catalog.py +0 -0
  198. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_taint.py +0 -0
  199. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_taint_sanitizers.py +0 -0
  200. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_taint_sources.py +0 -0
  201. {entrygraph-0.1.44 → entrygraph-0.1.45}/tests/test_walker.py +0 -0
  202. {entrygraph-0.1.44 → entrygraph-0.1.45}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: entrygraph
3
- Version: 0.1.44
3
+ Version: 0.1.45
4
4
  Summary: Language-agnostic code graph: query symbols, entrypoints, and source-to-sink call paths from a SQLite index
5
5
  Project-URL: Repository, https://github.com/brettbergin/entrygraph
6
6
  Author-email: Brett Bergin <brettberginbc@yahoo.com>
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '0.1.44'
22
- __version_tuple__ = version_tuple = (0, 1, 44)
21
+ __version__ = version = '0.1.45'
22
+ __version_tuple__ = version_tuple = (0, 1, 45)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -14,6 +14,7 @@ import re
14
14
 
15
15
  from entrygraph.detect.entrypoints.base import (
16
16
  EntrypointRule,
17
+ compose_route,
17
18
  first_string_arg,
18
19
  register,
19
20
  )
@@ -23,6 +24,12 @@ from entrygraph.kinds import EntrypointKind, SymbolKind
23
24
  _LARAVEL_VERBS = frozenset({"get", "post", "put", "delete", "patch", "any", "match"})
24
25
  _LARAVEL_RESOURCE = frozenset({"resource", "apiResource"})
25
26
  _SYMFONY_ROUTE = re.compile(r"#\[\s*Route\s*\(")
27
+ # Symfony route paths can be positional (`#[Route('/x')]`) or the `path:` named arg
28
+ # (`#[Route(path: '/x')]`); methods live in `methods: ['GET', 'POST']` (or a bare
29
+ # string). `first_string_arg` covers the positional case.
30
+ _SYMFONY_PATH_KW = re.compile(r"""path\s*:\s*['"]([^'"]+)['"]""")
31
+ _SYMFONY_METHODS = re.compile(r"""methods\s*:\s*(?:\[([^\]]*)\]|['"]([^'"]+)['"])""")
32
+ _QUOTED_RE = re.compile(r"""['"]([^'"]+)['"]""")
26
33
  _WORDPRESS_HOOKS = frozenset({"add_action", "add_filter"})
27
34
  # register_rest_route($namespace, $route, ...). Anchor to the first two positional
28
35
  # args: arg 1 is the namespace (a literal like 'wp/v2' or a variable such as
@@ -160,20 +167,50 @@ def _laravel_routes(x: FileExtraction) -> list[EntrypointHint]:
160
167
  return hints
161
168
 
162
169
 
170
+ def _symfony_path(decorator: str) -> str | None:
171
+ """The route path from a `#[Route(...)]` attribute: the `path:` named arg if
172
+ present, else the first positional string."""
173
+ m = _SYMFONY_PATH_KW.search(decorator)
174
+ return m.group(1) if m else first_string_arg(decorator)
175
+
176
+
177
+ def _symfony_methods(decorator: str) -> list[str]:
178
+ """HTTP verbs from `methods: ['GET', 'POST']` / `methods: 'GET'`; empty if the
179
+ attribute omits `methods` (Symfony then allows all verbs)."""
180
+ m = _SYMFONY_METHODS.search(decorator)
181
+ if not m:
182
+ return []
183
+ body = m.group(1) if m.group(1) is not None else m.group(2)
184
+ verbs = [q.upper() for q in _QUOTED_RE.findall(body)]
185
+ if not verbs and body.strip(): # unquoted single value
186
+ verbs = [body.strip().upper()]
187
+ return verbs
188
+
189
+
163
190
  def _symfony_routes(x: FileExtraction) -> list[EntrypointHint]:
191
+ # class qname -> class-level #[Route(...)] path prefix (composed onto each
192
+ # method route, mirroring @Controller in NestJS and @RequestMapping in Spring).
193
+ prefixes: dict[str, str] = {}
194
+ for symbol in x.symbols:
195
+ if symbol.kind is SymbolKind.CLASS:
196
+ for decorator in symbol.decorators:
197
+ if _SYMFONY_ROUTE.search(decorator):
198
+ prefixes[symbol.qualified_name] = _symfony_path(decorator) or ""
199
+ break
164
200
  hints = []
165
201
  for symbol in x.symbols:
166
202
  if symbol.kind not in (SymbolKind.METHOD, SymbolKind.FUNCTION):
167
203
  continue
168
204
  for decorator in symbol.decorators:
169
205
  if _SYMFONY_ROUTE.search(decorator):
206
+ prefix = prefixes.get(symbol.parent_qualified_name or "", "")
170
207
  hints.append(
171
208
  EntrypointHint(
172
209
  rule_id="php.symfony.route",
173
210
  kind=EntrypointKind.HTTP_ROUTE,
174
211
  handler_qualified_name=symbol.qualified_name,
175
- route=first_string_arg(decorator) or "",
176
- http_methods=["*"],
212
+ route=compose_route(prefix, _symfony_path(decorator)),
213
+ http_methods=_symfony_methods(decorator) or ["*"],
177
214
  framework="symfony",
178
215
  )
179
216
  )
@@ -0,0 +1,66 @@
1
+ """PHP entrypoint-rule tests (kept per-language so PRs touching different
2
+ languages don't serially conflict on one shared test module)."""
3
+
4
+ from __future__ import annotations
5
+
6
+ from entrygraph.detect.entrypoints import rules_for
7
+ from entrygraph.detect.entrypoints.php import _symfony_methods, _symfony_path
8
+ from entrygraph.extract.base import FileContext
9
+ from entrygraph.extract.php import PhpExtractor
10
+ from entrygraph.parsing.parsers import parse
11
+
12
+
13
+ def _symfony_rule():
14
+ return {r.id: r for r in rules_for("php", {"symfony"})}["php.symfony.route"]
15
+
16
+
17
+ def _extract(src: bytes, path="src/Controller/UserController.php"):
18
+ ctx = FileContext(
19
+ path=path,
20
+ language="php",
21
+ module_path="App.Controller.UserController",
22
+ source=src,
23
+ is_package=False,
24
+ )
25
+ return PhpExtractor().extract(parse("php", src), ctx)
26
+
27
+
28
+ def test_symfony_class_route_prefix_composed():
29
+ # Class-level #[Route('/profile')] must prefix each method route, and
30
+ # methods: [...] must be honored (symfony-demo: 11/12 routes were wrong) (#36).
31
+ src = (
32
+ b"<?php\nnamespace App\\Controller;\n"
33
+ b"#[Route('/profile'), IsGranted(User::ROLE_USER)]\n"
34
+ b"final class UserController extends AbstractController\n{\n"
35
+ b" #[Route('/edit', name: 'user_edit', methods: ['GET', 'POST'])]\n"
36
+ b" public function edit() {}\n"
37
+ b" #[Route(path: '/pw', name: 'pw')]\n"
38
+ b" public function pw() {}\n"
39
+ b"}\n"
40
+ )
41
+ got = {(tuple(h.http_methods), h.route) for h in _symfony_rule().match(_extract(src))}
42
+ assert got == {
43
+ (("GET", "POST"), "/profile/edit"),
44
+ (("*",), "/profile/pw"), # path: named arg, no methods -> all verbs
45
+ }
46
+
47
+
48
+ def test_symfony_route_without_class_prefix():
49
+ # A controller with no class-level #[Route] leaves method routes unprefixed.
50
+ src = (
51
+ b"<?php\nnamespace App\\Controller;\n"
52
+ b"final class SecurityController extends AbstractController\n{\n"
53
+ b" #[Route('/login', name: 'login')]\n"
54
+ b" public function login() {}\n"
55
+ b"}\n"
56
+ )
57
+ got = {(tuple(h.http_methods), h.route) for h in _symfony_rule().match(_extract(src))}
58
+ assert got == {(("*",), "/login")}
59
+
60
+
61
+ def test_symfony_path_and_methods_parsing():
62
+ assert _symfony_path("#[Route('/edit', name: 'x')]") == "/edit"
63
+ assert _symfony_path("#[Route(path: '/pw', name: 'x')]") == "/pw"
64
+ assert _symfony_methods("#[Route('/x', methods: ['GET', 'POST'])]") == ["GET", "POST"]
65
+ assert _symfony_methods("#[Route('/x', methods: 'DELETE')]") == ["DELETE"]
66
+ assert _symfony_methods("#[Route('/x', name: 'x')]") == []
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes