entrygraph 0.1.39__tar.gz → 0.1.41__tar.gz

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