entrygraph 0.1.28__tar.gz → 0.1.30__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 (198) hide show
  1. {entrygraph-0.1.28 → entrygraph-0.1.30}/PKG-INFO +1 -1
  2. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/_version.py +2 -2
  3. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/cli/main.py +5 -0
  4. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/pipeline/scanner.py +20 -4
  5. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/resolve/resolver.py +10 -1
  6. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_cli.py +14 -0
  7. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_incremental.py +31 -0
  8. {entrygraph-0.1.28 → entrygraph-0.1.30}/.github/workflows/ci.yml +0 -0
  9. {entrygraph-0.1.28 → entrygraph-0.1.30}/.github/workflows/release.yml +0 -0
  10. {entrygraph-0.1.28 → entrygraph-0.1.30}/.gitignore +0 -0
  11. {entrygraph-0.1.28 → entrygraph-0.1.30}/LICENSE +0 -0
  12. {entrygraph-0.1.28 → entrygraph-0.1.30}/README.md +0 -0
  13. {entrygraph-0.1.28 → entrygraph-0.1.30}/RELEASING.md +0 -0
  14. {entrygraph-0.1.28 → entrygraph-0.1.30}/pyproject.toml +0 -0
  15. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/__init__.py +0 -0
  16. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/__main__.py +0 -0
  17. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/api.py +0 -0
  18. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/cli/__init__.py +0 -0
  19. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/cli/render.py +0 -0
  20. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/data/sinks/csharp.toml +0 -0
  21. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/data/sinks/go.toml +0 -0
  22. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/data/sinks/java.toml +0 -0
  23. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/data/sinks/javascript.toml +0 -0
  24. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/data/sinks/lib_javascript.toml +0 -0
  25. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/data/sinks/lib_python.toml +0 -0
  26. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/data/sinks/php.toml +0 -0
  27. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/data/sinks/python.toml +0 -0
  28. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/data/sinks/ruby.toml +0 -0
  29. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/data/sinks/rust.toml +0 -0
  30. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/db/__init__.py +0 -0
  31. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/db/engine.py +0 -0
  32. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/db/meta.py +0 -0
  33. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/db/models.py +0 -0
  34. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/db/queries.py +0 -0
  35. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/detect/__init__.py +0 -0
  36. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/detect/entrypoints/__init__.py +0 -0
  37. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/detect/entrypoints/base.py +0 -0
  38. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/detect/entrypoints/configs.py +0 -0
  39. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/detect/entrypoints/csharp.py +0 -0
  40. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/detect/entrypoints/golang.py +0 -0
  41. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/detect/entrypoints/java.py +0 -0
  42. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/detect/entrypoints/javascript.py +0 -0
  43. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/detect/entrypoints/php.py +0 -0
  44. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/detect/entrypoints/python.py +0 -0
  45. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/detect/entrypoints/ruby.py +0 -0
  46. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/detect/entrypoints/rust.py +0 -0
  47. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/detect/frameworks.py +0 -0
  48. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/detect/manifests.py +0 -0
  49. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/detect/taint.py +0 -0
  50. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/errors.py +0 -0
  51. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/extract/__init__.py +0 -0
  52. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/extract/base.py +0 -0
  53. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/extract/csharp.py +0 -0
  54. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/extract/golang.py +0 -0
  55. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/extract/ir.py +0 -0
  56. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/extract/java.py +0 -0
  57. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/extract/javascript.py +0 -0
  58. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/extract/php.py +0 -0
  59. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/extract/python.py +0 -0
  60. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/extract/registry.py +0 -0
  61. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/extract/ruby.py +0 -0
  62. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/extract/rust.py +0 -0
  63. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/fs/__init__.py +0 -0
  64. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/fs/hashing.py +0 -0
  65. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/fs/lang.py +0 -0
  66. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/fs/walker.py +0 -0
  67. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/graph/__init__.py +0 -0
  68. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/graph/adjacency.py +0 -0
  69. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/graph/cte.py +0 -0
  70. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/graph/scoring.py +0 -0
  71. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/kinds.py +0 -0
  72. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/parsing/__init__.py +0 -0
  73. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/parsing/parsers.py +0 -0
  74. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/parsing/queries.py +0 -0
  75. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/pipeline/__init__.py +0 -0
  76. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/pipeline/worker.py +0 -0
  77. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/pipeline/writer.py +0 -0
  78. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/py.typed +0 -0
  79. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/queries/csharp/calls.scm +0 -0
  80. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/queries/csharp/definitions.scm +0 -0
  81. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/queries/csharp/imports.scm +0 -0
  82. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/queries/go/calls.scm +0 -0
  83. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/queries/go/definitions.scm +0 -0
  84. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/queries/go/imports.scm +0 -0
  85. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/queries/java/calls.scm +0 -0
  86. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/queries/java/definitions.scm +0 -0
  87. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/queries/java/imports.scm +0 -0
  88. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/queries/javascript/calls.scm +0 -0
  89. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/queries/javascript/definitions.scm +0 -0
  90. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/queries/javascript/imports.scm +0 -0
  91. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/queries/php/calls.scm +0 -0
  92. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/queries/php/definitions.scm +0 -0
  93. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/queries/php/imports.scm +0 -0
  94. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/queries/python/calls.scm +0 -0
  95. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/queries/python/definitions.scm +0 -0
  96. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/queries/python/imports.scm +0 -0
  97. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/queries/ruby/calls.scm +0 -0
  98. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/queries/ruby/definitions.scm +0 -0
  99. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/queries/ruby/imports.scm +0 -0
  100. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/queries/rust/calls.scm +0 -0
  101. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/queries/rust/definitions.scm +0 -0
  102. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/queries/rust/imports.scm +0 -0
  103. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/resolve/__init__.py +0 -0
  104. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/resolve/externals.py +0 -0
  105. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/resolve/hierarchy.py +0 -0
  106. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/resolve/symbol_table.py +0 -0
  107. {entrygraph-0.1.28 → entrygraph-0.1.30}/src/entrygraph/results.py +0 -0
  108. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/conftest.py +0 -0
  109. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/csharp/aspnet_app/Controllers/ReportsController.cs +0 -0
  110. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/csharp/aspnet_app/Program.cs +0 -0
  111. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/csharp/aspnet_app/Services/ReportService.cs +0 -0
  112. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/csharp/aspnet_app/app.csproj +0 -0
  113. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/csharp/minimalapi_app/Program.cs +0 -0
  114. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/csharp/minimalapi_app/app.csproj +0 -0
  115. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/go/gin_app/go.mod +0 -0
  116. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/go/gin_app/main.go +0 -0
  117. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/go/gin_app/service.go +0 -0
  118. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/go/nethttp_app/go.mod +0 -0
  119. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/go/nethttp_app/main.go +0 -0
  120. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/java/methodref_app/pom.xml +0 -0
  121. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/java/methodref_app/src/main/java/com/example/App.java +0 -0
  122. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/java/spring_app/pom.xml +0 -0
  123. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/java/spring_app/src/main/java/com/example/Application.java +0 -0
  124. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/java/spring_app/src/main/java/com/example/ReportRunner.java +0 -0
  125. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/java/spring_app/src/main/java/com/example/ReportService.java +0 -0
  126. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/java/spring_app/src/main/java/com/example/UserController.java +0 -0
  127. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/javascript/commonjs_app/server.js +0 -0
  128. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/javascript/express_app/package.json +0 -0
  129. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/javascript/express_app/src/routes.js +0 -0
  130. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/javascript/express_app/src/services.js +0 -0
  131. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/php/laravel_app/app/Http/Controllers/ReportController.php +0 -0
  132. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/php/laravel_app/artisan +0 -0
  133. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/php/laravel_app/composer.json +0 -0
  134. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/php/laravel_app/routes/web.php +0 -0
  135. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/python/chained_sinks/app.py +0 -0
  136. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/python/flask_app/app/__init__.py +0 -0
  137. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/python/flask_app/app/db.py +0 -0
  138. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/python/flask_app/app/routes.py +0 -0
  139. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/python/flask_app/app/services.py +0 -0
  140. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/python/flask_app/cli.py +0 -0
  141. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/python/flask_app/requirements.txt +0 -0
  142. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/python/fuzzy_sink/app.py +0 -0
  143. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/python/heal_fidelity/caller.py +0 -0
  144. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/python/heal_fidelity/worker.py +0 -0
  145. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/python/may_continue/app.py +0 -0
  146. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/python/sanitizer/app.py +0 -0
  147. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/python/taint_source/handler.py +0 -0
  148. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/ruby/sinatra_app/Gemfile +0 -0
  149. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/ruby/sinatra_app/app.rb +0 -0
  150. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/ruby/sinatra_app/services/runner.rb +0 -0
  151. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/rust/axum_app/Cargo.toml +0 -0
  152. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/rust/axum_app/src/handlers.rs +0 -0
  153. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/rust/axum_app/src/main.rs +0 -0
  154. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/rust/axum_callback_app/Cargo.toml +0 -0
  155. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/rust/axum_callback_app/src/main.rs +0 -0
  156. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/rust/scoped_sink_app/Cargo.toml +0 -0
  157. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/fixtures/rust/scoped_sink_app/src/main.rs +0 -0
  158. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_api.py +0 -0
  159. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_commonjs.py +0 -0
  160. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_csharp_callbacks.py +0 -0
  161. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_cte_bounds.py +0 -0
  162. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_engine_pragmas.py +0 -0
  163. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_entrypoint_expansion.py +0 -0
  164. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_entrypoints.py +0 -0
  165. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_extract_csharp.py +0 -0
  166. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_extract_go.py +0 -0
  167. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_extract_java.py +0 -0
  168. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_extract_javascript.py +0 -0
  169. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_extract_php.py +0 -0
  170. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_extract_python.py +0 -0
  171. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_extract_ruby.py +0 -0
  172. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_extract_rust.py +0 -0
  173. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_frameworks.py +0 -0
  174. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_fuzzy_sink.py +0 -0
  175. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_go_callbacks.py +0 -0
  176. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_hardening.py +0 -0
  177. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_heal_fidelity.py +0 -0
  178. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_indexer.py +0 -0
  179. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_java_callbacks.py +0 -0
  180. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_lang.py +0 -0
  181. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_manifests.py +0 -0
  182. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_may_continue.py +0 -0
  183. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_models.py +0 -0
  184. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_pool.py +0 -0
  185. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_reachability.py +0 -0
  186. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_registry_cache.py +0 -0
  187. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_render.py +0 -0
  188. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_resolver.py +0 -0
  189. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_rust_callbacks.py +0 -0
  190. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_rust_scoped_sinks.py +0 -0
  191. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_sanitizer_languages.py +0 -0
  192. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_scoring.py +0 -0
  193. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_sink_catalog.py +0 -0
  194. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_taint.py +0 -0
  195. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_taint_sanitizers.py +0 -0
  196. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_taint_sources.py +0 -0
  197. {entrygraph-0.1.28 → entrygraph-0.1.30}/tests/test_walker.py +0 -0
  198. {entrygraph-0.1.28 → entrygraph-0.1.30}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: entrygraph
3
- Version: 0.1.28
3
+ Version: 0.1.30
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.28'
22
- __version_tuple__ = version_tuple = (0, 1, 28)
21
+ __version__ = version = '0.1.30'
22
+ __version_tuple__ = version_tuple = (0, 1, 30)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -264,6 +264,11 @@ def _path_tree(index: int, path) -> Tree:
264
264
  def cmd_paths(args) -> int:
265
265
  if not args.source and not args.source_category:
266
266
  raise EntrygraphError("provide --source and/or --source-category")
267
+ # A missing sink would leave the sink set empty and print "no paths found",
268
+ # which reads like a clean result — require an explicit sink so an incomplete
269
+ # query can't be mistaken for "no reachable sinks".
270
+ if not args.sink and not args.sink_category:
271
+ raise EntrygraphError("provide --sink and/or --sink-category")
267
272
  with _open(args) as graph:
268
273
  paths = graph.paths(
269
274
  source=args.source,
@@ -491,13 +491,23 @@ def _write_symbols(session, extractions, file_id_by_path, alloc, table):
491
491
  "is_exported": raw.is_exported,
492
492
  }
493
493
  )
494
+ # file id -> that file's module symbol id, so a top-level symbol is parented to
495
+ # ITS OWN module. When several files share a package/module_path (every
496
+ # multi-file Go package), `module_symbol_ids` keeps only the last file's module
497
+ # id; parenting siblings to it means wiping one file cascade-deletes the others'
498
+ # symbols (parent_id FK is ondelete=CASCADE). This was the incremental-reindex
499
+ # data loss in #41 (F-H11).
500
+ module_id_by_file_id = {file_id_by_path[p]: mid for p, mid in module_ids.items()}
494
501
  for row in symbol_rows:
495
502
  qname = row["qname"]
496
503
  if row["kind"] is not SymbolKind.MODULE and "." in qname:
497
504
  parent_q = qname.rsplit(".", 1)[0]
498
- row["parent_id"] = symbol_id_by_qname.get(parent_q) or table.module_symbol_ids.get(
499
- parent_q
500
- )
505
+ parent = symbol_id_by_qname.get(parent_q)
506
+ if parent is None: # parent is the module itself, not a project symbol
507
+ parent = module_id_by_file_id.get(row["file_id"]) or table.module_symbol_ids.get(
508
+ parent_q
509
+ )
510
+ row["parent_id"] = parent
501
511
  # A row's parent has one fewer qname segment, so inserting shallowest-first
502
512
  # guarantees the self-referential parent_id FK is satisfied within the batch.
503
513
  symbol_rows.sort(key=lambda r: r["qname"].count("."))
@@ -535,7 +545,13 @@ def _write_edges_and_entrypoints(
535
545
 
536
546
  for path, x, is_package in extractions:
537
547
  resolver = FileResolver(
538
- x, module_ids[path], table, externals, is_package, sink_registry=sink_registry
548
+ x,
549
+ module_ids[path],
550
+ table,
551
+ externals,
552
+ is_package,
553
+ sink_registry=sink_registry,
554
+ local_symbol_ids=handler_ids_by_path.get(path, {}),
539
555
  )
540
556
  file_id = file_id_by_path[path]
541
557
  for edge in resolver.resolve():
@@ -71,6 +71,7 @@ class FileResolver:
71
71
  externals: ExternalRegistry,
72
72
  is_package: bool = False,
73
73
  sink_registry: SinkRegistry | None = None,
74
+ local_symbol_ids: dict[str, int] | None = None,
74
75
  ) -> None:
75
76
  self.x = extraction
76
77
  self.module_symbol_id = module_symbol_id
@@ -78,6 +79,11 @@ class FileResolver:
78
79
  self.externals = externals
79
80
  self.is_package = is_package
80
81
  self.sink_registry = sink_registry
82
+ # This file's own qname -> id. The caller of every reference lives in this
83
+ # file, so an edge's source must resolve here first — resolving it through
84
+ # the global (last-wins) table would attribute a.go's edge to a same-named
85
+ # symbol in b.go, and wiping b.go would then cascade-delete a.go's edge.
86
+ self.local_symbol_ids = local_symbol_ids or {}
81
87
  self.prefix = LANG_PREFIX.get(extraction.language, extraction.language)
82
88
  self.import_map, self.wildcard_modules = build_import_map(extraction, is_package)
83
89
 
@@ -166,7 +172,10 @@ class FileResolver:
166
172
  return edges
167
173
 
168
174
  def _resolve_reference(self, ref: RawReference) -> ResolvedEdge | None:
169
- src_id = self.table.by_fqn.get(ref.caller_qualified_name or "", self.module_symbol_id)
175
+ caller_q = ref.caller_qualified_name or ""
176
+ src_id = self.local_symbol_ids.get(caller_q) or self.table.by_fqn.get(
177
+ caller_q, self.module_symbol_id
178
+ )
170
179
  kind = _REF_EDGE_KIND.get(ref.kind, EdgeKind.REFERENCES)
171
180
 
172
181
  if ref.kind == "callback":
@@ -62,6 +62,20 @@ def test_paths_exit_codes(db, capsys):
62
62
  assert rc == 1
63
63
 
64
64
 
65
+ def test_paths_requires_a_sink(db, capsys):
66
+ # A query with a source but no sink would silently print "no paths found",
67
+ # which reads like a clean result — it must error instead.
68
+ rc = main(["paths", "--db", db, "--source", "*"])
69
+ assert rc == 2
70
+ assert "provide --sink" in capsys.readouterr().err
71
+
72
+
73
+ def test_paths_requires_a_source(db, capsys):
74
+ rc = main(["paths", "--db", db, "--sink-category", "command_exec"])
75
+ assert rc == 2
76
+ assert "provide --source" in capsys.readouterr().err
77
+
78
+
65
79
  def test_paths_by_category(db, capsys):
66
80
  rc = main(
67
81
  [
@@ -215,3 +215,34 @@ def test_parallel_matches_sequential(repo, tmp_path):
215
215
  scanner._PARALLEL_THRESHOLD = original
216
216
  seq.dispose()
217
217
  par.dispose()
218
+
219
+
220
+ def test_reindex_shared_package_file_matches_full(tmp_path):
221
+ # Two files in the same Go package share a module_path and both define
222
+ # `func init()`. Re-indexing one file must not cascade-delete the other file's
223
+ # symbols/edges (parent_id and edge.src_symbol_id FKs are ondelete=CASCADE, and
224
+ # both were bound to the last-written colliding symbol). Regression for #41 F-H11.
225
+ repo = tmp_path / "gomod"
226
+ (repo / "middleware").mkdir(parents=True)
227
+ (repo / "middleware" / "a.go").write_text(
228
+ 'package middleware\nimport "fmt"\nfunc init() { doThing() }\n'
229
+ 'func doThing() { fmt.Println("a") }\n'
230
+ )
231
+ terminal = repo / "middleware" / "terminal.go"
232
+ terminal.write_text(
233
+ 'package middleware\nimport "fmt"\nfunc init() { other() }\n'
234
+ 'func other() { fmt.Println("b") }\n'
235
+ )
236
+ engine = make_engine(tmp_path / "inc.db")
237
+ index_repository(repo, engine)
238
+
239
+ terminal.write_text(terminal.read_text() + "\n// touch\n")
240
+ stats = index_repository(repo, engine, incremental=True)
241
+ assert stats.files_indexed == 1 # only terminal.go reparsed
242
+ incremental = _graph_snapshot(engine)
243
+ engine.dispose()
244
+
245
+ assert incremental == _full_reindex_snapshot(repo, tmp_path)
246
+ # the sibling file's symbols/edges survive the re-index
247
+ syms = {q for q, _ in incremental[0]}
248
+ assert {"middleware.doThing", "middleware.other"} <= syms
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes