entrygraph 0.1.22__tar.gz → 0.1.24__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 (194) hide show
  1. {entrygraph-0.1.22 → entrygraph-0.1.24}/PKG-INFO +1 -1
  2. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/_version.py +2 -2
  3. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/extract/rust.py +32 -2
  4. entrygraph-0.1.24/tests/fixtures/rust/axum_callback_app/Cargo.toml +7 -0
  5. entrygraph-0.1.24/tests/fixtures/rust/axum_callback_app/src/main.rs +10 -0
  6. entrygraph-0.1.24/tests/fixtures/rust/scoped_sink_app/Cargo.toml +4 -0
  7. entrygraph-0.1.24/tests/fixtures/rust/scoped_sink_app/src/main.rs +7 -0
  8. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_extract_rust.py +23 -1
  9. entrygraph-0.1.24/tests/test_rust_callbacks.py +44 -0
  10. entrygraph-0.1.24/tests/test_rust_scoped_sinks.py +43 -0
  11. {entrygraph-0.1.22 → entrygraph-0.1.24}/.github/workflows/ci.yml +0 -0
  12. {entrygraph-0.1.22 → entrygraph-0.1.24}/.github/workflows/release.yml +0 -0
  13. {entrygraph-0.1.22 → entrygraph-0.1.24}/.gitignore +0 -0
  14. {entrygraph-0.1.22 → entrygraph-0.1.24}/LICENSE +0 -0
  15. {entrygraph-0.1.22 → entrygraph-0.1.24}/README.md +0 -0
  16. {entrygraph-0.1.22 → entrygraph-0.1.24}/RELEASING.md +0 -0
  17. {entrygraph-0.1.22 → entrygraph-0.1.24}/pyproject.toml +0 -0
  18. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/__init__.py +0 -0
  19. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/__main__.py +0 -0
  20. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/api.py +0 -0
  21. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/cli/__init__.py +0 -0
  22. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/cli/main.py +0 -0
  23. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/cli/render.py +0 -0
  24. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/data/sinks/csharp.toml +0 -0
  25. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/data/sinks/go.toml +0 -0
  26. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/data/sinks/java.toml +0 -0
  27. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/data/sinks/javascript.toml +0 -0
  28. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/data/sinks/lib_javascript.toml +0 -0
  29. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/data/sinks/lib_python.toml +0 -0
  30. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/data/sinks/php.toml +0 -0
  31. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/data/sinks/python.toml +0 -0
  32. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/data/sinks/ruby.toml +0 -0
  33. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/data/sinks/rust.toml +0 -0
  34. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/db/__init__.py +0 -0
  35. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/db/engine.py +0 -0
  36. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/db/meta.py +0 -0
  37. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/db/models.py +0 -0
  38. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/db/queries.py +0 -0
  39. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/detect/__init__.py +0 -0
  40. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/detect/entrypoints/__init__.py +0 -0
  41. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/detect/entrypoints/base.py +0 -0
  42. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/detect/entrypoints/configs.py +0 -0
  43. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/detect/entrypoints/csharp.py +0 -0
  44. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/detect/entrypoints/golang.py +0 -0
  45. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/detect/entrypoints/java.py +0 -0
  46. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/detect/entrypoints/javascript.py +0 -0
  47. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/detect/entrypoints/php.py +0 -0
  48. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/detect/entrypoints/python.py +0 -0
  49. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/detect/entrypoints/ruby.py +0 -0
  50. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/detect/entrypoints/rust.py +0 -0
  51. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/detect/frameworks.py +0 -0
  52. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/detect/manifests.py +0 -0
  53. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/detect/taint.py +0 -0
  54. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/errors.py +0 -0
  55. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/extract/__init__.py +0 -0
  56. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/extract/base.py +0 -0
  57. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/extract/csharp.py +0 -0
  58. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/extract/golang.py +0 -0
  59. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/extract/ir.py +0 -0
  60. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/extract/java.py +0 -0
  61. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/extract/javascript.py +0 -0
  62. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/extract/php.py +0 -0
  63. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/extract/python.py +0 -0
  64. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/extract/registry.py +0 -0
  65. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/extract/ruby.py +0 -0
  66. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/fs/__init__.py +0 -0
  67. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/fs/hashing.py +0 -0
  68. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/fs/lang.py +0 -0
  69. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/fs/walker.py +0 -0
  70. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/graph/__init__.py +0 -0
  71. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/graph/adjacency.py +0 -0
  72. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/graph/cte.py +0 -0
  73. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/graph/scoring.py +0 -0
  74. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/kinds.py +0 -0
  75. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/parsing/__init__.py +0 -0
  76. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/parsing/parsers.py +0 -0
  77. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/parsing/queries.py +0 -0
  78. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/pipeline/__init__.py +0 -0
  79. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/pipeline/scanner.py +0 -0
  80. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/pipeline/worker.py +0 -0
  81. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/pipeline/writer.py +0 -0
  82. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/py.typed +0 -0
  83. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/queries/csharp/calls.scm +0 -0
  84. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/queries/csharp/definitions.scm +0 -0
  85. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/queries/csharp/imports.scm +0 -0
  86. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/queries/go/calls.scm +0 -0
  87. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/queries/go/definitions.scm +0 -0
  88. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/queries/go/imports.scm +0 -0
  89. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/queries/java/calls.scm +0 -0
  90. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/queries/java/definitions.scm +0 -0
  91. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/queries/java/imports.scm +0 -0
  92. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/queries/javascript/calls.scm +0 -0
  93. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/queries/javascript/definitions.scm +0 -0
  94. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/queries/javascript/imports.scm +0 -0
  95. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/queries/php/calls.scm +0 -0
  96. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/queries/php/definitions.scm +0 -0
  97. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/queries/php/imports.scm +0 -0
  98. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/queries/python/calls.scm +0 -0
  99. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/queries/python/definitions.scm +0 -0
  100. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/queries/python/imports.scm +0 -0
  101. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/queries/ruby/calls.scm +0 -0
  102. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/queries/ruby/definitions.scm +0 -0
  103. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/queries/ruby/imports.scm +0 -0
  104. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/queries/rust/calls.scm +0 -0
  105. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/queries/rust/definitions.scm +0 -0
  106. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/queries/rust/imports.scm +0 -0
  107. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/resolve/__init__.py +0 -0
  108. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/resolve/externals.py +0 -0
  109. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/resolve/hierarchy.py +0 -0
  110. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/resolve/resolver.py +0 -0
  111. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/resolve/symbol_table.py +0 -0
  112. {entrygraph-0.1.22 → entrygraph-0.1.24}/src/entrygraph/results.py +0 -0
  113. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/conftest.py +0 -0
  114. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/csharp/aspnet_app/Controllers/ReportsController.cs +0 -0
  115. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/csharp/aspnet_app/Program.cs +0 -0
  116. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/csharp/aspnet_app/Services/ReportService.cs +0 -0
  117. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/csharp/aspnet_app/app.csproj +0 -0
  118. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/csharp/minimalapi_app/Program.cs +0 -0
  119. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/csharp/minimalapi_app/app.csproj +0 -0
  120. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/go/gin_app/go.mod +0 -0
  121. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/go/gin_app/main.go +0 -0
  122. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/go/gin_app/service.go +0 -0
  123. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/go/nethttp_app/go.mod +0 -0
  124. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/go/nethttp_app/main.go +0 -0
  125. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/java/spring_app/pom.xml +0 -0
  126. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/java/spring_app/src/main/java/com/example/Application.java +0 -0
  127. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/java/spring_app/src/main/java/com/example/ReportRunner.java +0 -0
  128. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/java/spring_app/src/main/java/com/example/ReportService.java +0 -0
  129. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/java/spring_app/src/main/java/com/example/UserController.java +0 -0
  130. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/javascript/commonjs_app/server.js +0 -0
  131. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/javascript/express_app/package.json +0 -0
  132. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/javascript/express_app/src/routes.js +0 -0
  133. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/javascript/express_app/src/services.js +0 -0
  134. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/php/laravel_app/app/Http/Controllers/ReportController.php +0 -0
  135. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/php/laravel_app/artisan +0 -0
  136. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/php/laravel_app/composer.json +0 -0
  137. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/php/laravel_app/routes/web.php +0 -0
  138. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/python/chained_sinks/app.py +0 -0
  139. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/python/flask_app/app/__init__.py +0 -0
  140. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/python/flask_app/app/db.py +0 -0
  141. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/python/flask_app/app/routes.py +0 -0
  142. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/python/flask_app/app/services.py +0 -0
  143. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/python/flask_app/cli.py +0 -0
  144. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/python/flask_app/requirements.txt +0 -0
  145. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/python/fuzzy_sink/app.py +0 -0
  146. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/python/heal_fidelity/caller.py +0 -0
  147. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/python/heal_fidelity/worker.py +0 -0
  148. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/python/may_continue/app.py +0 -0
  149. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/python/sanitizer/app.py +0 -0
  150. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/python/taint_source/handler.py +0 -0
  151. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/ruby/sinatra_app/Gemfile +0 -0
  152. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/ruby/sinatra_app/app.rb +0 -0
  153. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/ruby/sinatra_app/services/runner.rb +0 -0
  154. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/rust/axum_app/Cargo.toml +0 -0
  155. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/rust/axum_app/src/handlers.rs +0 -0
  156. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/fixtures/rust/axum_app/src/main.rs +0 -0
  157. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_api.py +0 -0
  158. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_cli.py +0 -0
  159. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_commonjs.py +0 -0
  160. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_csharp_callbacks.py +0 -0
  161. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_cte_bounds.py +0 -0
  162. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_engine_pragmas.py +0 -0
  163. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_entrypoint_expansion.py +0 -0
  164. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_entrypoints.py +0 -0
  165. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_extract_csharp.py +0 -0
  166. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_extract_go.py +0 -0
  167. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_extract_java.py +0 -0
  168. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_extract_javascript.py +0 -0
  169. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_extract_php.py +0 -0
  170. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_extract_python.py +0 -0
  171. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_extract_ruby.py +0 -0
  172. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_frameworks.py +0 -0
  173. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_fuzzy_sink.py +0 -0
  174. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_go_callbacks.py +0 -0
  175. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_hardening.py +0 -0
  176. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_heal_fidelity.py +0 -0
  177. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_incremental.py +0 -0
  178. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_indexer.py +0 -0
  179. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_lang.py +0 -0
  180. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_manifests.py +0 -0
  181. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_may_continue.py +0 -0
  182. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_models.py +0 -0
  183. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_pool.py +0 -0
  184. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_reachability.py +0 -0
  185. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_registry_cache.py +0 -0
  186. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_render.py +0 -0
  187. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_resolver.py +0 -0
  188. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_scoring.py +0 -0
  189. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_sink_catalog.py +0 -0
  190. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_taint.py +0 -0
  191. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_taint_sanitizers.py +0 -0
  192. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_taint_sources.py +0 -0
  193. {entrygraph-0.1.22 → entrygraph-0.1.24}/tests/test_walker.py +0 -0
  194. {entrygraph-0.1.22 → entrygraph-0.1.24}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: entrygraph
3
- Version: 0.1.22
3
+ Version: 0.1.24
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'
22
- __version_tuple__ = version_tuple = (0, 1, 22)
21
+ __version__ = version = '0.1.24'
22
+ __version_tuple__ = version_tuple = (0, 1, 24)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -322,10 +322,17 @@ class RustExtractor:
322
322
  callee_text = callee_name = node_text(fn)
323
323
  receiver = None
324
324
  elif fn.type == "scoped_identifier":
325
+ # A `::`-scoped call (`std::process::Command::new`) is a fully
326
+ # qualified path, not a method on an unknown-typed value. Leave the
327
+ # receiver unset so the resolver keeps the whole path
328
+ # (`rs:std.process.Command.new`) instead of collapsing it to
329
+ # `rs:*.new`, which no sink pattern matches. Rust `Type::new`
330
+ # associated functions are METHODs, so an unset receiver can't
331
+ # fuzzy-bind them by name either.
325
332
  text = _norm(node_text(fn))
326
333
  callee_text = text
327
334
  callee_name = text.rsplit(".", 1)[-1]
328
- receiver = text.rsplit(".", 1)[0] if "." in text else None
335
+ receiver = None
329
336
  elif fn.type == "field_expression":
330
337
  field = fn.child_by_field_name("field")
331
338
  value = fn.child_by_field_name("value")
@@ -336,6 +343,7 @@ class RustExtractor:
336
343
  callee_text = f"{receiver}.{callee_name}" if receiver else callee_name
337
344
  else:
338
345
  continue
346
+ caller = self._caller(node, ctx)
339
347
  out.references.append(
340
348
  RawReference(
341
349
  kind="call",
@@ -343,11 +351,12 @@ class RustExtractor:
343
351
  callee_name=callee_name,
344
352
  receiver_text=receiver,
345
353
  span=span_of(node),
346
- caller_qualified_name=self._caller(node, ctx),
354
+ caller_qualified_name=caller,
347
355
  arg_count=len(args.named_children) if args is not None else 0,
348
356
  arg_preview=truncate(node_text(args)) if args is not None else None,
349
357
  )
350
358
  )
359
+ self._emit_callbacks(args, caller, out)
351
360
 
352
361
  for node in caps.get("macro", []):
353
362
  path_node = node.child_by_field_name("macro")
@@ -379,6 +388,27 @@ class RustExtractor:
379
388
  )
380
389
  )
381
390
 
391
+ def _emit_callbacks(self, args: Node | None, caller: str | None, out: FileExtraction) -> None:
392
+ """Bare-identifier arguments passed to a call — a function value invoked
393
+ later, e.g. ``axum::routing::post(handler)``. Resolution keeps only those
394
+ binding to a project function, so a plain data value is a no-op edge."""
395
+ if args is None:
396
+ return
397
+ for arg in args.named_children:
398
+ if arg.type != "identifier":
399
+ continue
400
+ name = node_text(arg)
401
+ out.references.append(
402
+ RawReference(
403
+ kind="callback",
404
+ callee_text=name,
405
+ callee_name=name,
406
+ receiver_text=None,
407
+ span=span_of(arg),
408
+ caller_qualified_name=caller,
409
+ )
410
+ )
411
+
382
412
  # ---------------- attributes (decorators) ----------------
383
413
 
384
414
  def _attribute_nodes(self, node: Node) -> list[Node]:
@@ -0,0 +1,7 @@
1
+ [package]
2
+ name = "app"
3
+ version = "0.1.0"
4
+ edition = "2021"
5
+
6
+ [dependencies]
7
+ axum = "0.7"
@@ -0,0 +1,10 @@
1
+ use axum::routing::post;
2
+ use axum::Router;
3
+
4
+ fn register(app: Router) {
5
+ app.route("/run", post(handler));
6
+ }
7
+
8
+ async fn handler() {
9
+ std::process::Command::new("sh");
10
+ }
@@ -0,0 +1,4 @@
1
+ [package]
2
+ name = "app"
3
+ version = "0.1.0"
4
+ edition = "2021"
@@ -0,0 +1,7 @@
1
+ fn run_inline(cmd: &str) {
2
+ std::process::Command::new(cmd);
3
+ }
4
+
5
+ fn read_file(path: &str) {
6
+ std::fs::read(path);
7
+ }
@@ -172,10 +172,32 @@ fn run(cmd: &str) {
172
172
  calls = {r.callee_text: r for r in x.references if r.kind == "call"}
173
173
  cmd = calls["Command.new"]
174
174
  assert cmd.callee_name == "new"
175
- assert cmd.receiver_text == "Command"
175
+ # a `::`-scoped call is a qualified path, not a value.method the receiver is
176
+ # left unset so the resolver keeps the full path (rs:Command.new / the imported
177
+ # rs:std.process.Command.new) rather than collapsing to rs:*.new.
178
+ assert cmd.receiver_text is None
176
179
  assert cmd.caller_qualified_name == "handlers.run"
177
180
 
178
181
 
182
+ def test_function_value_argument_is_a_callback():
183
+ # post(handler) passes `handler` as a value; it must be a callback so the
184
+ # handler is reachable from the route registration.
185
+ x = extract(
186
+ """
187
+ fn register(app: Router) {
188
+ app.route("/run", post(handler));
189
+ }
190
+
191
+ async fn handler() {}
192
+ """
193
+ )
194
+ callbacks = {r.callee_name: r for r in x.references if r.kind == "callback"}
195
+ assert "handler" in callbacks
196
+ assert callbacks["handler"].caller_qualified_name == "_root.register"
197
+ # string literal arg is not a callback
198
+ assert "/run" not in callbacks
199
+
200
+
179
201
  def test_partial_tree_still_extracts():
180
202
  x = extract("fn good() {}\n\nfn broken( {\n", path="src/lib.rs")
181
203
  assert not x.parse_ok
@@ -0,0 +1,44 @@
1
+ """End-to-end: Rust function-value callbacks connect handlers to their route
2
+ registration (Phase 4).
3
+
4
+ Regression: the Rust extractor emitted no callback references, so a handler passed
5
+ to `post(handler)` had no inbound edge and was unreachable in the call graph.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ from pathlib import Path
11
+
12
+ import pytest
13
+
14
+ from entrygraph import CodeGraph
15
+
16
+ AXUM_APP = Path(__file__).parent / "fixtures" / "rust" / "axum_callback_app"
17
+
18
+
19
+ @pytest.fixture(scope="module")
20
+ def graph(tmp_path_factory) -> CodeGraph:
21
+ db = tmp_path_factory.mktemp("db") / "graph.db"
22
+ g = CodeGraph.index(AXUM_APP, db=db)
23
+ yield g
24
+ g.close()
25
+
26
+
27
+ def test_callback_edge_created(graph):
28
+ rows = graph.sql(
29
+ "SELECT src.qname AS src, e.dst_qname AS dst FROM edges e "
30
+ "JOIN symbols src ON e.src_symbol_id = src.id WHERE e.kind = 'callback'"
31
+ )
32
+ pairs = {(r["src"], r["dst"]) for r in rows}
33
+ assert ("_root.register", "_root.handler") in pairs
34
+
35
+
36
+ def test_handler_reachable_only_with_callbacks(graph):
37
+ # the callback edge is what makes the handler (and the command_exec sink in its
38
+ # body) reachable from the route registration site
39
+ kw = {"source": "_root.register", "sink_category": "command_exec", "include_unresolved": True}
40
+ assert graph.paths(**kw) == []
41
+ withcb = graph.paths(**kw, include_callbacks=True)
42
+ assert withcb
43
+ assert "_root.handler" in [s.qname for s in withcb[0].symbols]
44
+ assert withcb[0].symbols[-1].qname == "rs:std.process.Command.new"
@@ -0,0 +1,43 @@
1
+ """Fully-scoped Rust calls stamp their sink (Phase 4 follow-up).
2
+
3
+ Regression: a `::`-scoped call like `std::process::Command::new(...)` resolved to
4
+ `rs:*.new` (receiver collapsed to a `*.name` guess), so the command_exec sink
5
+ pattern `rs:{std.process.Command.new,...}` never matched. Scoped paths are now
6
+ kept whole, so the sink stamps.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ from pathlib import Path
12
+
13
+ import pytest
14
+
15
+ from entrygraph import CodeGraph
16
+
17
+ SCOPED_SINK_APP = Path(__file__).parent / "fixtures" / "rust" / "scoped_sink_app"
18
+
19
+
20
+ @pytest.fixture(scope="module")
21
+ def graph(tmp_path_factory) -> CodeGraph:
22
+ db = tmp_path_factory.mktemp("db") / "graph.db"
23
+ g = CodeGraph.index(SCOPED_SINK_APP, db=db)
24
+ yield g
25
+ g.close()
26
+
27
+
28
+ def test_scoped_command_sink_stamped(graph):
29
+ sinks = {
30
+ r["dst_qname"]: r["sink_id"]
31
+ for r in graph.sql("SELECT dst_qname, sink_id FROM edges WHERE sink_id IS NOT NULL")
32
+ }
33
+ assert sinks.get("rs:std.process.Command.new") == "rust.command-exec"
34
+ assert sinks.get("rs:std.fs.read") == "rust.path-traversal"
35
+
36
+
37
+ def test_scoped_command_sink_reachable(graph):
38
+ # the sink is an external guess (UNRESOLVED tier), so opt into it
39
+ paths = graph.paths(
40
+ source="_root.run_inline", sink_category="command_exec", include_unresolved=True
41
+ )
42
+ assert paths
43
+ assert paths[0].symbols[-1].qname == "rs:std.process.Command.new"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes