Graphinate 0.15.2__tar.gz → 0.16.0__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 (214) hide show
  1. {graphinate-0.15.2 → graphinate-0.16.0}/.github/workflows/codspeed.yml +2 -2
  2. {graphinate-0.15.2 → graphinate-0.16.0}/.github/workflows/publish-docs.yaml +2 -2
  3. {graphinate-0.15.2 → graphinate-0.16.0}/.github/workflows/publish.yml +2 -2
  4. {graphinate-0.15.2 → graphinate-0.16.0}/.github/workflows/test-beta.yml +2 -2
  5. {graphinate-0.15.2 → graphinate-0.16.0}/.github/workflows/test.yml +2 -2
  6. {graphinate-0.15.2 → graphinate-0.16.0}/CHANGELOG.md +17 -0
  7. {graphinate-0.15.2 → graphinate-0.16.0}/PKG-INFO +6 -3
  8. {graphinate-0.15.2 → graphinate-0.16.0}/README.md +2 -2
  9. graphinate-0.16.0/design/proposals/GEP-003_Roadmap.md +122 -0
  10. {graphinate-0.15.2 → graphinate-0.16.0}/design/proposals/GEP-010_Explicit_Dependency_Injection.md +10 -9
  11. {graphinate-0.15.2 → graphinate-0.16.0}/design/proposals/GEP-016_CLI_Argument_Parsing_and_Path_Safety.md +2 -1
  12. {graphinate-0.15.2 → graphinate-0.16.0}/design/proposals/GEP-017_Decoupled_Server_Architecture.md +24 -4
  13. {graphinate-0.15.2 → graphinate-0.16.0}/design/proposals/GEP-031_High_Performance_Vectorized_Operations.md +9 -3
  14. {graphinate-0.15.2 → graphinate-0.16.0}/design/proposals/GEP-032_GraphModel_Compilation_and_Validation_Lifecycle.md +5 -3
  15. graphinate-0.16.0/docs/usage/cli.md +56 -0
  16. {graphinate-0.15.2 → graphinate-0.16.0}/docs/usage/lib.md +1 -1
  17. {graphinate-0.15.2 → graphinate-0.16.0}/pyproject.toml +6 -2
  18. {graphinate-0.15.2 → graphinate-0.16.0}/src/graphinate/.agents/skills/graphinate/SKILL.md +3 -3
  19. {graphinate-0.15.2 → graphinate-0.16.0}/src/graphinate/builders/graphql.py +56 -37
  20. {graphinate-0.15.2 → graphinate-0.16.0}/src/graphinate/builders/networkx.py +27 -10
  21. {graphinate-0.15.2 → graphinate-0.16.0}/src/graphinate/cli.py +9 -6
  22. {graphinate-0.15.2 → graphinate-0.16.0}/src/graphinate/modeling.py +63 -24
  23. {graphinate-0.15.2 → graphinate-0.16.0}/src/graphinate/renderers/graphql.py +23 -7
  24. {graphinate-0.15.2 → graphinate-0.16.0}/tests/graphinate/builders/test_graphql.py +97 -0
  25. {graphinate-0.15.2 → graphinate-0.16.0}/tests/graphinate/renderers/test_graphql_server.py +2 -3
  26. {graphinate-0.15.2 → graphinate-0.16.0}/tests/graphinate/test_cli.py +11 -10
  27. {graphinate-0.15.2 → graphinate-0.16.0}/tests/graphinate/test_modeling.py +114 -6
  28. graphinate-0.16.0/tests/graphinate/test_tools.py +63 -0
  29. graphinate-0.16.0/uv.lock +3788 -0
  30. graphinate-0.15.2/design/proposals/GEP-003_Roadmap.md +0 -84
  31. graphinate-0.15.2/docs/usage/cli.md +0 -53
  32. {graphinate-0.15.2 → graphinate-0.16.0}/.coveragerc +0 -0
  33. {graphinate-0.15.2 → graphinate-0.16.0}/.deepsource.toml +0 -0
  34. {graphinate-0.15.2 → graphinate-0.16.0}/.github/dependabot.yml +0 -0
  35. {graphinate-0.15.2 → graphinate-0.16.0}/.github/workflows/codeql.yml +0 -0
  36. {graphinate-0.15.2 → graphinate-0.16.0}/.gitignore +0 -0
  37. {graphinate-0.15.2 → graphinate-0.16.0}/.python-version +0 -0
  38. {graphinate-0.15.2 → graphinate-0.16.0}/.sonarcloud.properties +0 -0
  39. {graphinate-0.15.2 → graphinate-0.16.0}/AGENTS.md +0 -0
  40. {graphinate-0.15.2 → graphinate-0.16.0}/LICENSE +0 -0
  41. {graphinate-0.15.2 → graphinate-0.16.0}/PERSONA.md +0 -0
  42. {graphinate-0.15.2 → graphinate-0.16.0}/PRINCIPLES.md +0 -0
  43. {graphinate-0.15.2 → graphinate-0.16.0}/STYLEGUIDE.md +0 -0
  44. {graphinate-0.15.2 → graphinate-0.16.0}/TELEMETRY.md +0 -0
  45. {graphinate-0.15.2 → graphinate-0.16.0}/TOOLS.md +0 -0
  46. {graphinate-0.15.2 → graphinate-0.16.0}/benchmarks/color_benchmark.py +0 -0
  47. {graphinate-0.15.2 → graphinate-0.16.0}/benchmarks/conftest.py +0 -0
  48. {graphinate-0.15.2 → graphinate-0.16.0}/benchmarks/test_builders_benchmark.py +0 -0
  49. {graphinate-0.15.2 → graphinate-0.16.0}/benchmarks/test_color_benchmark.py +0 -0
  50. {graphinate-0.15.2 → graphinate-0.16.0}/benchmarks/test_converters_benchmark.py +0 -0
  51. {graphinate-0.15.2 → graphinate-0.16.0}/benchmarks/test_modeling_benchmark.py +0 -0
  52. {graphinate-0.15.2 → graphinate-0.16.0}/design/analysis/Builders_Analysis.md +0 -0
  53. {graphinate-0.15.2 → graphinate-0.16.0}/design/analysis/CLI_Analysis.md +0 -0
  54. {graphinate-0.15.2 → graphinate-0.16.0}/design/analysis/Core_Analysis.md +0 -0
  55. {graphinate-0.15.2 → graphinate-0.16.0}/design/analysis/GraphModel_Analysis.md +0 -0
  56. {graphinate-0.15.2 → graphinate-0.16.0}/design/analysis/Renderers_Analysis.md +0 -0
  57. {graphinate-0.15.2 → graphinate-0.16.0}/design/analysis/Server_Analysis.md +0 -0
  58. {graphinate-0.15.2 → graphinate-0.16.0}/design/analysis/Viewer_Analysis.md +0 -0
  59. {graphinate-0.15.2 → graphinate-0.16.0}/design/art_prompts.md +0 -0
  60. {graphinate-0.15.2 → graphinate-0.16.0}/design/art_prompts_v1.md +0 -0
  61. {graphinate-0.15.2 → graphinate-0.16.0}/design/art_prompts_v2.md +0 -0
  62. {graphinate-0.15.2 → graphinate-0.16.0}/design/grading/Builders_Grading.md +0 -0
  63. {graphinate-0.15.2 → graphinate-0.16.0}/design/grading/CLI_Grading.md +0 -0
  64. {graphinate-0.15.2 → graphinate-0.16.0}/design/grading/Core_Grading.md +0 -0
  65. {graphinate-0.15.2 → graphinate-0.16.0}/design/grading/Modeling_Grading.md +0 -0
  66. {graphinate-0.15.2 → graphinate-0.16.0}/design/grading/Renderers_Grading.md +0 -0
  67. {graphinate-0.15.2 → graphinate-0.16.0}/design/grading/Server_Grading.md +0 -0
  68. {graphinate-0.15.2 → graphinate-0.16.0}/design/grading/Viewer_Grading.md +0 -0
  69. {graphinate-0.15.2 → graphinate-0.16.0}/design/prompts/01_The_Foundations.md +0 -0
  70. {graphinate-0.15.2 → graphinate-0.16.0}/design/prompts/02_The_Fantastical.md +0 -0
  71. {graphinate-0.15.2 → graphinate-0.16.0}/design/prompts/03_The_Analog.md +0 -0
  72. {graphinate-0.15.2 → graphinate-0.16.0}/design/prompts/04_The_Avant_Garde.md +0 -0
  73. {graphinate-0.15.2 → graphinate-0.16.0}/design/prompts/05_The_Pop_Culture.md +0 -0
  74. {graphinate-0.15.2 → graphinate-0.16.0}/design/prompts/06_The_Modern.md +0 -0
  75. {graphinate-0.15.2 → graphinate-0.16.0}/design/prompts/07_Graphinate_2.0.md +0 -0
  76. {graphinate-0.15.2 → graphinate-0.16.0}/design/proposals/GEP-000_Graphinate_Enhancement_Proposals.md +0 -0
  77. {graphinate-0.15.2 → graphinate-0.16.0}/design/proposals/GEP-001_The_Graphinate_Mission.md +0 -0
  78. {graphinate-0.15.2 → graphinate-0.16.0}/design/proposals/GEP-002_Modularization_Strategy.md +0 -0
  79. {graphinate-0.15.2 → graphinate-0.16.0}/design/proposals/GEP-007_Theoretical_Foundations.md +0 -0
  80. {graphinate-0.15.2 → graphinate-0.16.0}/design/proposals/GEP-011_Standardized_Element_Factory.md +0 -0
  81. {graphinate-0.15.2 → graphinate-0.16.0}/design/proposals/GEP-012_Robust_Model_Composition.md +0 -0
  82. {graphinate-0.15.2 → graphinate-0.16.0}/design/proposals/GEP-013_Stable_ID_Serialization.md +0 -0
  83. {graphinate-0.15.2 → graphinate-0.16.0}/design/proposals/GEP-014_Explicit_GraphQL_Schema_Generation.md +0 -0
  84. {graphinate-0.15.2 → graphinate-0.16.0}/design/proposals/GEP-015_Refactored_Graph_Population_Strategies.md +0 -0
  85. {graphinate-0.15.2 → graphinate-0.16.0}/design/proposals/GEP-018_Relay_Support.md +0 -0
  86. {graphinate-0.15.2 → graphinate-0.16.0}/design/proposals/GEP-019_Offline_Viewer_Support.md +0 -0
  87. {graphinate-0.15.2 → graphinate-0.16.0}/design/proposals/GEP-020_Modular_Frontend_Architecture.md +0 -0
  88. {graphinate-0.15.2 → graphinate-0.16.0}/design/proposals/GEP-022_2D_Visualization_Mode.md +0 -0
  89. {graphinate-0.15.2 → graphinate-0.16.0}/design/proposals/GEP-023_Async_Support.md +0 -0
  90. {graphinate-0.15.2 → graphinate-0.16.0}/design/proposals/GEP-024_The_Graph_Engine.md +0 -0
  91. {graphinate-0.15.2 → graphinate-0.16.0}/design/proposals/GEP-025_Signed_ID_Serialization.md +0 -0
  92. {graphinate-0.15.2 → graphinate-0.16.0}/design/proposals/GEP-026_Pluggable_Visualization_and_Notebook_Support.md +0 -0
  93. {graphinate-0.15.2 → graphinate-0.16.0}/design/proposals/GEP-027_Advanced_ThreeJS_Visualizations.md +0 -0
  94. {graphinate-0.15.2 → graphinate-0.16.0}/design/proposals/GEP-028_MCP_Server_Integration.md +0 -0
  95. {graphinate-0.15.2 → graphinate-0.16.0}/design/proposals/GEP-029_Extraction_Strategies.md +0 -0
  96. {graphinate-0.15.2 → graphinate-0.16.0}/design/proposals/GEP-030_Node_Type_Taxonomy.md +0 -0
  97. {graphinate-0.15.2 → graphinate-0.16.0}/docs/acknowledgements.md +0 -0
  98. {graphinate-0.15.2 → graphinate-0.16.0}/docs/advanced/modeling.md +0 -0
  99. {graphinate-0.15.2 → graphinate-0.16.0}/docs/advanced/optimization.md +0 -0
  100. {graphinate-0.15.2 → graphinate-0.16.0}/docs/advanced/secure_ids.md +0 -0
  101. {graphinate-0.15.2 → graphinate-0.16.0}/docs/assets/badge/v0.json +0 -0
  102. {graphinate-0.15.2 → graphinate-0.16.0}/docs/assets/images/logo-128.png +0 -0
  103. {graphinate-0.15.2 → graphinate-0.16.0}/docs/assets/images/network_graph.png +0 -0
  104. {graphinate-0.15.2 → graphinate-0.16.0}/docs/assets/stylesheets/extra.css +0 -0
  105. {graphinate-0.15.2 → graphinate-0.16.0}/docs/development.md +0 -0
  106. {graphinate-0.15.2 → graphinate-0.16.0}/docs/diagrams/class_diagram.md +0 -0
  107. {graphinate-0.15.2 → graphinate-0.16.0}/docs/diagrams/component_diagram.md +0 -0
  108. {graphinate-0.15.2 → graphinate-0.16.0}/docs/diagrams/function_call_graph.md +0 -0
  109. {graphinate-0.15.2 → graphinate-0.16.0}/docs/examples/code.md +0 -0
  110. {graphinate-0.15.2 → graphinate-0.16.0}/docs/examples/github.md +0 -0
  111. {graphinate-0.15.2 → graphinate-0.16.0}/docs/examples/math.md +0 -0
  112. {graphinate-0.15.2 → graphinate-0.16.0}/docs/examples/social.md +0 -0
  113. {graphinate-0.15.2 → graphinate-0.16.0}/docs/examples/system.md +0 -0
  114. {graphinate-0.15.2 → graphinate-0.16.0}/docs/examples/web.md +0 -0
  115. {graphinate-0.15.2 → graphinate-0.16.0}/docs/gen_ref_pages.py +0 -0
  116. {graphinate-0.15.2 → graphinate-0.16.0}/docs/index.md +0 -0
  117. {graphinate-0.15.2 → graphinate-0.16.0}/docs/introduction.md +0 -0
  118. {graphinate-0.15.2 → graphinate-0.16.0}/docs/start.md +0 -0
  119. {graphinate-0.15.2 → graphinate-0.16.0}/docs/tutorial.md +0 -0
  120. {graphinate-0.15.2 → graphinate-0.16.0}/examples/code/git_commits.py +0 -0
  121. {graphinate-0.15.2 → graphinate-0.16.0}/examples/code/python_ast.py +0 -0
  122. {graphinate-0.15.2 → graphinate-0.16.0}/examples/code/python_dependencies.py +0 -0
  123. {graphinate-0.15.2 → graphinate-0.16.0}/examples/code/requirements.txt +0 -0
  124. {graphinate-0.15.2 → graphinate-0.16.0}/examples/code/tokens.py +0 -0
  125. {graphinate-0.15.2 → graphinate-0.16.0}/examples/github/_client.py +0 -0
  126. {graphinate-0.15.2 → graphinate-0.16.0}/examples/github/commits_visibilty_graph.py +0 -0
  127. {graphinate-0.15.2 → graphinate-0.16.0}/examples/github/followers.graphql +0 -0
  128. {graphinate-0.15.2 → graphinate-0.16.0}/examples/github/followers.py +0 -0
  129. {graphinate-0.15.2 → graphinate-0.16.0}/examples/github/graphql.config.yml +0 -0
  130. {graphinate-0.15.2 → graphinate-0.16.0}/examples/github/repositories.graphql +0 -0
  131. {graphinate-0.15.2 → graphinate-0.16.0}/examples/github/repositories.py +0 -0
  132. {graphinate-0.15.2 → graphinate-0.16.0}/examples/github/requirements.txt +0 -0
  133. {graphinate-0.15.2 → graphinate-0.16.0}/examples/math/_test_materializers.py +0 -0
  134. {graphinate-0.15.2 → graphinate-0.16.0}/examples/math/graph_atlas.py +0 -0
  135. {graphinate-0.15.2 → graphinate-0.16.0}/examples/math/graphs.py +0 -0
  136. {graphinate-0.15.2 → graphinate-0.16.0}/examples/math/gui.py +0 -0
  137. {graphinate-0.15.2 → graphinate-0.16.0}/examples/math/materializers.py +0 -0
  138. {graphinate-0.15.2 → graphinate-0.16.0}/examples/math/polygonal_graph.py +0 -0
  139. {graphinate-0.15.2 → graphinate-0.16.0}/examples/math/requirements.txt +0 -0
  140. {graphinate-0.15.2 → graphinate-0.16.0}/examples/social/cache/13/dd/73ce25face7beb30b69b64feeb77.val +0 -0
  141. {graphinate-0.15.2 → graphinate-0.16.0}/examples/social/cache/21/9e/00846f323987ba16cfbe0127d8eb.val +0 -0
  142. {graphinate-0.15.2 → graphinate-0.16.0}/examples/social/cache/70/b6/2aefb0269adce7fedf877fa0d267.val +0 -0
  143. {graphinate-0.15.2 → graphinate-0.16.0}/examples/social/cache/87/f5/ec1739bc369e84c3fcb302bf532a.val +0 -0
  144. {graphinate-0.15.2 → graphinate-0.16.0}/examples/social/cache/ba/fe/3aca7b2c38abff60e7ce5eb486a8.val +0 -0
  145. {graphinate-0.15.2 → graphinate-0.16.0}/examples/social/cache/c7/9e/ce82b0288020b7152779df09bd73.val +0 -0
  146. {graphinate-0.15.2 → graphinate-0.16.0}/examples/social/cache/cache.db +0 -0
  147. {graphinate-0.15.2 → graphinate-0.16.0}/examples/social/cache/d2/53/3b88f2fc162561cfdbbe9abc352a.val +0 -0
  148. {graphinate-0.15.2 → graphinate-0.16.0}/examples/social/cache/e2/d5/5d079f200eabf9b625b0473f6fbe.val +0 -0
  149. {graphinate-0.15.2 → graphinate-0.16.0}/examples/social/gui.py +0 -0
  150. {graphinate-0.15.2 → graphinate-0.16.0}/examples/social/music_artists.py +0 -0
  151. {graphinate-0.15.2 → graphinate-0.16.0}/examples/social/requirements.txt +0 -0
  152. {graphinate-0.15.2 → graphinate-0.16.0}/examples/system/.ignore +0 -0
  153. {graphinate-0.15.2 → graphinate-0.16.0}/examples/system/files.py +0 -0
  154. {graphinate-0.15.2 → graphinate-0.16.0}/examples/system/processes.py +0 -0
  155. {graphinate-0.15.2 → graphinate-0.16.0}/examples/system/requirements.txt +0 -0
  156. {graphinate-0.15.2 → graphinate-0.16.0}/examples/web/html_dom.py +0 -0
  157. {graphinate-0.15.2 → graphinate-0.16.0}/examples/web/page_links.py +0 -0
  158. {graphinate-0.15.2 → graphinate-0.16.0}/examples/web/requirements.txt +0 -0
  159. {graphinate-0.15.2 → graphinate-0.16.0}/playground/check_repo.py +0 -0
  160. {graphinate-0.15.2 → graphinate-0.16.0}/playground/ethernet/traceroute.py +0 -0
  161. {graphinate-0.15.2 → graphinate-0.16.0}/playground/genric_graph.graphql +0 -0
  162. {graphinate-0.15.2 → graphinate-0.16.0}/playground/graphql.config.yml +0 -0
  163. {graphinate-0.15.2 → graphinate-0.16.0}/playground/house_of_graphs.py +0 -0
  164. {graphinate-0.15.2 → graphinate-0.16.0}/playground/octagonal_graph.py +0 -0
  165. {graphinate-0.15.2 → graphinate-0.16.0}/playground/science/caffeine.py +0 -0
  166. {graphinate-0.15.2 → graphinate-0.16.0}/playground/social/db.xml +0 -0
  167. {graphinate-0.15.2 → graphinate-0.16.0}/playground/social/music.py +0 -0
  168. {graphinate-0.15.2 → graphinate-0.16.0}/playground/social/requirements.txt +0 -0
  169. {graphinate-0.15.2 → graphinate-0.16.0}/playground/text/nlp_graph.py +0 -0
  170. {graphinate-0.15.2 → graphinate-0.16.0}/playground/text/requirements.txt +0 -0
  171. {graphinate-0.15.2 → graphinate-0.16.0}/playground/time_series/requirements.txt +0 -0
  172. {graphinate-0.15.2 → graphinate-0.16.0}/playground/time_series/visibility_graph.py +0 -0
  173. {graphinate-0.15.2 → graphinate-0.16.0}/playground/word_graph.py +0 -0
  174. {graphinate-0.15.2 → graphinate-0.16.0}/properdocs.yml +0 -0
  175. {graphinate-0.15.2 → graphinate-0.16.0}/sonar-project.properties +0 -0
  176. {graphinate-0.15.2 → graphinate-0.16.0}/src/graphinate/__init__.py +0 -0
  177. {graphinate-0.15.2 → graphinate-0.16.0}/src/graphinate/__main__.py +0 -0
  178. {graphinate-0.15.2 → graphinate-0.16.0}/src/graphinate/_secure.py +0 -0
  179. {graphinate-0.15.2 → graphinate-0.16.0}/src/graphinate/builders/__init__.py +0 -0
  180. {graphinate-0.15.2 → graphinate-0.16.0}/src/graphinate/builders/builder.py +0 -0
  181. {graphinate-0.15.2 → graphinate-0.16.0}/src/graphinate/builders/d3.py +0 -0
  182. {graphinate-0.15.2 → graphinate-0.16.0}/src/graphinate/builders/mermaid.py +0 -0
  183. {graphinate-0.15.2 → graphinate-0.16.0}/src/graphinate/color.py +0 -0
  184. {graphinate-0.15.2 → graphinate-0.16.0}/src/graphinate/constants.py +0 -0
  185. {graphinate-0.15.2 → graphinate-0.16.0}/src/graphinate/converters.py +0 -0
  186. {graphinate-0.15.2 → graphinate-0.16.0}/src/graphinate/enums.py +0 -0
  187. {graphinate-0.15.2 → graphinate-0.16.0}/src/graphinate/renderers/__init__.py +0 -0
  188. {graphinate-0.15.2 → graphinate-0.16.0}/src/graphinate/renderers/matplotlib.py +0 -0
  189. {graphinate-0.15.2 → graphinate-0.16.0}/src/graphinate/server/__init__.py +0 -0
  190. {graphinate-0.15.2 → graphinate-0.16.0}/src/graphinate/server/starlette/__init__.py +0 -0
  191. {graphinate-0.15.2 → graphinate-0.16.0}/src/graphinate/server/starlette/views.py +0 -0
  192. {graphinate-0.15.2 → graphinate-0.16.0}/src/graphinate/server/web/__init__.py +0 -0
  193. {graphinate-0.15.2 → graphinate-0.16.0}/src/graphinate/server/web/elements/index.html +0 -0
  194. {graphinate-0.15.2 → graphinate-0.16.0}/src/graphinate/server/web/graphiql/index.html +0 -0
  195. {graphinate-0.15.2 → graphinate-0.16.0}/src/graphinate/server/web/rapidoc/index.html +0 -0
  196. {graphinate-0.15.2 → graphinate-0.16.0}/src/graphinate/server/web/static/images/logo-128.png +0 -0
  197. {graphinate-0.15.2 → graphinate-0.16.0}/src/graphinate/server/web/static/images/logo.svg +0 -0
  198. {graphinate-0.15.2 → graphinate-0.16.0}/src/graphinate/server/web/static/images/network_graph.png +0 -0
  199. {graphinate-0.15.2 → graphinate-0.16.0}/src/graphinate/server/web/viewer/index.html +0 -0
  200. {graphinate-0.15.2 → graphinate-0.16.0}/src/graphinate/server/web/voyager/index.html +0 -0
  201. {graphinate-0.15.2 → graphinate-0.16.0}/src/graphinate/tools.py +0 -0
  202. {graphinate-0.15.2 → graphinate-0.16.0}/src/graphinate/typing.py +0 -0
  203. {graphinate-0.15.2 → graphinate-0.16.0}/tests/conftest.py +0 -0
  204. {graphinate-0.15.2 → graphinate-0.16.0}/tests/graphinate/builders/test_build.py +0 -0
  205. {graphinate-0.15.2 → graphinate-0.16.0}/tests/graphinate/builders/test_d3.py +0 -0
  206. {graphinate-0.15.2 → graphinate-0.16.0}/tests/graphinate/builders/test_mermaid.py +0 -0
  207. {graphinate-0.15.2 → graphinate-0.16.0}/tests/graphinate/builders/test_networkx.py +0 -0
  208. {graphinate-0.15.2 → graphinate-0.16.0}/tests/graphinate/renderers/test_matplotlib_draw.py +0 -0
  209. {graphinate-0.15.2 → graphinate-0.16.0}/tests/graphinate/renderers/test_matplotlib_plot.py +0 -0
  210. {graphinate-0.15.2 → graphinate-0.16.0}/tests/graphinate/server/test_starlette.py +0 -0
  211. {graphinate-0.15.2 → graphinate-0.16.0}/tests/graphinate/test_color.py +0 -0
  212. {graphinate-0.15.2 → graphinate-0.16.0}/tests/graphinate/test_converters.py +0 -0
  213. {graphinate-0.15.2 → graphinate-0.16.0}/tests/graphinate/test_modeling_add.py +0 -0
  214. {graphinate-0.15.2 → graphinate-0.16.0}/tests/graphinate/test_server.py +0 -0
@@ -23,9 +23,9 @@ jobs:
23
23
  steps:
24
24
  - uses: actions/checkout@v7
25
25
  - name: Set up UV and Python
26
- uses: astral-sh/setup-uv@v9.0.0
26
+ uses: astral-sh/setup-uv@v10.3.0
27
27
  with:
28
- python-version: "3.14"
28
+ python-version: "3.15"
29
29
  - name: Install dependencies
30
30
  run: uv sync --all-extras --group test
31
31
  - name: Run benchmarks
@@ -12,9 +12,9 @@ jobs:
12
12
  - name: Checkout repository
13
13
  uses: actions/checkout@v7
14
14
  - name: Set up UV and Python
15
- uses: astral-sh/setup-uv@v9.0.0
15
+ uses: astral-sh/setup-uv@v10.3.0
16
16
  with:
17
- python-version: "3.14"
17
+ python-version: "3.15"
18
18
  - run: echo "cache_id=$(date --utc '+%V')" >> $GITHUB_ENV
19
19
  - name: Cache mkdocs-materialx dependencies
20
20
  uses: actions/cache@v6
@@ -22,9 +22,9 @@ jobs:
22
22
  steps:
23
23
  - uses: actions/checkout@v7
24
24
  - name: Install uv
25
- uses: astral-sh/setup-uv@v9.0.0
25
+ uses: astral-sh/setup-uv@v10.3.0
26
26
  with:
27
- python-version: "3.14"
27
+ python-version: "3.15"
28
28
  - name: Build package
29
29
  run: uv build
30
30
  - name: Publish package
@@ -16,11 +16,11 @@ jobs:
16
16
  fail-fast: false
17
17
  matrix:
18
18
  # https://github.com/actions/python-versions/blob/main/versions-manifest.json
19
- python-version: [ "3.15.0-rc.1", "3.15.0-rc.1t" ]
19
+ python-version: [ "3.16.0-alpha.1", "3.16.0-alpha.1t" ]
20
20
  steps:
21
21
  - uses: actions/checkout@v7
22
22
  - name: Set up UV and Python ${{ matrix.python-version }}
23
- uses: astral-sh/setup-uv@v9.0.0
23
+ uses: astral-sh/setup-uv@v10.3.0
24
24
  with:
25
25
  python-version: ${{ matrix.python-version }}
26
26
  - name: Install dependencies
@@ -16,11 +16,11 @@ jobs:
16
16
  fail-fast: false
17
17
  matrix:
18
18
  # https://github.com/actions/python-versions/blob/main/versions-manifest.json
19
- python-version: [ "3.11", "3.12", "3.13", "3.14", "3.14t" ]
19
+ python-version: [ "3.11", "3.12", "3.13", "3.14", "3.14t", "3.15", "3.15t" ]
20
20
  steps:
21
21
  - uses: actions/checkout@v7
22
22
  - name: Set up UV and Python ${{ matrix.python-version }}
23
- uses: astral-sh/setup-uv@v9.0.0
23
+ uses: astral-sh/setup-uv@v10.3.0
24
24
  with:
25
25
  python-version: ${{ matrix.python-version }}
26
26
  - name: Install dependencies
@@ -1,3 +1,20 @@
1
+ ## v0.16.0 (2026-10-17)
2
+
3
+ ### Feat
4
+
5
+ - **GEP-017**: Exposes `create_app` for Starlette application setup.
6
+
7
+ ### Fix
8
+
9
+ - Adds model compilation and refines node and GraphQL builders.
10
+
11
+ ## v0.15.3 (2026-10-17)
12
+
13
+ ### Fix
14
+
15
+ - Corrects InfNumber scalar definition using NewType and config.
16
+ - Corrects `model_option` type instantiation and refines its type hint.
17
+
1
18
  ## v0.15.2 (2026-08-21)
2
19
 
3
20
  ### Fix
@@ -1,12 +1,13 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: Graphinate
3
- Version: 0.15.2
3
+ Version: 0.16.0
4
4
  Summary: Graphinate. Data to Graphs.
5
5
  Project-URL: Homepage, https://erivlis.github.io/graphinate
6
6
  Project-URL: Documentation, https://erivlis.github.io/graphinate
7
7
  Project-URL: Bug Tracker, https://github.com/erivlis/graphinate/issues
8
8
  Project-URL: Source, https://github.com/erivlis/graphinate
9
9
  Author-email: Eran Rivlis <eran@rivlis.info>
10
+ License-Expression: LGPL-3.0-or-later
10
11
  License-File: LICENSE
11
12
  Keywords: declarative,graph
12
13
  Classifier: Development Status :: 4 - Beta
@@ -22,12 +23,14 @@ Classifier: Programming Language :: Python :: 3.11
22
23
  Classifier: Programming Language :: Python :: 3.12
23
24
  Classifier: Programming Language :: Python :: 3.13
24
25
  Classifier: Programming Language :: Python :: 3.14
26
+ Classifier: Programming Language :: Python :: 3.15
25
27
  Classifier: Programming Language :: Python :: Free Threading :: 2 - Beta
26
28
  Classifier: Programming Language :: Python :: Implementation :: CPython
27
29
  Classifier: Topic :: Scientific/Engineering
28
30
  Classifier: Topic :: Software Development :: Libraries
29
31
  Classifier: Typing :: Typed
30
32
  Requires-Python: >=3.11
33
+ Requires-Dist: httpx2
31
34
  Requires-Dist: inflect
32
35
  Requires-Dist: loguru
33
36
  Requires-Dist: mappingtools
@@ -206,7 +209,7 @@ or
206
209
  uv add graphinate[server]
207
210
  ```
208
211
 
209
- **Graphinate** officially supports Python >= 3.10.
212
+ **Graphinate** officially supports Python >= 3.11.
210
213
 
211
214
  ### Example
212
215
 
@@ -249,7 +252,7 @@ mermaid_markdown: str = graphinate.mermaid.markdown(diagram)
249
252
  mermaid_html: str = graphinate.mermaid.html(diagram, title=graph_model.name)
250
253
 
251
254
  # or use the GraphQL Builder
252
- builder = graphinate.builders.GraphQLBuilder(.graph_model)
255
+ builder = graphinate.builders.GraphQLBuilder(graph_model)
253
256
 
254
257
  # to create a Strawberry GraphQL schema
255
258
  schema = builder.build()
@@ -159,7 +159,7 @@ or
159
159
  uv add graphinate[server]
160
160
  ```
161
161
 
162
- **Graphinate** officially supports Python >= 3.10.
162
+ **Graphinate** officially supports Python >= 3.11.
163
163
 
164
164
  ### Example
165
165
 
@@ -202,7 +202,7 @@ mermaid_markdown: str = graphinate.mermaid.markdown(diagram)
202
202
  mermaid_html: str = graphinate.mermaid.html(diagram, title=graph_model.name)
203
203
 
204
204
  # or use the GraphQL Builder
205
- builder = graphinate.builders.GraphQLBuilder(.graph_model)
205
+ builder = graphinate.builders.GraphQLBuilder(graph_model)
206
206
 
207
207
  # to create a Strawberry GraphQL schema
208
208
  schema = builder.build()
@@ -0,0 +1,122 @@
1
+ # GEP-003: Graphinate Development Roadmap
2
+
3
+ | Field | Value |
4
+ |:------------|:------------------------|
5
+ | **GEP** | 3 |
6
+ | **Title** | Development Roadmap |
7
+ | **Author** | Eran Rivlis |
8
+ | **Status** | Active |
9
+ | **Type** | Process |
10
+ | **Created** | 2025-12-30 |
11
+ | **Updated** | 2026-10-17 |
12
+
13
+ ## Abstract
14
+
15
+ This document outlines the strategic execution plan for the Graphinate Enhancement Proposals (GEPs). It serves as a living document to track the prioritization and status of major initiatives.
16
+
17
+ ## Phase 1: Stabilization (Completed)
18
+
19
+ *Focus: Fixing brittle code, security risks, and "bad magic". All Phase 1 stabilization proposals (**GEP-010**, **GEP-016**, **GEP-017**, **GEP-025**, **GEP-032**) have been implemented and archived.*
20
+
21
+ ## Phase 2: Core Spine & Architectural Health
22
+
23
+ *Focus: Strengthening the core execution engine, schema generation, and modularity.*
24
+
25
+ | GEP | Title | Impact | Difficulty | Rationale |
26
+ |:------------|:----------------------------------------------|:---------|:-----------|:-------------------------------------------------------------------------------------------------------------------------------------|
27
+ | **GEP-024** | **The Graph Engine** | **High** | **Hard** | **Core Architecture.** Extracting the execution logic is the foundation for Async, Realtime, and better testing. Supersedes GEP-015. |
28
+ | **GEP-014** | **Explicit GraphQL Schema Generation** | **High** | **Hard** | **Major Refactor.** Refactoring dynamic class generation to `strawberry.tools.create_type` and context-injected resolvers. |
29
+ | **GEP-023** | **Async Support** | **High** | **Hard** | **Performance.** Massive gains for I/O-bound crawling (`async def` generators). Dependent on GEP-024. |
30
+ | **GEP-019** | **Offline Viewer Support** | Medium | Easy | **Reliability.** GraphiQL/Voyager are vendored; completing local vendoring for `viewer` removes remaining CDN dependencies. |
31
+ | **GEP-031** | **High-Performance Vectorized Operations** | Medium | Medium | **Performance.** Progressive enhancement via optional NumPy/Numba (partially active in `color.py`). |
32
+ | **GEP-011** | **Standardized Element Factory** | Low | Easy | **Cleanup.** Minor API improvement for element tuple construction. |
33
+ | **GEP-012** | **Robust Model Composition** | Low | Easy | **Cleanup.** Handling advanced edge cases in `ModelA + ModelB` merging. |
34
+
35
+ ## Phase 3: Focused Expansion
36
+
37
+ *Focus: Practical extensions that build directly on the core engine and schema.*
38
+
39
+ | GEP | Title | Impact | Difficulty | Rationale |
40
+ |:------------|:----------------------------------|:---------|:-----------|:-------------------------------------------------------------------------------------------------------|
41
+ | **GEP-018** | **Relay Support** | **High** | Medium | **Enterprise Feature.** Makes the API compatible with modern frontend clients (React Relay, Apollo). |
42
+ | **GEP-020** | **Modular Frontend Architecture** | Medium | Medium | **Maintainability.** Splitting the monolithic `viewer/index.html` into maintainable ES modules. |
43
+ | **GEP-029** | **Extraction Strategies** | Medium | Medium | **Ergonomics.** Lightweight iterator/generator helpers (`scan`, `walk`, `listen`) or cookbook recipes. |
44
+
45
+ ## Phase 4: Exploratory & Spin-Off Track (Ideation / Brainstorming)
46
+
47
+ *Focus: Ideas originating from exploratory brainstorming sessions. Rather than bloating the core `graphinate` package, these proposals should be treated as candidates for standalone companion packages, external integrations, or example recipes.*
48
+
49
+ | GEP | Title | Recommended Vehicle | Rationale |
50
+ |:------------|:-----------------------------------------------|:-------------------------------------|:------------------------------------------------------------------------------------------------------------------------------|
51
+ | **GEP-026** | **Pluggable Visualization & Notebook Support** | Companion Package / Cookbook Recipes | Keeps core `graphinate` free of heavy frontend widget toolchains while enabling Jupyter/Cosmograph recipes. |
52
+ | **GEP-027** | **Advanced Three.js Visualizations** | Standalone Frontend / Demo Showcase | Custom WebGL shaders, procedural cities, and time tunnels belong in a dedicated visualization showcase, not a Python ETL lib. |
53
+ | **GEP-028** | **MCP Server Integration** | Companion Package (`graphinate-mcp`) | Ideal as a lightweight wrapper or example recipe exposing `GraphModel` and `GraphQLBuilder` to LLM agents via `fastmcp`. |
54
+ | **GEP-030** | **Node Type Taxonomy** | Cookbook Recipes / Domain Extensions | Universal ontologies (C4, Schema.org, Pygments) are best demonstrated as user-space models/recipes rather than core classes. |
55
+
56
+ ---
57
+
58
+ ## Strategic Assessment of the GEP Trajectory
59
+
60
+ ### 1. Engineering Assessment: The Three Buckets
61
+
62
+ The trajectory from **Graphinate 0.x** (a synchronous, decorator-based NetworkX/GraphQL builder) toward **Graphinate 2.0** (an observable, async-capable, type-safe Graph Synthesis Engine) is architecturally cohesive and well-differentiated in the Python ecosystem—provided that **implementation consolidation takes precedence over scope expansion**.
63
+
64
+ Across the GEP archive, proposals fall naturally into three distinct tiers:
65
+
66
+ 1. **The Core Structural Spine (`GEP-010` → `GEP-032` → `GEP-012` → `GEP-024` → `GEP-023`)**:
67
+ - This is the true heart of Graphinate: moving from implicit `_id` naming magic to explicit `ParentId` dependency injection (**GEP-010**), compiling immutable validated models (**GEP-032**), decoupling traversal (`GraphEngine`, **GEP-024**) from storage (`NetworkxBuilder`), and unlocking `async def` generators (**GEP-023**).
68
+ - Every link in this chain directly enables the next and strengthens the library's core value proposition.
69
+ 2. **Boundary & Hygiene Refactorings (`GEP-002`, `GEP-014`, `GEP-016`, `GEP-017`, `GEP-019`, `GEP-020`, `GEP-031`)**:
70
+ - Practical engineering debt paydown: exposing `create_app()` (**GEP-017**), replacing fragile dynamic class construction in `GraphQLBuilder` with `strawberry.tools.create_type` and context injection (**GEP-014**), and keeping heavy dependencies optional (**GEP-002**).
71
+ 3. **Exploratory Ideation / Ambition Creep (`GEP-026`, `GEP-027`, `GEP-028`, `GEP-029`, `GEP-030`)**:
72
+ - These proposals originated in exploratory brainstorming sessions. While intellectually rich, features like custom Three.js shaders/procedural cities (**GEP-027**), universal class ontologies mapping Schema.org/C4/Pygments (**GEP-030**), and multi-engine WebGL abstractions (**GEP-026**) risk pulling a focused ~1,200-line Python library into maintaining a sprawling JavaScript/WebGL framework or ontology library ("Second-System Syndrome").
73
+ - **Strategic Decision:** Treat Tier 3 proposals as **Exploratory / Spin-Off Candidates** (separate high-level projects, plugin packages, or cookbook examples) so the core library stays lean and faithful to **GEP-001**.
74
+
75
+ ### 2. The Council's Opinion (By Pillar)
76
+
77
+ Evaluating the codebase and GEP trajectory through the **7 Pillars of the Council Framework** (**GEP-001**):
78
+
79
+ | Council Member | Verdict | Critique & Trajectory Guidance |
80
+ |:-------------------------------|:-------:|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
81
+ | **1. Symmetry (Noether)** | **A-** | `@model.node` supports `ParentId`, hierarchy, multiplicity, and deferred compilation (**GEP-010**, **GEP-032**). Future work in **GEP-024** should consider bringing symmetric dependency/scoping ergonomics to `@model.edge`, and ensuring edges can naturally target hierarchical (`unique=False`) nodes whose keys are lineage tuples. |
82
+ | **2. Falsifiability (Popper)** | **A** | High branch coverage (~98%) and property-style tests provide a strong safety net. Every Standards Track GEP must be paired with falsifying regression tests before its status transitions to `Active`. |
83
+ | **3. Efficiency (Shannon)** | **A-** | `color.py` (**GEP-031**), `VariableNameManager` (`tools.py`), and $O(\text{deg}(v))$ GraphQL neighbor resolution are fast and lean. The primary remaining efficiency win is **GEP-002**: moving heavy packages (`matplotlib`, `strawberry-graphql`) out of mandatory core install dependencies into optional extras. |
84
+ | **4. Safety (The Golem)** | **A-** | With **GEP-025** (HMAC-SHA256 signed IDs), **GEP-032** (immutable `model.compile()` clones), and isolated `GraphNodeType` schema enums, thread-safety and concurrency hazards have been substantially hardened—critical for Python 3.13t–3.15t free-threaded execution. |
85
+ | **5. Clarity (Feynman)** | **A** | The `@model.node` / `@model.edge` declarative DSL remains simple and expressive. Completing **GEP-014** (explicit GraphQL schema generation with context injection) will remove the last major pocket of closure metaprogramming in `builders/graphql.py`. |
86
+ | **6. Consistency (Russell)** | **A-** | Case-insensitive parent resolution and explicit `_lineage` tuple propagation across recursion depths have unified behavior between `modeling.py` and `builders/networkx.py`. |
87
+ | **7. Harmony (The Steward)** | **A-** | **The Dennis Point:** Resist building custom 3D shaders (**GEP-027**) or rigid taxonomies (**GEP-030**) inside core before the execution spine (`compile()` → `GraphEngine` → `abuild()`) is complete. Keep Graphinate focused on its mission: *"A declarative, Pythonic ETL engine for synthesizing graphs from hierarchical data."* |
88
+
89
+ ---
90
+
91
+ ## Summary Priority Matrix (Core Library)
92
+
93
+ | Priority | GEP | Title | Phase |
94
+ |:---------|:------------|:-------------------------------------------|:--------|
95
+ | 1 | **GEP-024** | The Graph Engine | Phase 2 |
96
+ | 2 | **GEP-014** | Explicit GraphQL Schema Generation | Phase 2 |
97
+ | 3 | **GEP-023** | Async Support | Phase 2 |
98
+ | 4 | **GEP-019** | Offline Viewer Support | Phase 2 |
99
+ | 5 | **GEP-031** | High-Performance Vectorized Operations | Phase 2 |
100
+ | 6 | **GEP-018** | Relay Support | Phase 3 |
101
+ | 7 | **GEP-020** | Modular Frontend Architecture | Phase 3 |
102
+ | 8 | **GEP-029** | Extraction Strategies (Helpers / Recipes) | Phase 3 |
103
+
104
+ ## Archive (Completed / Withdrawn / Superseded)
105
+
106
+ | GEP | Title | Status | Reason |
107
+ |:------------|:---------------------------------------|:------------------|:-----------------------------------------------------------------------|
108
+ | **GEP-000** | Graphinate Enhancement Proposals | **Active** | Process definition. |
109
+ | **GEP-001** | The Graphinate Mission | **Active** | Mission statement. |
110
+ | **GEP-002** | Modularization Strategy | **Active** | Architectural principle. |
111
+ | **GEP-007** | Theoretical Foundations | **Active** | Informational / Theory. |
112
+ | **GEP-010** | Explicit Dependency Injection | **Active** | Implemented explicit dependency injection using `ParentId`. |
113
+ | **GEP-013** | Stable ID Serialization | **Withdrawn** | `repr()` deemed sufficient and more robust for Python types. |
114
+ | **GEP-016** | CLI Argument Parsing & Path Safety | **Active** | Implemented Typer CLI with safe dynamic argument parsing & paths. |
115
+ | **GEP-017** | Decoupled Server Architecture | **Active** | Exposed `create_app()` ASGI factory in `graphinate.renderers.graphql`. |
116
+ | **GEP-025** | Signed ID Serialization | **Active** | Implemented as an optional, opt-in HMAC-SHA256 signature layer. |
117
+ | **GEP-032** | GraphModel Compilation & Validation | **Active** | Implemented `GraphModel.compile()` and deferred validation. |
118
+ | **GEP-015** | Refactored Graph Population Strategies | **Superseded** | Replaced by **GEP-024** (The Graph Engine). |
119
+ | **GEP-022** | 2D Visualization Mode | **Superseded** | Replaced by **GEP-026** (Pluggable Visualization). |
120
+ | **GEP-027** | Advanced Three.js Visualizations | **Informational** | Exploratory design concepts (Spin-Off / Showcase Track). |
121
+
122
+
@@ -5,10 +5,10 @@
5
5
  | **GEP** | 10 |
6
6
  | **Title** | Explicit Dependency Injection |
7
7
  | **Author** | Eran Rivlis |
8
- | **Status** | Accepted |
8
+ | **Status** | Active |
9
9
  | **Type** | Standards Track |
10
10
  | **Created** | 2025-12-25 |
11
- | **Updated** | 2026-06-21 |
11
+ | **Updated** | 2026-10-17 |
12
12
 
13
13
  ## Abstract
14
14
 
@@ -144,16 +144,17 @@ and resolved within [modeling.py](file:///C:/dev/erivlis/graphinate/src/graphina
144
144
  * 2025-12-25: Initial Draft
145
145
  * 2026-06-21: Accepted Option 2 (Type Hinting) and implemented the injection engine.
146
146
  * 2026-06-22: Documented remaining structural and validation constraints as open issues/future work.
147
+ * 2026-10-17: Resolved all 5 open issues (deferred compilation validation via GEP-032, immutable `compile()` clone, explicit `_lineage` tuple tracking for non-unique recursive nodes, case-insensitive lineage resolution, and removal of `NodeModel.parameters`).
147
148
 
148
- ## Open Issues & Future Work
149
+ ## Resolved Issues (Formerly Open Issues)
149
150
 
150
- During the design review of the GEP-010 implementation, the Council of Principles identified the following remaining issues and areas for future work:
151
+ During the initial design review of the GEP-010 implementation, the Council of Principles identified five follow-up items, all of which have now been resolved:
151
152
 
152
- 1. **Eager Registration Validation:** Parameter validation (`_validate_node_dependency_registration`) currently runs eagerly at decorator execution time. This creates a strict topological import/decoration order constraint and prevents modular model composition (e.g., merging `ModelA + ModelB` where cross-dependencies are resolved only after composition). Future work will explore deferring validation to graph build time.
153
- 2. **In-place Model Mutation (`rectify`):** The builder mutates the shared `GraphModel` instance in-place during the build phase via `rectify()`. This represents a potential concurrency side-effect. Future updates should clone the model or perform mutations on localized registries.
154
- 3. **Recursive Lineage Namespace Collision:** In recursive structures (e.g., `folder -> folder`), overwriting the `folder_id` key in `kwargs` destroys the parent lineage chain, which causes parent ID resolution to fail when nodes are registered with `unique=False`. Passing an explicit lineage tuple during traversal will solve this collision.
155
- 4. **Lineage Casing Asymmetry:** While injection lookup is case-insensitive, the early-break check in `_parent_node_id` remains case-sensitive, creating potential lineage pollution for mixed-case types.
156
- 5. **Dead Code Cleanup (`NodeModel.parameters`):** The `parameters` attribute on `NodeModel` is currently obsolete and should be cleaned up.
153
+ 1. **Deferred Registration Validation (Resolved via GEP-032):** Parameter validation (`_validate_node_dependency_registration`) now runs during `GraphModel.compile()` rather than eagerly at decorator execution time, removing topological decoration-order constraints and enabling cross-model composition (`ModelA + ModelB`).
154
+ 2. **Immutable Model Compilation (Resolved via GEP-032):** `NetworkxBuilder` now compiles a clone of the `GraphModel` via `self.model.compile(...)` instead of mutating the shared `GraphModel` in-place via `rectify()`.
155
+ 3. **Recursive Lineage Namespace Collision (Resolved):** `_populate_nodes` and `_populate_node_type` now track an explicit `_lineage` tuple across recursion depth, preventing `folder -> folder` self-parenting key collisions when `unique=False`.
156
+ 4. **Lineage Casing Symmetry (Resolved):** `node_children_types`, `_validate_node_dependency_registration`, and `_parent_node_id` now resolve parent types case-insensitively.
157
+ 5. **Dead Code Cleanup (`NodeModel.parameters`) (Resolved):** Removed the obsolete `parameters` attribute from `NodeModel`.
157
158
 
158
159
  ## Copyright
159
160
 
@@ -5,9 +5,10 @@
5
5
  | **GEP** | 16 |
6
6
  | **Title** | CLI Argument Parsing & Path Safety |
7
7
  | **Author** | Eran Rivlis |
8
- | **Status** | Draft |
8
+ | **Status** | Active |
9
9
  | **Type** | Standards Track |
10
10
  | **Created** | 2025-12-25 |
11
+ | **Updated** | 2026-10-17 |
11
12
 
12
13
  ## Abstract
13
14
 
@@ -5,7 +5,7 @@
5
5
  | **GEP** | 17 |
6
6
  | **Title** | Decoupled Server Architecture |
7
7
  | **Author** | Eran Rivlis |
8
- | **Status** | Draft |
8
+ | **Status** | Active |
9
9
  | **Type** | Standards Track |
10
10
  | **Created** | 2025-12-25 |
11
11
 
@@ -28,13 +28,23 @@ This proposal suggests separating the app creation from the server execution.
28
28
  Refactor `renderers.graphql` to expose a factory function:
29
29
 
30
30
  ```python
31
- def create_app(schema: Schema, **kwargs) -> Starlette:
31
+ def create_app(
32
+ graphql_schema: strawberry.Schema,
33
+ port: int = DEFAULT_PORT,
34
+ debug: bool = False,
35
+ **kwargs: Any,
36
+ ) -> Starlette:
32
37
  # ... construct and return the app ...
33
38
  return app
34
39
 
35
40
 
36
- def server(schema: Schema, **kwargs):
37
- app = create_app(schema, **kwargs)
41
+ def server(
42
+ graphql_schema: strawberry.Schema,
43
+ port: int = DEFAULT_PORT,
44
+ debug: bool = False,
45
+ **kwargs: Any,
46
+ ) -> None:
47
+ app = create_app(graphql_schema, port=port, debug=debug, **kwargs)
38
48
  uvicorn.run(app, ...)
39
49
  ```
40
50
 
@@ -42,3 +52,13 @@ def server(schema: Schema, **kwargs):
42
52
 
43
53
  The `server` function signature will remain the same, ensuring backward compatibility. The new `create_app` function
44
54
  will be an additive change.
55
+
56
+ ## Reference Implementation
57
+
58
+ - [`src/graphinate/renderers/graphql.py`](file:///C:/dev/erivlis/graphinate/src/graphinate/renderers/graphql.py)
59
+ - [`tests/graphinate/renderers/test_graphql_server.py`](file:///C:/dev/erivlis/graphinate/tests/graphinate/renderers/test_graphql_server.py)
60
+
61
+ ## Change Log
62
+
63
+ - **2025-12-25:** Initial draft.
64
+ - **2026-10-17:** Implemented `create_app` in `graphinate.renderers.graphql` and refactored `server()` to delegate to `create_app`. Updated status to `Active`.
@@ -1,8 +1,14 @@
1
1
  # GEP-031: High-Performance Vectorized Operations
2
2
 
3
- * **Status:** Draft
4
- * **Type:** Standards Track
5
- * **Created:** 2023-10-27
3
+ | Field | Value |
4
+ |:------------|:---------------------------------------|
5
+ | **GEP** | 31 |
6
+ | **Title** | High-Performance Vectorized Operations |
7
+ | **Author** | Eran Rivlis |
8
+ | **Status** | Draft |
9
+ | **Type** | Standards Track |
10
+ | **Created** | 2023-10-27 |
11
+ | **Updated** | 2026-10-17 |
6
12
 
7
13
  ## Abstract
8
14
 
@@ -5,10 +5,10 @@
5
5
  | **GEP** | 32 |
6
6
  | **Title** | GraphModel Compilation and Validation Lifecycle |
7
7
  | **Author** | Eran Rivlis |
8
- | **Status** | Draft |
8
+ | **Status** | Active |
9
9
  | **Type** | Standards Track |
10
10
  | **Created** | 2026-06-22 |
11
- | **Updated** | 2026-06-22 |
11
+ | **Updated** | 2026-10-17 |
12
12
 
13
13
  ## Abstract
14
14
 
@@ -132,10 +132,12 @@ This proposal serves as the structural glue between several critical enhancement
132
132
  ## Reference Implementation
133
133
 
134
134
  * **Source File:** [modeling.py](file:///C:/dev/erivlis/graphinate/src/graphinate/modeling.py)
135
- * **Builder Integration:** [builder.py](file:///C:/dev/erivlis/graphinate/src/graphinate/builders/builder.py)
135
+ * **Builder Integration:** [networkx.py](file:///C:/dev/erivlis/graphinate/src/graphinate/builders/networkx.py)
136
136
 
137
137
  ---
138
138
 
139
139
  ## Change Log
140
140
 
141
141
  * 2026-06-22: Initial Draft outlining the compilation phases, late validation, and synergies with GEP-010, GEP-012, and GEP-024.
142
+ * 2026-10-17: Implemented `GraphModel.compile()`, `_validate_structural_dependencies()`, deferred dependency validation, and immutable model compilation in `NetworkxBuilder`.
143
+
@@ -0,0 +1,56 @@
1
+ ---
2
+ title: CLI
3
+ icon: lucide/command
4
+ ---
5
+ # CLI
6
+
7
+ ## Commands
8
+
9
+ ``` shell
10
+ Usage: python -m graphinate [OPTIONS] COMMAND [ARGS]...
11
+
12
+ Options:
13
+ --help Show this message and exit.
14
+
15
+ Commands:
16
+ save
17
+ server
18
+ ```
19
+
20
+ ### Save
21
+
22
+ ```console
23
+ Usage: python -m graphinate save [OPTIONS]
24
+
25
+ Options:
26
+ -m, --model MODEL A GraphModel instance reference {module-
27
+ name}:{GraphModel-instance-variable-name} For example,
28
+ given var `model=GraphModel()` defined in app.py file,
29
+ then the reference should be app:model
30
+ --debug / --no-debug Enable debug logging. [env var: GRAPHINATE_DEBUG]
31
+ --help Show this message and exit.
32
+ ```
33
+
34
+ ### Server
35
+
36
+ !!! tip
37
+
38
+ requires the `server` extra to be installed.
39
+
40
+ ```shell
41
+ pip install graphinate[server]
42
+ ```
43
+
44
+ ```console
45
+ Usage: python -m graphinate server [OPTIONS]
46
+
47
+ Options:
48
+ -m, --model MODEL A GraphModel instance reference {module-
49
+ name}:{GraphModel-instance-variable-name} For example,
50
+ given var `model=GraphModel()` defined in app.py file,
51
+ then the reference should be app:model
52
+ -p, --port INTEGER Port number.
53
+ -b, --browse / --no-browse Open web browser on start.
54
+ --debug / --no-debug Enable debug logging. [env var: GRAPHINATE_DEBUG]
55
+ --help Show this message and exit.
56
+ ```
@@ -21,7 +21,7 @@ icon: lucide/package
21
21
 
22
22
  The `GraphModel` Class which is used to declaratively register, Edge and/or Node data supplier functions.
23
23
  Using the [`GraphModel.node()`](../reference/graphinate/modeling.md#graphinate.modeling.GraphModel.node)
24
- and [`GraphMode.edge()`](../reference/graphinate/modeling.md#graphinate.modeling.GraphModel.edge) decorators.
24
+ and [`GraphModel.edge()`](../reference/graphinate/modeling.md#graphinate.modeling.GraphModel.edge) decorators.
25
25
 
26
26
  ### Builders
27
27
 
@@ -1,10 +1,12 @@
1
1
  [project]
2
2
  name = "Graphinate"
3
- version = "0.15.2"
3
+ version = "0.16.0"
4
4
  description = "Graphinate. Data to Graphs."
5
5
  authors = [
6
6
  { name = "Eran Rivlis", email = "eran@rivlis.info" },
7
7
  ]
8
+ license = "LGPL-3.0-or-later"
9
+ license-files = ["LICENSE"]
8
10
  readme = "README.md"
9
11
  requires-python = ">=3.11"
10
12
  classifiers = [
@@ -17,6 +19,7 @@ classifiers = [
17
19
  "Programming Language :: Python :: 3.12",
18
20
  "Programming Language :: Python :: 3.13",
19
21
  "Programming Language :: Python :: 3.14",
22
+ "Programming Language :: Python :: 3.15",
20
23
  "Programming Language :: Python :: 3 :: Only",
21
24
  "Programming Language :: Python :: Implementation :: CPython",
22
25
  "Programming Language :: Python :: Free Threading :: 2 - Beta", # Build works, but multi-threaded testing might be incomplete.
@@ -29,6 +32,7 @@ classifiers = [
29
32
  ]
30
33
  keywords = ['graph', 'declarative']
31
34
  dependencies = [
35
+ "httpx2",
32
36
  "inflect",
33
37
  "loguru",
34
38
  "mappingtools",
@@ -211,7 +215,7 @@ multiline-quotes = "single"
211
215
  max-complexity = 18
212
216
 
213
217
  [tool.mypy]
214
- python_version = "3.10"
218
+ python_version = "3.11"
215
219
  warn_return_any = true
216
220
  warn_unused_configs = true
217
221
  ignore_missing_imports = true
@@ -103,9 +103,9 @@ print(mermaid_string)
103
103
  ## 5. Gotchas & Best Practices
104
104
 
105
105
  - **The Command Center (`graphinate.cli`)**: For quick builds or serving, use the CLI:
106
- - `graphinate build --model <path/to/model.py>`
107
- - `graphinate serve --model <path/to/model.py>`
108
- - **The Broadcaster (`graphinate.server`)**: The `serve` command requires optional dependencies. If it fails, the user
106
+ - `graphinate save --model <module:model>`
107
+ - `graphinate server --model <module:model>`
108
+ - **The Broadcaster (`graphinate.server`)**: The `server` command requires optional dependencies. If it fails, the user
109
109
  needs to run:
110
110
  ```bash
111
111
  pip install "graphinate[server]"