cg-code-graph 0.23.9__tar.gz → 0.23.10__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 (419) hide show
  1. {cg_code_graph-0.23.9/cg_code_graph.egg-info → cg_code_graph-0.23.10}/PKG-INFO +1 -1
  2. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/__init__.py +1 -1
  3. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/parity_structure.py +136 -15
  4. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10/cg_code_graph.egg-info}/PKG-INFO +1 -1
  5. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph.egg-info/SOURCES.txt +1 -0
  6. cg_code_graph-0.23.10/tests/test_parity_members.py +67 -0
  7. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/LICENSE +0 -0
  8. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/MANIFEST.in +0 -0
  9. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/README.md +0 -0
  10. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/__main__.py +0 -0
  11. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/affected.py +0 -0
  12. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/agent_rules.py +0 -0
  13. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/agents.py +0 -0
  14. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/aitools.py +0 -0
  15. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/android_ipc.py +0 -0
  16. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/apple_ipc.py +0 -0
  17. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/apps.py +0 -0
  18. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/blindspots.py +0 -0
  19. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/bridges.py +0 -0
  20. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/brokers.py +0 -0
  21. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/cli.py +0 -0
  22. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/cmake_sources.py +0 -0
  23. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/concepts.py +0 -0
  24. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/config.py +0 -0
  25. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/core/__init__.py +0 -0
  26. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/core/cache.py +0 -0
  27. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/core/detect.py +0 -0
  28. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/core/env.py +0 -0
  29. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/core/extractors.py +0 -0
  30. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/core/fsutil.py +0 -0
  31. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/core/generated.py +0 -0
  32. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/core/model.py +0 -0
  33. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/core/paths.py +0 -0
  34. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/core/plugin.py +0 -0
  35. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/core/redact.py +0 -0
  36. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/core/store.py +0 -0
  37. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/core/syntax_errors.py +0 -0
  38. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/coverage.py +0 -0
  39. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/dart_isolates.py +0 -0
  40. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/doctor.py +0 -0
  41. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/explore.py +0 -0
  42. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/external.py +0 -0
  43. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/graphql.py +0 -0
  44. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/guard_facts.py +0 -0
  45. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/hooks.py +0 -0
  46. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/indexer.py +0 -0
  47. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/insecure_transport.py +0 -0
  48. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/install_rules.py +0 -0
  49. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/jobs.py +0 -0
  50. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/link.py +0 -0
  51. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/lint_async.py +0 -0
  52. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/local_ipc.py +0 -0
  53. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/local_sockets.py +0 -0
  54. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/mcp_graphs.py +0 -0
  55. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/mcp_install.py +0 -0
  56. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/mcp_server.py +0 -0
  57. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/parity.py +0 -0
  58. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/payload.py +0 -0
  59. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plans.py +0 -0
  60. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/platform_scan.py +0 -0
  61. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/platforms.py +0 -0
  62. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/__init__.py +0 -0
  63. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/astro/__init__.py +0 -0
  64. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/astro/content.py +0 -0
  65. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/astro/plugin.py +0 -0
  66. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/cfamily/__init__.py +0 -0
  67. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/cfamily/plugin.py +0 -0
  68. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/cfamily/syntax.py +0 -0
  69. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/dart/__init__.py +0 -0
  70. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/dart/bridges.py +0 -0
  71. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/dart/extractor/bin/extract.dart +0 -0
  72. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/dart/extractor/pubspec.lock +0 -0
  73. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/dart/extractor/pubspec.yaml +0 -0
  74. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/dart/http.py +0 -0
  75. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/dart/models.py +0 -0
  76. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/dart/plugin.py +0 -0
  77. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/dart/program.py +0 -0
  78. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/django/__init__.py +0 -0
  79. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/django/extras.py +0 -0
  80. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/django/models.py +0 -0
  81. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/django/plugin.py +0 -0
  82. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/django/schemas.py +0 -0
  83. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/django/shapes.py +0 -0
  84. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/django/urls.py +0 -0
  85. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/express/__init__.py +0 -0
  86. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/express/plugin.py +0 -0
  87. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/flutter/__init__.py +0 -0
  88. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/flutter/plugin.py +0 -0
  89. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/java/__init__.py +0 -0
  90. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/java/exact.py +0 -0
  91. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/java/plugin.py +0 -0
  92. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/jvm/__init__.py +0 -0
  93. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/jvm/interop.py +0 -0
  94. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/jvm/spring.py +0 -0
  95. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/kotlin/__init__.py +0 -0
  96. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/kotlin/exact.py +0 -0
  97. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/kotlin/plugin.py +0 -0
  98. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/kotlin/reparse.py +0 -0
  99. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/laravel/__init__.py +0 -0
  100. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/laravel/broadcast.py +0 -0
  101. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/laravel/massassign.py +0 -0
  102. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/laravel/plugin.py +0 -0
  103. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/laravel/tests.py +0 -0
  104. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/laravel/values.py +0 -0
  105. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/native/__init__.py +0 -0
  106. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/native/gates.py +0 -0
  107. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/native/runner.py +0 -0
  108. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/native/scipread.py +0 -0
  109. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/native/ts.py +0 -0
  110. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/nest/__init__.py +0 -0
  111. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/nest/plugin.py +0 -0
  112. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/nextjs/__init__.py +0 -0
  113. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/nextjs/plugin.py +0 -0
  114. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/nuxt/__init__.py +0 -0
  115. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/nuxt/plugin.py +0 -0
  116. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/php/__init__.py +0 -0
  117. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/php/external.py +0 -0
  118. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/php/extractor/composer.json +0 -0
  119. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/php/extractor/composer.lock +0 -0
  120. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/php/extractor/extract.php +0 -0
  121. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/php/gating.py +0 -0
  122. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/php/http_client.py +0 -0
  123. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/php/inline_guards.py +0 -0
  124. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/php/plugin.py +0 -0
  125. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/php/strings.py +0 -0
  126. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/python/__init__.py +0 -0
  127. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/python/aitools.py +0 -0
  128. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/python/external.py +0 -0
  129. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/python/fields.py +0 -0
  130. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/python/plugin.py +0 -0
  131. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/python/refs.py +0 -0
  132. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/python/roots.py +0 -0
  133. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/python/socketio.py +0 -0
  134. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/python/subproc.py +0 -0
  135. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/python/tests.py +0 -0
  136. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/python/values.py +0 -0
  137. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/pyweb/__init__.py +0 -0
  138. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/pyweb/plugin.py +0 -0
  139. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/pyweb/values.py +0 -0
  140. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/rust/__init__.py +0 -0
  141. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/rust/cargo.py +0 -0
  142. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/rust/plugin.py +0 -0
  143. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/rust/syntax.py +0 -0
  144. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/scip/__init__.py +0 -0
  145. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/scip/importer.py +0 -0
  146. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/scip/scip.proto +0 -0
  147. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/scip/scip_pb2.py +0 -0
  148. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/stubs/__init__.py +0 -0
  149. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/stubs/plugins.py +0 -0
  150. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/swift/__init__.py +0 -0
  151. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/swift/baseurl.py +0 -0
  152. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/swift/exact.py +0 -0
  153. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/swift/indexstore.py +0 -0
  154. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/swift/packages.py +0 -0
  155. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/swift/plugin.py +0 -0
  156. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/ts/__init__.py +0 -0
  157. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/ts/baseurl.py +0 -0
  158. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/ts/extractor/extract.mjs +0 -0
  159. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/ts/extractor/fw.mjs +0 -0
  160. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/ts/extractor/package-lock.json +0 -0
  161. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/ts/extractor/package.json +0 -0
  162. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/ts/extractor/rr.mjs +0 -0
  163. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/ts/nav.py +0 -0
  164. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/ts/plugin.py +0 -0
  165. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/ts/react_router.py +0 -0
  166. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/tsweb/__init__.py +0 -0
  167. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/tsweb/common.py +0 -0
  168. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/plugins/tsweb/data.py +0 -0
  169. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/presets/__init__.py +0 -0
  170. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/presets/c_cpp.yaml +0 -0
  171. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/presets/common.yaml +0 -0
  172. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/presets/dart.yaml +0 -0
  173. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/presets/django-ninja.yaml +0 -0
  174. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/presets/django.yaml +0 -0
  175. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/presets/djangorestframework.yaml +0 -0
  176. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/presets/express.yaml +0 -0
  177. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/presets/java.yaml +0 -0
  178. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/presets/kotlin.yaml +0 -0
  179. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/presets/laravel.yaml +0 -0
  180. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/presets/nest.yaml +0 -0
  181. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/presets/nextjs.yaml +0 -0
  182. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/presets/nuxt.yaml +0 -0
  183. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/presets/php.yaml +0 -0
  184. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/presets/python.yaml +0 -0
  185. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/presets/react-router.yaml +0 -0
  186. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/presets/rust.yaml +0 -0
  187. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/presets/spring.yaml +0 -0
  188. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/presets/swift.yaml +0 -0
  189. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/presets/typescript.yaml +0 -0
  190. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/process_runs.py +0 -0
  191. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/protocols/__init__.py +0 -0
  192. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/protocols/builtin.py +0 -0
  193. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/protocols/matchers.py +0 -0
  194. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/protocols/view.py +0 -0
  195. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/query.py +0 -0
  196. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/realtime.py +0 -0
  197. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/realtime_events.py +0 -0
  198. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/realtime_native.py +0 -0
  199. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/realtime_ws.py +0 -0
  200. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/roundtrip.py +0 -0
  201. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/routes.py +0 -0
  202. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/rpc.py +0 -0
  203. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/sdk_systems.py +0 -0
  204. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/sockets.py +0 -0
  205. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/ssrf_input.py +0 -0
  206. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/starters.py +0 -0
  207. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/surface.py +0 -0
  208. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/tests_index.py +0 -0
  209. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/udp_apps.py +0 -0
  210. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/update_check.py +0 -0
  211. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/viz/__init__.py +0 -0
  212. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/viz/graph.py +0 -0
  213. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/viz/server.py +0 -0
  214. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/viz/static/app.css +0 -0
  215. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/viz/static/app.js +0 -0
  216. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/viz/static/index.html +0 -0
  217. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/viz/static/layered.js +0 -0
  218. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/viz/static/vendor/VERSIONS.txt +0 -0
  219. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/viz/static/vendor/cose-base.js +0 -0
  220. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/viz/static/vendor/cytoscape-fcose.js +0 -0
  221. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/viz/static/vendor/cytoscape.min.js +0 -0
  222. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/viz/static/vendor/layout-base.js +0 -0
  223. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/viz/tools/package-lock.json +0 -0
  224. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/viz/tools/package.json +0 -0
  225. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/viz/tools/shoot.mjs +0 -0
  226. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/watch.py +0 -0
  227. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/webhook_subs.py +0 -0
  228. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/webhooks.py +0 -0
  229. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph/xcode.py +0 -0
  230. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph.egg-info/dependency_links.txt +0 -0
  231. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph.egg-info/entry_points.txt +0 -0
  232. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph.egg-info/requires.txt +0 -0
  233. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/cg_code_graph.egg-info/top_level.txt +0 -0
  234. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/pyproject.toml +0 -0
  235. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/setup.cfg +0 -0
  236. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_affected.py +0 -0
  237. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_agents_install.py +0 -0
  238. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_agents_md.py +0 -0
  239. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_ai_tools.py +0 -0
  240. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_android_ipc.py +0 -0
  241. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_apple_ipc.py +0 -0
  242. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_astro.py +0 -0
  243. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_astro_content.py +0 -0
  244. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_astro_server.py +0 -0
  245. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_bridges.py +0 -0
  246. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_bridges_pigeon_monorepo.py +0 -0
  247. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_brokers.py +0 -0
  248. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_cache_clean.py +0 -0
  249. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_cache_invalidation.py +0 -0
  250. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_cache_migration.py +0 -0
  251. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_channels_tests.py +0 -0
  252. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_cli_output.py +0 -0
  253. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_cmake_sources.py +0 -0
  254. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_completeness.py +0 -0
  255. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_config_extras.py +0 -0
  256. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_coverage.py +0 -0
  257. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_coverage_ts_hint.py +0 -0
  258. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_dart_isolates.py +0 -0
  259. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_db_connections.py +0 -0
  260. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_dead_wrappers.py +0 -0
  261. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_dispatch_interfaces.py +0 -0
  262. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_dispatch_part3.py +0 -0
  263. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_django_flutter.py +0 -0
  264. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_docs_languages.py +0 -0
  265. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_docs_links.py +0 -0
  266. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_echo_ref.py +0 -0
  267. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_echo_wrapper.py +0 -0
  268. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_elysia.py +0 -0
  269. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_enum_constants.py +0 -0
  270. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_env.py +0 -0
  271. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_explore.py +0 -0
  272. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_external.py +0 -0
  273. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_fp_batch.py +0 -0
  274. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_gating.py +0 -0
  275. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_generated.py +0 -0
  276. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_graphql.py +0 -0
  277. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_hooks.py +0 -0
  278. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_impact_overrides.py +0 -0
  279. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_index_isolation.py +0 -0
  280. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_inherited_overrides.py +0 -0
  281. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_inline_guards.py +0 -0
  282. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_install_rules.py +0 -0
  283. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_issue_192.py +0 -0
  284. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_issue_201.py +0 -0
  285. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_issue_202.py +0 -0
  286. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_issue_203.py +0 -0
  287. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_issue_204.py +0 -0
  288. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_issue_205.py +0 -0
  289. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_issue_206.py +0 -0
  290. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_issue_207.py +0 -0
  291. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_issue_208.py +0 -0
  292. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_issue_209.py +0 -0
  293. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_issue_210.py +0 -0
  294. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_issue_211.py +0 -0
  295. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_issue_211_used_at.py +0 -0
  296. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_issue_212.py +0 -0
  297. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_issue_212_langs.py +0 -0
  298. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_issue_218.py +0 -0
  299. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_issue_219.py +0 -0
  300. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_issue_222.py +0 -0
  301. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_java.py +0 -0
  302. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_java_exact.py +0 -0
  303. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_jobs.py +0 -0
  304. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_js_refs.py +0 -0
  305. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_js_runtime.py +0 -0
  306. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_kotlin.py +0 -0
  307. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_kotlin_binding.py +0 -0
  308. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_kotlin_exact.py +0 -0
  309. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_kotlin_fields.py +0 -0
  310. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_kotlin_mixed.py +0 -0
  311. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_kotlin_nav_consts.py +0 -0
  312. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_kotlin_props.py +0 -0
  313. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_laravel_determinism.py +0 -0
  314. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_laravel_receiver_narrowing.py +0 -0
  315. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_laravel_resources.py +0 -0
  316. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_laravel_route_paths.py +0 -0
  317. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_link_origin.py +0 -0
  318. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_lint_async.py +0 -0
  319. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_listing_files.py +0 -0
  320. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_local_ipc.py +0 -0
  321. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_local_sockets.py +0 -0
  322. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_mass_assignment.py +0 -0
  323. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_mcp.py +0 -0
  324. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_mcp_index.py +0 -0
  325. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_mcp_install.py +0 -0
  326. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_mcp_instructions.py +0 -0
  327. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_mcp_multi_graph.py +0 -0
  328. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_native_cfamily.py +0 -0
  329. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_native_concurrency.py +0 -0
  330. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_native_rust.py +0 -0
  331. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_nuxt_i18n.py +0 -0
  332. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_nuxt_import_dirs.py +0 -0
  333. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_nuxt_nitro.py +0 -0
  334. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_nuxt_rootsrc.py +0 -0
  335. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_nuxt_side_dirs.py +0 -0
  336. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_packaging.py +0 -0
  337. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_parity.py +0 -0
  338. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_parity_fields.py +0 -0
  339. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_parity_structure.py +0 -0
  340. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_php_http.py +0 -0
  341. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_php_props.py +0 -0
  342. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_plain_js.py +0 -0
  343. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_plans.py +0 -0
  344. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_platform_gaps.py +0 -0
  345. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_platform_type_variants.py +0 -0
  346. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_platforms.py +0 -0
  347. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_platforms_apple.py +0 -0
  348. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_presets_config.py +0 -0
  349. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_process_ipc.py +0 -0
  350. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_process_runs.py +0 -0
  351. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_protocols.py +0 -0
  352. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_python_app_tests_module.py +0 -0
  353. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_python_collection_chains.py +0 -0
  354. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_python_compat.py +0 -0
  355. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_python_entry_refs.py +0 -0
  356. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_python_fields.py +0 -0
  357. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_python_infer_cycles.py +0 -0
  358. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_python_roots.py +0 -0
  359. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_python_subprocess_tests.py +0 -0
  360. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_python_tests.py +0 -0
  361. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_python_web_hosts.py +0 -0
  362. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_python_web_routes.py +0 -0
  363. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_python_web_routes_more.py +0 -0
  364. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_react_router.py +0 -0
  365. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_readers_writers_specs.py +0 -0
  366. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_realtime.py +0 -0
  367. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_realtime_native.py +0 -0
  368. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_redact_salt.py +0 -0
  369. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_request_keys.py +0 -0
  370. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_roundtrip.py +0 -0
  371. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_route_specs.py +0 -0
  372. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_route_tables.py +0 -0
  373. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_routes_search_explain.py +0 -0
  374. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_rpc.py +0 -0
  375. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_scip_health.py +0 -0
  376. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_sdk_external.py +0 -0
  377. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_sdk_external_infra.py +0 -0
  378. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_sdk_external_mail.py +0 -0
  379. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_snippet.py +0 -0
  380. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_sockets.py +0 -0
  381. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_spring.py +0 -0
  382. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_ssrf.py +0 -0
  383. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_starters_budget.py +0 -0
  384. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_surface.py +0 -0
  385. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_surface_transport.py +0 -0
  386. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_swift.py +0 -0
  387. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_swift_binding.py +0 -0
  388. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_swift_exact.py +0 -0
  389. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_swift_facts.py +0 -0
  390. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_swift_fields.py +0 -0
  391. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_swift_modules.py +0 -0
  392. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_swift_more.py +0 -0
  393. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_swift_nav_values.py +0 -0
  394. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_swift_parse_errors.py +0 -0
  395. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_swift_platform_files.py +0 -0
  396. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_swift_props.py +0 -0
  397. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_swift_sdk.py +0 -0
  398. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_swift_testing.py +0 -0
  399. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_swift_values.py +0 -0
  400. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_tauri_events.py +0 -0
  401. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_tests_scope.py +0 -0
  402. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_ts_fields.py +0 -0
  403. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_ts_fields_js_vue.py +0 -0
  404. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_ts_file_specs.py +0 -0
  405. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_ts_frameworks.py +0 -0
  406. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_ts_node_http.py +0 -0
  407. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_ts_nuxt.py +0 -0
  408. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_ts_src_tsconfig.py +0 -0
  409. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_unguarded.py +0 -0
  410. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_update_check.py +0 -0
  411. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_values.py +0 -0
  412. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_viz.py +0 -0
  413. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_vue_nav.py +0 -0
  414. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_watch.py +0 -0
  415. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_webhooks.py +0 -0
  416. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_webhooks_152.py +0 -0
  417. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_webhooks_152b.py +0 -0
  418. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_websockets.py +0 -0
  419. {cg_code_graph-0.23.9 → cg_code_graph-0.23.10}/tests/test_workspace_link.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cg-code-graph
3
- Version: 0.23.9
3
+ Version: 0.23.10
4
4
  Summary: cg: a code graph of routes, calls, data access and platform boundaries for agents and humans (CLI + MCP server)
5
5
  Author: cyberchronos00
6
6
  License-Expression: MIT
@@ -1,2 +1,2 @@
1
1
  """code-graph: deterministic code knowledge graph (beta)."""
2
- __version__ = "0.23.9"
2
+ __version__ = "0.23.10"
@@ -56,6 +56,11 @@ RES = re.compile(r"""\b(?:UI|NS)?Image\(\s*(?:named:\s*)?"([^"\n]+)"|\bAsset\.(?
56
56
  r"""\bImage\(\s*\.(\w+)\s*\)|\b(?:R|Res)\.(?:drawable|mipmap|raw)\.(\w+)""")
57
57
  WIRE = re.compile(r'@(?:SerialName|SerializedName|JsonProperty|Json\(\s*name\s*=)\s*\(?\s*(?:value\s*=\s*)?"([^"\n]+)"')
58
58
  RAW_CASE = re.compile(r'\bcase\s+`?(\w+)`?\s*=\s*"([^"\n]+)"')
59
+ ARM = re.compile(r"^(\s*)case\s+(?:let\s+|var\s+)?((?:\.\w+(?:\([^)]*\))?\s*,?\s*)+)(?:where\b[^:]*)?:")
60
+ DISPATCH = {"receive", "perform", "handle", "handleaction", "onaction", "reduce", "send", "dispatch", "process"}
61
+ MIN_MEMBER_SCORE = 0.35
62
+ MIN_NAME_SCORE = 0.45
63
+ MIN_BOTH_SCORE = 0.25
59
64
  EDGE_KINDS = ("CALLS", "INSTANTIATES", "NAVIGATES_TO", "HTTP_CALLS", "USES_VALUE", "REFERENCES_FN", "USES_TYPE")
60
65
 
61
66
 
@@ -140,9 +145,11 @@ class Side:
140
145
  self.by_file[r["file"]].append((r["line"], r["end_line"] or r["line"], r["id"]))
141
146
  self.span[r["id"]] = (r["file"], r["line"], r["end_line"] or r["line"])
142
147
  self.out = defaultdict(list)
143
- q = f"SELECT src, dst, kind FROM edges WHERE kind IN ({','.join('?' * len(EDGE_KINDS))})"
148
+ self.out_at = defaultdict(list) # src -> [(line, dst, kind)]
149
+ q = f"SELECT src, dst, kind, line FROM edges WHERE kind IN ({','.join('?' * len(EDGE_KINDS))})"
144
150
  for r in c.execute(q, EDGE_KINDS):
145
151
  self.out[r["src"]].append((r["dst"], r["kind"]))
152
+ self.out_at[r["src"]].append((r["line"] or 0, r["dst"], r["kind"]))
146
153
  self.http = {r["id"]: (r["name"] or r["id"]) for r in c.execute("SELECT id, name FROM nodes WHERE kind='http'")}
147
154
  self.decl = defaultdict(list) # owner fqn -> [(name, kind, file, line)] of stored fields / enum cases
148
155
  for r in c.execute("SELECT kind, fqn, file, line, attrs FROM nodes WHERE kind IN ('field', 'enum_case') "
@@ -202,21 +209,50 @@ class Side:
202
209
  for la, lb, nid in self.by_file.get(file, ()):
203
210
  if a <= la <= b:
204
211
  for dst, kind in self.out.get(nid, ()):
205
- if kind == "HTTP_CALLS" or dst in self.http:
206
- p = re.sub(r"\{[^}]*\}|(?<=/):\w+", "{}", self.http.get(dst, dst).split(" ")[-1])
207
- f.add("http:" + p.lstrip("/").lower())
208
- continue
209
- dq = self.fqn_of.get(dst)
210
- t = rename(dq)
211
- if t:
212
- f.add("sym:" + t)
213
- # the called member's own name (two words or more): `getDevices` on an AuthService and on
214
- # an AuthRepository is the same call even when the owners are not paired
215
- nm = _short(dq or "").split("(")[0]
216
- if kind == "CALLS" and len(_words(nm)) >= 2:
217
- f.add("call:" + re.sub(r"^(get|fetch|load)(?=[a-z])", "", _fold(nm)))
212
+ self._edge(f, dst, kind, rename)
218
213
  return f
219
214
 
215
+ def _edge(self, f: set, dst: str, kind: str, rename) -> None:
216
+ if kind == "HTTP_CALLS" or dst in self.http:
217
+ p = re.sub(r"\{[^}]*\}|(?<=/):\w+", "{}", self.http.get(dst, dst).split(" ")[-1])
218
+ f.add("http:" + p.lstrip("/").lower())
219
+ return
220
+ dq = self.fqn_of.get(dst)
221
+ t = rename(dq)
222
+ if t:
223
+ f.add("sym:" + t)
224
+ # the called member's own name (two words or more): `getDevices` on an AuthService and on
225
+ # an AuthRepository is the same call even when the owners are not paired
226
+ nm = _short(dq or "").split("(")[0]
227
+ if kind == "CALLS" and len(_words(nm)) >= 2:
228
+ f.add("call:" + re.sub(r"^(get|fetch|load)(?=[a-z])", "", _fold(nm)))
229
+
230
+ def arms(self, sym: dict) -> list:
231
+ """The top-level `case .x:` arms of a Swift `receive(_:)` / `perform(_:)` style switch: [(case names,
232
+ features of what the arm calls)]."""
233
+ file, a, b = self.span.get(sym["id"], (None, 0, 0))
234
+ if not file or b <= a:
235
+ return []
236
+ rows = self.text(file, a, b).split("\n")
237
+ hits = [(i, len(m.group(1)), m.group(2)) for i, ln in enumerate(rows) for m in [ARM.match(ln)] if m]
238
+ if not hits:
239
+ return []
240
+ top = min(h[1] for h in hits)
241
+ hits = [h for h in hits if h[1] == top]
242
+ out = []
243
+ for k, (i, _, names) in enumerate(hits):
244
+ lo, hi = a + i, (a + hits[k + 1][0] - 1 if k + 1 < len(hits) else b)
245
+ f = set()
246
+ for ln, dst, kind in self.out_at.get(sym["id"], ()):
247
+ if lo <= ln <= hi:
248
+ self._edge(f, dst, kind, lambda x: x)
249
+ for la, lb, nid in self.by_file.get(file, ()):
250
+ if lo <= la <= hi and nid != sym["id"]:
251
+ for dst, kind in self.out.get(nid, ()):
252
+ self._edge(f, dst, kind, lambda x: x)
253
+ out.append((re.findall(r"\.(\w+)", names), f))
254
+ return out
255
+
220
256
 
221
257
  def match(S: dict, T: dict, out: dict, sym_of: dict, cat_of: dict, t_syms: dict, t_cat: dict, learn: bool = True) -> dict:
222
258
  ui_s = {fq: is_ui(fq, sym, S["members"]) for fq, sym in sym_of.items()}
@@ -369,7 +405,8 @@ def _structure(S, T, out, sym_of, cat_of, t_syms, t_cat, used):
369
405
  if sym is not None:
370
406
  src_f[row["symbol"]] = sS.features(sym, lambda x: pairs.get(x)) | name_words(row["symbol"])
371
407
  tgt_f = {fq: sT.features(sym, lambda x: x) | name_words(fq) for fq, sym in t_syms.items()
372
- if fq not in used and not PREVIEW.search(_short(fq))}
408
+ if fq not in used and not PREVIEW.search(_short(fq))
409
+ and not (_fold(_short(fq).split("(")[0]) in DISPATCH and sT.arms(sym))} # its arms are paired below
373
410
  src_f = {fq: f for fq, f in src_f.items() if not PREVIEW.search(_short(fq))}
374
411
  df = Counter()
375
412
  for fs in list(src_f.values()) + list(tgt_f.values()):
@@ -423,4 +460,88 @@ def _structure(S, T, out, sym_of, cat_of, t_syms, t_cat, used):
423
460
  else:
424
461
  keep.append(row)
425
462
  out["missing"] = keep
463
+ _members(sS, sT, out, sym_of, cat_of, t_syms, t_cat, used, S, T)
426
464
  _by_fields(sS, sT, out, sym_of, cat_of, t_syms, t_cat, used, S, T)
465
+
466
+
467
+ def _members(sS, sT, out, sym_of, cat_of, t_syms, t_cat, used, S, T):
468
+ """Members of matched types still missing, paired inside the counterpart type (#227): with an unmatched member,
469
+ or a top-level function, that makes the same paired calls, or with a `case .x:` arm of its `receive(_:)` /
470
+ `perform(_:)` switch (`handleCopyClick` on a view model, `case .copyGeneratedValue:` in the processor). Uses are
471
+ weighed within the pair of types, so a call that is common across the project still tells two members apart."""
472
+ pairs = {r["symbol"]: r["target"] for r in out["matched"]}
473
+ by_owner = defaultdict(list)
474
+ for r in out["missing"]:
475
+ if r.get("owner_matched") and r["symbol"] in sym_of and not PREVIEW.search(_short(r["symbol"])):
476
+ by_owner[r["owner_matched"]].append(r)
477
+ if not by_owner:
478
+ return
479
+ ident = lambda x: x # noqa: E731
480
+ top, top_inv = None, defaultdict(list)
481
+ taken_arms, best, cand_of = set(), {}, {}
482
+ for o, rows in by_owner.items():
483
+ units = [] # (key, target fqn, case name or None, category, features)
484
+ for nm, sym in T["members"].get(o, {}).items():
485
+ fq = f"{o}.{nm}"
486
+ arms = sT.arms(sym) if _fold(nm.split("(")[0]) in DISPATCH else []
487
+ for names, f in arms: # a dispatching switch stands for its arms, not as a whole
488
+ ws = set().union(*(name_words(n) for n in names))
489
+ units.append(((fq, names[0]), fq, names[0], "func", f | ws))
490
+ if not arms and fq not in used and not PREVIEW.search(nm):
491
+ units.append((fq, fq, None, t_cat.get(fq), sT.features(sym, ident) | name_words(fq)))
492
+ src = {r["symbol"]: sS.features(sym_of[r["symbol"]], pairs.get) | name_words(r["symbol"]) for r in rows}
493
+ if top is None: # top-level functions, met only through two paired uses
494
+ top = {}
495
+ for fq, sym in t_syms.items():
496
+ if t_cat.get(fq) == "func" and fq not in used and "." not in fq.replace(o, "") and fq in T["top"]:
497
+ top[fq] = {f for f in sT.features(sym, ident) if f.startswith("sym:")} | name_words(fq)
498
+ for f in top[fq]:
499
+ if f.startswith("sym:"):
500
+ top_inv[f].append(fq)
501
+ df = Counter()
502
+ for fs in list(src.values()) + [u[4] for u in units]:
503
+ df.update(fs)
504
+ n = len(src) + len(units)
505
+ for fq, fs in src.items():
506
+ extra = {t for f in fs if f.startswith("sym:") for t in top_inv.get(f, ())}
507
+ cands = [u for u in units if u[3] == cat_of.get(fq)] + [(t, t, None, "func", top[t]) for t in extra
508
+ if cat_of.get(fq) == "func"]
509
+ scored = []
510
+ for key, t, case, cat, tf in cands:
511
+ sh = fs & tf
512
+ uses = sum(1 for f in sh if not f.startswith("w:"))
513
+ words = len(sh) - uses
514
+ if case is None and t in top and uses < 2:
515
+ continue
516
+ if not (uses >= 2 or (uses and words) or words >= 2):
517
+ continue
518
+ wt = lambda f: math.log(1 + n / df[f]) if df[f] else math.log(1 + n) # noqa: E731
519
+ sc = sum(wt(f) for f in sh) / math.sqrt(sum(wt(f) for f in fs) * sum(wt(f) for f in tf))
520
+ if sc < (MIN_NAME_SCORE if not uses else MIN_BOTH_SCORE if words else MIN_MEMBER_SCORE):
521
+ continue # names alone must agree more; a use and a name word less
522
+ scored.append((sc, key, t, case, sh))
523
+ scored.sort(key=lambda x: -x[0])
524
+ if scored and (len(scored) == 1 or scored[1][0] < MARGIN * scored[0][0]):
525
+ best[fq] = scored[0]
526
+ by_key = defaultdict(list)
527
+ for fq, (sc, key, *_rest) in best.items():
528
+ by_key[key].append((sc, fq))
529
+ keep = []
530
+ for row in out["missing"]:
531
+ got = best.get(row["symbol"])
532
+ if not got:
533
+ keep.append(row)
534
+ continue
535
+ sc, key, t, case, sh = got
536
+ if max(by_key[key])[1] != row["symbol"] or (case is None and t in used) or key in taken_arms:
537
+ keep.append(row)
538
+ continue
539
+ if case is None:
540
+ used.add(t)
541
+ taken_arms.add(key)
542
+ ev = sorted(sh, key=lambda f: (f.startswith("w:"), f))[:6]
543
+ r = dict(row, target=t, confidence="structure", score=round(sc, 2), evidence=([f"case .{case}"] if case else []) + ev)
544
+ if case:
545
+ r["case"] = case
546
+ out["matched"].append(r)
547
+ out["missing"] = keep
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cg-code-graph
3
- Version: 0.23.9
3
+ Version: 0.23.10
4
4
  Summary: cg: a code graph of routes, calls, data access and platform boundaries for agents and humans (CLI + MCP server)
5
5
  Author: cyberchronos00
6
6
  License-Expression: MIT
@@ -333,6 +333,7 @@ tests/test_nuxt_side_dirs.py
333
333
  tests/test_packaging.py
334
334
  tests/test_parity.py
335
335
  tests/test_parity_fields.py
336
+ tests/test_parity_members.py
336
337
  tests/test_parity_structure.py
337
338
  tests/test_php_http.py
338
339
  tests/test_php_props.py
@@ -0,0 +1,67 @@
1
+ """`cg parity --structure` (#227): members of a matched type paired by what they call inside the counterpart type
2
+ (`duplicatePlants` / `copySelected`), and Kotlin view-model handlers paired with the `case .x:` arms of the Swift
3
+ processor's `receive(_:)`. Invented app: a plant-care app in Swift and its Kotlin port."""
4
+ import sys
5
+ from pathlib import Path
6
+
7
+ import pytest
8
+
9
+ sys.path.insert(0, str(Path(__file__).parent))
10
+ pytest.importorskip("tree_sitter_swift")
11
+ pytest.importorskip("tree_sitter_kotlin")
12
+ from test_parity import build # noqa: E402
13
+ from cg_code_graph import parity as P # noqa: E402
14
+
15
+ IOS = {
16
+ "Garden/Store/PlantStore.swift":
17
+ "final class PlantStore {\n func insertPlant(_ p: Int) {}\n func nextSortIndex() -> Int { 0 }\n"
18
+ " func archiveAll() {}\n\n func duplicatePlants() {\n let i = nextSortIndex()\n insertPlant(i)\n }\n}\n",
19
+ "Garden/Services/WateringService.swift":
20
+ "final class WateringService {\n func logWatering() {}\n func snooze() {}\n}\n",
21
+ "Garden/Plant/PlantAction.swift":
22
+ "enum PlantAction {\n case waterNowPressed\n case renamePlantTapped(String)\n case dismissTapped\n}\n",
23
+ "Garden/Plant/PlantProcessor.swift":
24
+ "final class PlantProcessor {\n let watering = WateringService()\n var name = \"\"\n\n"
25
+ " func receive(_ action: PlantAction) {\n switch action {\n case .waterNowPressed:\n"
26
+ " watering.logWatering()\n case let .renamePlantTapped(newName):\n name = newName\n"
27
+ " case .dismissTapped:\n watering.snooze()\n }\n }\n}\n",
28
+ }
29
+ ANDROID = {
30
+ "app/src/main/java/com/leafy/store/PlantStore.kt":
31
+ "package com.leafy.store\n\nclass PlantStore {\n fun insertPlant(p: Int) {}\n fun nextSortIndex(): Int = 0\n"
32
+ " fun archiveAll() {}\n\n fun copySelected() {\n val i = nextSortIndex()\n insertPlant(i)\n }\n"
33
+ " fun exportCsv() {}\n}\n",
34
+ "app/src/main/java/com/leafy/services/WateringService.kt":
35
+ "package com.leafy.services\n\nclass WateringService {\n fun logWatering() {}\n fun snooze() {}\n}\n",
36
+ "app/src/main/java/com/leafy/plant/PlantViewModel.kt":
37
+ "package com.leafy.plant\n\nimport com.leafy.services.WateringService\n\nclass PlantViewModel(private val watering: WateringService) {\n"
38
+ " var name = \"\"\n fun handleWaterNowClick() {\n watering.logWatering()\n }\n"
39
+ " fun handleRenamePlantTapped(newName: String) {\n name = newName\n }\n"
40
+ " fun handleSettingsClick() {}\n}\n",
41
+ }
42
+
43
+
44
+ @pytest.fixture(scope="module")
45
+ def dbs():
46
+ return build(IOS, "gios"), build(ANDROID, "gandroid")
47
+
48
+
49
+ def test_member_pairs_by_paired_calls(dbs):
50
+ res = P.parity(*dbs, structure=True)
51
+ m = {r["symbol"]: r for r in res["matched"]}
52
+ r = m["PlantStore.duplicatePlants"]
53
+ assert r["target"] == "com.leafy.store.PlantStore.copySelected" and r["confidence"] == "structure", r
54
+ assert "sym:com.leafy.store.PlantStore.insertPlant" in r["evidence"]
55
+ # without --structure nothing is inferred
56
+ assert "PlantStore.duplicatePlants" in {x["symbol"] for x in P.parity(*dbs)["missing"]}
57
+
58
+
59
+ def test_handlers_pair_with_receive_arms(dbs):
60
+ res = P.parity(dbs[1], dbs[0], structure=True)
61
+ m = {r["symbol"]: r for r in res["matched"]}
62
+ w = m["com.leafy.plant.PlantViewModel.handleWaterNowClick"]
63
+ assert w["target"] == "PlantProcessor.receive" and w["case"] == "waterNowPressed", w
64
+ assert "case .waterNowPressed" in w["evidence"]
65
+ assert m["com.leafy.plant.PlantViewModel.handleRenamePlantTapped"]["case"] == "renamePlantTapped"
66
+ # nothing in common with any arm: still missing
67
+ assert "com.leafy.plant.PlantViewModel.handleSettingsClick" in {x["symbol"] for x in res["missing"]}
File without changes