Graphinate 0.7.0__tar.gz → 0.8.1__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 (129) hide show
  1. graphinate-0.8.1/.coveragerc +3 -0
  2. {graphinate-0.7.0 → graphinate-0.8.1}/.github/workflows/codeql.yml +5 -5
  3. {graphinate-0.7.0 → graphinate-0.8.1}/.github/workflows/publish-docs.yaml +1 -1
  4. {graphinate-0.7.0 → graphinate-0.8.1}/.github/workflows/test.yml +6 -1
  5. {graphinate-0.7.0 → graphinate-0.8.1}/PKG-INFO +111 -31
  6. {graphinate-0.7.0 → graphinate-0.8.1}/README.md +108 -29
  7. graphinate-0.8.1/docs/.dates_cache.json +86 -0
  8. {graphinate-0.7.0 → graphinate-0.8.1}/docs/acknowledge.md +8 -5
  9. {graphinate-0.7.0 → graphinate-0.8.1}/docs/examples/code.md +12 -7
  10. graphinate-0.8.1/docs/examples/social.md +15 -0
  11. graphinate-0.8.1/docs/examples/web.md +35 -0
  12. {graphinate-0.7.0 → graphinate-0.8.1}/docs/gen_ref_pages.py +1 -1
  13. graphinate-0.8.1/docs/index.md +4 -0
  14. {graphinate-0.7.0 → graphinate-0.8.1}/docs/intro.md +46 -21
  15. graphinate-0.8.1/docs/start.md +76 -0
  16. graphinate-0.8.1/docs/tutorial.md +345 -0
  17. {graphinate-0.7.0 → graphinate-0.8.1}/docs/usage/cli.md +1 -1
  18. {graphinate-0.7.0 → graphinate-0.8.1}/docs/usage/lib.md +5 -19
  19. graphinate-0.8.1/examples/code/git_commits.py +59 -0
  20. {graphinate-0.7.0 → graphinate-0.8.1}/examples/code/python_ast.py +48 -7
  21. {graphinate-0.7.0 → graphinate-0.8.1}/examples/code/python_dependencies.py +2 -5
  22. {graphinate-0.7.0 → graphinate-0.8.1}/examples/code/requirements.txt +1 -0
  23. {graphinate-0.7.0 → graphinate-0.8.1}/examples/code/tokens.py +2 -5
  24. {graphinate-0.7.0 → graphinate-0.8.1}/examples/github/followers.py +4 -12
  25. {graphinate-0.7.0 → graphinate-0.8.1}/examples/github/repositories.py +2 -2
  26. graphinate-0.7.0/tests/graphinate/test_materializers.py → graphinate-0.8.1/examples/math/_test_materializers.py +10 -9
  27. {graphinate-0.7.0 → graphinate-0.8.1}/examples/math/graph_atlas.py +3 -2
  28. graphinate-0.7.0/src/graphinate/materializers/__init__.py → graphinate-0.8.1/examples/math/materializers.py +6 -9
  29. {graphinate-0.7.0 → graphinate-0.8.1}/examples/math/polygonal_graph.py +11 -24
  30. graphinate-0.8.1/examples/science/caffeine.py +44 -0
  31. {graphinate-0.7.0 → graphinate-0.8.1}/examples/social/music_artists.py +2 -5
  32. {graphinate-0.7.0 → graphinate-0.8.1}/examples/system/files.py +3 -5
  33. {graphinate-0.7.0 → graphinate-0.8.1}/examples/system/processes.py +11 -24
  34. {graphinate-0.7.0/examples/code → graphinate-0.8.1/examples/web}/html_dom.py +2 -6
  35. {graphinate-0.7.0 → graphinate-0.8.1}/examples/web/page_links.py +3 -8
  36. {graphinate-0.7.0 → graphinate-0.8.1}/mkdocs.yml +22 -13
  37. {graphinate-0.7.0 → graphinate-0.8.1}/pyproject.toml +5 -5
  38. {graphinate-0.7.0 → graphinate-0.8.1}/src/graphinate/__init__.py +6 -5
  39. {graphinate-0.7.0 → graphinate-0.8.1}/src/graphinate/builders.py +39 -8
  40. {graphinate-0.7.0 → graphinate-0.8.1}/src/graphinate/cli.py +10 -13
  41. {graphinate-0.7.0 → graphinate-0.8.1}/src/graphinate/color.py +5 -0
  42. {graphinate-0.7.0 → graphinate-0.8.1}/src/graphinate/constants.py +2 -0
  43. {graphinate-0.7.0 → graphinate-0.8.1}/src/graphinate/converters.py +19 -15
  44. {graphinate-0.7.0 → graphinate-0.8.1}/src/graphinate/modeling.py +4 -4
  45. graphinate-0.8.1/src/graphinate/renderers/__init__.py +5 -0
  46. graphinate-0.7.0/src/graphinate/server/__init__.py → graphinate-0.8.1/src/graphinate/renderers/graphql.py +15 -14
  47. {graphinate-0.7.0/src/graphinate/materializers → graphinate-0.8.1/src/graphinate/renderers}/matplotlib.py +5 -3
  48. graphinate-0.8.1/src/graphinate/server/web/viewer/__init__.py +0 -0
  49. graphinate-0.8.1/src/graphinate/server/web/voyager/__init__.py +0 -0
  50. {graphinate-0.7.0 → graphinate-0.8.1}/src/graphinate/typing.py +4 -4
  51. {graphinate-0.7.0 → graphinate-0.8.1}/tests/graphinate/test_builders.py +15 -1
  52. graphinate-0.7.0/.coveragerc +0 -3
  53. graphinate-0.7.0/STATS.md +0 -18
  54. graphinate-0.7.0/docs/dev.md +0 -35
  55. graphinate-0.7.0/docs/examples/social.md +0 -15
  56. graphinate-0.7.0/docs/examples/web.md +0 -18
  57. graphinate-0.7.0/docs/index.md +0 -69
  58. graphinate-0.7.0/docs/start.md +0 -47
  59. {graphinate-0.7.0 → graphinate-0.8.1}/.github/dependabot.yml +0 -0
  60. {graphinate-0.7.0 → graphinate-0.8.1}/.github/workflows/publish.yml +0 -0
  61. {graphinate-0.7.0 → graphinate-0.8.1}/.github/workflows/test-beta.yml +0 -0
  62. {graphinate-0.7.0 → graphinate-0.8.1}/.gitignore +0 -0
  63. {graphinate-0.7.0 → graphinate-0.8.1}/.sonarcloud.properties +0 -0
  64. {graphinate-0.7.0 → graphinate-0.8.1}/LICENSE +0 -0
  65. {graphinate-0.7.0 → graphinate-0.8.1}/docs/assets/badge/v0.json +0 -0
  66. {graphinate-0.7.0 → graphinate-0.8.1}/docs/assets/images/logo-128.png +0 -0
  67. {graphinate-0.7.0 → graphinate-0.8.1}/docs/assets/images/network_graph.png +0 -0
  68. {graphinate-0.7.0 → graphinate-0.8.1}/docs/assets/stylesheets/extra.css +0 -0
  69. {graphinate-0.7.0 → graphinate-0.8.1}/docs/examples/github.md +0 -0
  70. {graphinate-0.7.0 → graphinate-0.8.1}/docs/examples/math.md +0 -0
  71. {graphinate-0.7.0 → graphinate-0.8.1}/docs/examples/system.md +0 -0
  72. {graphinate-0.7.0 → graphinate-0.8.1}/examples/github/_client.py +0 -0
  73. {graphinate-0.7.0 → graphinate-0.8.1}/examples/github/commits_visibilty_graph.py +0 -0
  74. {graphinate-0.7.0 → graphinate-0.8.1}/examples/github/followers.graphql +0 -0
  75. {graphinate-0.7.0 → graphinate-0.8.1}/examples/github/graphql.config.yml +0 -0
  76. {graphinate-0.7.0 → graphinate-0.8.1}/examples/github/repositories.graphql +0 -0
  77. {graphinate-0.7.0 → graphinate-0.8.1}/examples/github/requirements.txt +0 -0
  78. {graphinate-0.7.0/src/graphinate/server/web/elements → graphinate-0.8.1/examples/math}/__init__.py +0 -0
  79. {graphinate-0.7.0 → graphinate-0.8.1}/examples/math/graphs.py +0 -0
  80. {graphinate-0.7.0 → graphinate-0.8.1}/examples/math/gui.py +0 -0
  81. {graphinate-0.7.0 → graphinate-0.8.1}/examples/math/requirements.txt +0 -0
  82. {graphinate-0.7.0 → graphinate-0.8.1}/examples/social/cache/13/dd/73ce25face7beb30b69b64feeb77.val +0 -0
  83. {graphinate-0.7.0 → graphinate-0.8.1}/examples/social/cache/21/9e/00846f323987ba16cfbe0127d8eb.val +0 -0
  84. {graphinate-0.7.0 → graphinate-0.8.1}/examples/social/cache/70/b6/2aefb0269adce7fedf877fa0d267.val +0 -0
  85. {graphinate-0.7.0 → graphinate-0.8.1}/examples/social/cache/87/f5/ec1739bc369e84c3fcb302bf532a.val +0 -0
  86. {graphinate-0.7.0 → graphinate-0.8.1}/examples/social/cache/ba/fe/3aca7b2c38abff60e7ce5eb486a8.val +0 -0
  87. {graphinate-0.7.0 → graphinate-0.8.1}/examples/social/cache/c7/9e/ce82b0288020b7152779df09bd73.val +0 -0
  88. {graphinate-0.7.0 → graphinate-0.8.1}/examples/social/cache/cache.db +0 -0
  89. {graphinate-0.7.0 → graphinate-0.8.1}/examples/social/cache/d2/53/3b88f2fc162561cfdbbe9abc352a.val +0 -0
  90. {graphinate-0.7.0 → graphinate-0.8.1}/examples/social/cache/e2/d5/5d079f200eabf9b625b0473f6fbe.val +0 -0
  91. {graphinate-0.7.0 → graphinate-0.8.1}/examples/social/gui.py +0 -0
  92. {graphinate-0.7.0 → graphinate-0.8.1}/examples/social/requirements.txt +0 -0
  93. {graphinate-0.7.0 → graphinate-0.8.1}/examples/system/.ignore +0 -0
  94. {graphinate-0.7.0 → graphinate-0.8.1}/examples/system/requirements.txt +0 -0
  95. {graphinate-0.7.0 → graphinate-0.8.1}/examples/web/requirements.txt +0 -0
  96. {graphinate-0.7.0 → graphinate-0.8.1}/playground/ethernet/traceroute.py +0 -0
  97. {graphinate-0.7.0 → graphinate-0.8.1}/playground/genric_graph.graphql +0 -0
  98. {graphinate-0.7.0 → graphinate-0.8.1}/playground/graphql.config.yml +0 -0
  99. {graphinate-0.7.0 → graphinate-0.8.1}/playground/house_of_graphs.py +0 -0
  100. {graphinate-0.7.0 → graphinate-0.8.1}/playground/social/albums.json +0 -0
  101. {graphinate-0.7.0 → graphinate-0.8.1}/playground/social/musicisians.py +0 -0
  102. {graphinate-0.7.0 → graphinate-0.8.1}/playground/text/nlp_graph.py +0 -0
  103. {graphinate-0.7.0 → graphinate-0.8.1}/playground/text/requirements.txt +0 -0
  104. {graphinate-0.7.0 → graphinate-0.8.1}/playground/time_series/requirements.txt +0 -0
  105. {graphinate-0.7.0 → graphinate-0.8.1}/playground/time_series/visibility_graph.py +0 -0
  106. {graphinate-0.7.0 → graphinate-0.8.1}/sonar-project.properties +0 -0
  107. {graphinate-0.7.0 → graphinate-0.8.1}/src/graphinate/__main__.py +0 -0
  108. {graphinate-0.7.0/src/graphinate/server/web/graphiql → graphinate-0.8.1/src/graphinate/server}/__init__.py +0 -0
  109. {graphinate-0.7.0 → graphinate-0.8.1}/src/graphinate/server/starlette/__init__.py +0 -0
  110. {graphinate-0.7.0 → graphinate-0.8.1}/src/graphinate/server/starlette/views.py +0 -0
  111. {graphinate-0.7.0 → graphinate-0.8.1}/src/graphinate/server/web/__init__.py +0 -0
  112. {graphinate-0.7.0/src/graphinate/server/web/rapidoc → graphinate-0.8.1/src/graphinate/server/web/elements}/__init__.py +0 -0
  113. {graphinate-0.7.0 → graphinate-0.8.1}/src/graphinate/server/web/elements/index.html +0 -0
  114. {graphinate-0.7.0/src/graphinate/server/web/viewer → graphinate-0.8.1/src/graphinate/server/web/graphiql}/__init__.py +0 -0
  115. {graphinate-0.7.0 → graphinate-0.8.1}/src/graphinate/server/web/graphiql/index.html +0 -0
  116. {graphinate-0.7.0/src/graphinate/server/web/voyager → graphinate-0.8.1/src/graphinate/server/web/rapidoc}/__init__.py +0 -0
  117. {graphinate-0.7.0 → graphinate-0.8.1}/src/graphinate/server/web/rapidoc/index.html +0 -0
  118. {graphinate-0.7.0 → graphinate-0.8.1}/src/graphinate/server/web/static/images/logo-128.png +0 -0
  119. {graphinate-0.7.0 → graphinate-0.8.1}/src/graphinate/server/web/static/images/logo.svg +0 -0
  120. {graphinate-0.7.0 → graphinate-0.8.1}/src/graphinate/server/web/static/images/network_graph.png +0 -0
  121. {graphinate-0.7.0 → graphinate-0.8.1}/src/graphinate/server/web/viewer/index.html +0 -0
  122. {graphinate-0.7.0 → graphinate-0.8.1}/src/graphinate/server/web/voyager/index.html +0 -0
  123. {graphinate-0.7.0 → graphinate-0.8.1}/src/graphinate/tools.py +0 -0
  124. {graphinate-0.7.0 → graphinate-0.8.1}/tests/conftest.py +0 -0
  125. {graphinate-0.7.0 → graphinate-0.8.1}/tests/graphinate/test_cli.py +0 -0
  126. {graphinate-0.7.0 → graphinate-0.8.1}/tests/graphinate/test_color.py +0 -0
  127. {graphinate-0.7.0 → graphinate-0.8.1}/tests/graphinate/test_converters.py +0 -0
  128. {graphinate-0.7.0 → graphinate-0.8.1}/tests/graphinate/test_modeling.py +0 -0
  129. {graphinate-0.7.0 → graphinate-0.8.1}/tests/graphinate/test_server.py +0 -0
@@ -0,0 +1,3 @@
1
+ [run]
2
+ branch = True
3
+ relative_files = True
@@ -13,10 +13,10 @@ name: "CodeQL"
13
13
 
14
14
  on:
15
15
  push:
16
- branches: [ "master" ]
16
+ branches: [ "main" ]
17
17
  pull_request:
18
18
  # The branches below must be a subset of the branches above
19
- branches: [ "master" ]
19
+ branches: [ "main" ]
20
20
  schedule:
21
21
  - cron: '44 6 * * 4'
22
22
 
@@ -50,7 +50,7 @@ jobs:
50
50
 
51
51
  # Initializes the CodeQL tools for scanning.
52
52
  - name: Initialize CodeQL
53
- uses: github/codeql-action/init@v2
53
+ uses: github/codeql-action/init@v3
54
54
  with:
55
55
  languages: ${{ matrix.language }}
56
56
  # If you wish to specify custom queries, you can do so here or in a config file.
@@ -64,7 +64,7 @@ jobs:
64
64
  # Autobuild attempts to build any compiled languages (C/C++, C#, Go, Java, or Swift).
65
65
  # If this step fails, then you should remove it and run the build manually (see below)
66
66
  - name: Autobuild
67
- uses: github/codeql-action/autobuild@v2
67
+ uses: github/codeql-action/autobuild@v3
68
68
 
69
69
  # ℹ️ Command-line programs to run using the OS shell.
70
70
  # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
@@ -77,6 +77,6 @@ jobs:
77
77
  # ./location_of_script_within_repo/buildscript.sh
78
78
 
79
79
  - name: Perform CodeQL Analysis
80
- uses: github/codeql-action/analyze@v2
80
+ uses: github/codeql-action/analyze@v3
81
81
  with:
82
82
  category: "/language:${{matrix.language}}"
@@ -25,5 +25,5 @@ jobs:
25
25
  pip install uv
26
26
  uv venv
27
27
  source .venv/bin/activate
28
- uv pip install mkdocs-material mkdocstrings-python mkdocs-git-revision-date-localized-plugin mkdocs-gen-files mkdocs-glightbox mkdocs-literate-nav mkdocs-section-index
28
+ uv pip install mkdocs-material mkdocstrings-python mkdocs-git-committers-plugin-2 "mkdocs-git-revision-date-localized-plugin<1.4.0" mkdocs-gen-files mkdocs-glightbox mkdocs-literate-nav mkdocs-section-index
29
29
  mkdocs gh-deploy --force
@@ -38,11 +38,16 @@ jobs:
38
38
  - name: Test with pytest
39
39
  run: |
40
40
  python -m pip install faker pytest pytest-asyncio pytest-cov pytest-randomly pytest-xdist starlette-prometheus uvicorn[standard]
41
- pytest tests --cov=src --cov-branch --cov-report=xml --junitxml=test_results.xml -n auto
41
+ pytest tests --cov=src --cov-branch --cov-report=xml --junitxml=junit.xml -o junit_family=legacy -n auto
42
42
  - name: Upload coverage reports to Codecov
43
43
  uses: codecov/codecov-action@v5
44
44
  with:
45
45
  token: ${{ secrets.CODECOV_TOKEN }}
46
+ - name: Upload test results to Codecov
47
+ if: ${{ !cancelled() }}
48
+ uses: codecov/test-results-action@v1
49
+ with:
50
+ token: ${{ secrets.CODECOV_TOKEN }}
46
51
  - name: Run codacy-coverage-reporter
47
52
  uses: codacy/codacy-coverage-reporter-action@v1.3.0
48
53
  with:
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: Graphinate
3
- Version: 0.7.0
4
- Summary: 𝔾raphinate. Data to Graphs.
3
+ Version: 0.8.1
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
@@ -33,6 +33,7 @@ Requires-Dist: loguru
33
33
  Requires-Dist: mappingtools
34
34
  Requires-Dist: matplotlib
35
35
  Requires-Dist: networkx
36
+ Requires-Dist: networkx-mermaid>=0.1.0
36
37
  Requires-Dist: strawberry-graphql[asgi,opentelemetry]
37
38
  Provides-Extra: plot
38
39
  Requires-Dist: scipy; extra == 'plot'
@@ -41,7 +42,7 @@ Requires-Dist: starlette-prometheus; extra == 'server'
41
42
  Requires-Dist: uvicorn[standard]; extra == 'server'
42
43
  Description-Content-Type: text/markdown
43
44
 
44
- # [𝔾raphinate. Data to Graphs.](https://erivlis.github.io/graphinate/)
45
+ # [Graphinate. Data to Graphs.](https://erivlis.github.io/graphinate/)
45
46
 
46
47
  <img height="360" src="https://github.com/erivlis/graphinate/assets/9897520/dae41f9f-69e5-4eb5-a488-87ce7f51fa32" alt="Graphinate. Data to Graphs.">
47
48
 
@@ -118,6 +119,38 @@ Description-Content-Type: text/markdown
118
119
  </tr>
119
120
  </table>
120
121
 
122
+ ## Table of Contents
123
+
124
+ - [Introduction](#introduction)
125
+ - [What is Graphinate?](#what-is-graphinate)
126
+ - [Links](#links)
127
+ - [Quick Start](#quick-start)
128
+ - [Install](#install)
129
+ - [Example](#example)
130
+ - [CLI](#cli)
131
+ - [Commands](#commands)
132
+ - [Save](#save)
133
+ - [Server](#server)
134
+ - [Gallery](#gallery)
135
+ - [Python AST](#python-ast)
136
+ - [GitHub Repository](#github-repository)
137
+ - [Python AST - 3D Force-Directed Animation](#python-ast---3d-force-directed-animation)
138
+ - [Web Page Links](#web-page-links)
139
+ - [Development](#development)
140
+ - [Ruff](#ruff)
141
+ - [Test](#test)
142
+ - [Standard (cobertura) XML Coverage Report](#standard-cobertura-xml-coverage-report)
143
+ - [HTML Coverage Report](#html-coverage-report)
144
+ - [Docs](#docs)
145
+ - [test](#test-1)
146
+ - [build](#build)
147
+ - [Acknowledgements](#acknowledgements)
148
+ - [Dependencies](#dependencies)
149
+ - [Python](#python)
150
+ - [Javascript and HTML](#javascript-and-html)
151
+ - [Dev Tools](#dev-tools)
152
+ - [IDE](#ide)
153
+
121
154
  ## Introduction
122
155
 
123
156
  ### What is Graphinate?
@@ -162,11 +195,11 @@ import graphinate
162
195
 
163
196
  N: int = 8
164
197
 
165
- # Define a GraphModel
198
+ # First Define a GraphModel instance.
199
+ # It will be used to hold the graph definitions
166
200
  graph_model: graphinate.GraphModel = graphinate.model(name="Octagonal Graph")
167
201
 
168
-
169
- # Register in the Graph Model the edges' supplier function
202
+ # Register in the Graph Model the edges' supplier generator function
170
203
  @graph_model.edge()
171
204
  def edge():
172
205
  for i in range(N):
@@ -174,24 +207,35 @@ def edge():
174
207
  yield {'source': N, 'target': 0}
175
208
 
176
209
 
177
- # Choose builder and handler
178
- builder, handler = graphinate.materializers.Materializers.NetworkX_with_edge_labels.value
210
+ # Use the NetworkX Builder
211
+ builder = graphinate.builders.NetworkxBuilder(graph_model)
179
212
 
180
- # Materialize the GraphModel
181
- graphinate.materialize(graph_model, builder=builder, builder_output_handler=handler)
182
- ```
213
+ # build the NetworkX GraphRepresentation
214
+ # the output in this case is a nx.Graph instance
215
+ graph = builder.build()
216
+
217
+ # this supplied plot method uses matplotlib to display the graph
218
+ graphinate.matplotlib.plot(graph, with_edge_labels=True)
219
+
220
+ # or use the Mermaid Builder
221
+ builder = graphinate.builders.MermaidBuilder(graph_model)
183
222
 
184
- #### `graphinate.model` function
223
+ # to create a Mermaid diagram
224
+ diagram: str = builder.build()
185
225
 
186
- > [!NOTE]
187
- > This function creates `GraphModel` class that is used to declaratively register _Edge_ and/or _Node_ data
188
- > supplier functions by using the `GraphModel.node()` and `GraphModel.edge()` decorators.
226
+ # and get Markdown or single page HTML to display it
227
+ mermaid_markdown: str = graphinate.mermaid.markdown(diagram)
228
+ mermaid_html: str = graphinate.mermaid.html(diagram, title=graph_model.name)
189
229
 
190
- #### `graphinate.materialize` function
230
+ # or use the GraphQL Builder
231
+ builder = graphinate.builders.GraphQLBuilder(graph_model)
191
232
 
192
- > [!NOTE]
193
- > This function can be used to easily generate an output from a `GraphModel` instance.
233
+ # to create a Strawberry GraphQL schema
234
+ schema = builder.build()
194
235
 
236
+ # and serve it using Uvicorn web server
237
+ graphinate.graphql.server(schema)
238
+ ```
195
239
  ## CLI
196
240
 
197
241
  ### Commands
@@ -238,44 +282,76 @@ Options:
238
282
 
239
283
  ## Gallery
240
284
 
241
- ### Python AST
242
-
243
- ![d3_graph_ast](https://github.com/erivlis/graphinate/assets/9897520/9e7e1ed2-3a5c-41fe-8c5f-999da4b741ff)
285
+ ### Python Class AST
244
286
 
245
- ### GitHub Repository
287
+ #### matplotlib
246
288
 
247
- ![repo_graph](https://github.com/erivlis/graphinate/assets/9897520/9c044bbe-1f21-41b8-b879-95b8362ad48d)
289
+ ![graph_ast](https://github.com/erivlis/graphinate/assets/9897520/9e7e1ed2-3a5c-41fe-8c5f-999da4b741ff)
248
290
 
249
- ### Python AST - 3D Force-Directed Animation
291
+ #### 3D Force-Directed Animation
250
292
 
251
293
  <video width="400" controls>
252
294
  <source src="https://github.com/erivlis/graphinate/assets/9897520/2e9a53b1-5686-4683-a0e4-fbffa850a27b" type="video/mp4">
253
295
  </video>
254
296
 
255
- ### Web Page Links
297
+ ### GitHub Repository
298
+
299
+ ![repo_graph](https://github.com/erivlis/graphinate/assets/9897520/9c044bbe-1f21-41b8-b879-95b8362ad48d)
300
+
301
+
302
+ ### Web Links
256
303
 
257
304
  ![Web Page Links](https://github.com/erivlis/graphinate/assets/9897520/ea5b00a2-75d1-4d0e-86af-272f20973149)
258
305
 
259
306
  ## Development
260
307
 
308
+ ### Install dependencies
309
+
310
+ Use UV to install all dependencies
311
+
312
+ ```shell
313
+ uv sync --all-extras --all-groups
314
+ ```
315
+
316
+ ### Update dependencies
317
+
318
+ ```shell
319
+ uv lock --upgrade
320
+ uv sync --all-extras --all-groups
321
+ ```
322
+
261
323
  ### Ruff
262
324
 
325
+ #### Report issues
326
+
263
327
  ```shell
264
328
  ruff check src
265
329
  ```
266
330
 
331
+ #### Fix issues
332
+
333
+ ```shell
334
+ ruff check src --fix
335
+ ```
336
+
267
337
  ### Test
268
338
 
269
339
  #### Standard (cobertura) XML Coverage Report
270
340
 
271
341
  ```shell
272
- python -m pytest tests -n auto --cov=src --cov-branch --doctest-modules --cov-report=xml --junitxml=test_results.xml
342
+ python -m pytest tests -n auto --cov=src --cov-branch --doctest-modules --cov-report=xml --junitxml=junit.xml
273
343
  ```
274
344
 
275
345
  #### HTML Coverage Report
276
346
 
277
347
  ```shell
278
- python -m pytest tests -n auto --cov=src --cov-branch --doctest-modules --cov-report=html --junitxml=test_results.xml
348
+ python -m pytest tests -n auto --cov=src --cov-branch --doctest-modules --cov-report=html --junitxml=junit.xml
349
+ ```
350
+
351
+ #### Terminal Coverage Report
352
+
353
+ ```shell
354
+ python -m pytest tests -n auto --cov=src --cov-branch --doctest-modules --cov-report=term --junitxml=junit.xml
279
355
  ```
280
356
 
281
357
  ### Docs
@@ -320,10 +396,14 @@ python -m mkdocs build
320
396
 
321
397
  ### IDE
322
398
 
323
- <a href="https://www.jetbrains.com/pycharm/"><img height="60" style="background: linear-gradient(-45deg, #FCF84A, #3DEA62, #21D789);" src="https://resources.jetbrains.com/storage/products/company/brand/logos/PyCharm.png" alt="PyCharm logo"></a>
399
+ <a href="https://www.jetbrains.com/pycharm/"><img height="60" style="padding: 5px; background: linear-gradient(-45deg, #FCF84A, #3DEA62, #21D789);" src="https://resources.jetbrains.com/storage/products/company/brand/logos/PyCharm.png" alt="PyCharm logo"></a>
400
+
401
+ --------------------------------
402
+
403
+ ![Alt](https://repobeats.axiom.co/api/embed/683f50f1d2de0e13e468c34a692612c2de4d56bd.svg "Repobeats analytics image")
324
404
 
325
- ---------------------
405
+ --------------------------------
326
406
 
327
- <img alt="Star Chart" src="https://forthebadge.com/images/badges/works-on-my-machine.svg">
407
+ <img alt="Work on my Machine" src="https://forthebadge.com/images/badges/works-on-my-machine.svg">
328
408
 
329
- Copyright © 2023 Eran Rivlis
409
+ Copyright © 2023-2025 Eran Rivlis
@@ -1,4 +1,4 @@
1
- # [𝔾raphinate. Data to Graphs.](https://erivlis.github.io/graphinate/)
1
+ # [Graphinate. Data to Graphs.](https://erivlis.github.io/graphinate/)
2
2
 
3
3
  <img height="360" src="https://github.com/erivlis/graphinate/assets/9897520/dae41f9f-69e5-4eb5-a488-87ce7f51fa32" alt="Graphinate. Data to Graphs.">
4
4
 
@@ -75,6 +75,38 @@
75
75
  </tr>
76
76
  </table>
77
77
 
78
+ ## Table of Contents
79
+
80
+ - [Introduction](#introduction)
81
+ - [What is Graphinate?](#what-is-graphinate)
82
+ - [Links](#links)
83
+ - [Quick Start](#quick-start)
84
+ - [Install](#install)
85
+ - [Example](#example)
86
+ - [CLI](#cli)
87
+ - [Commands](#commands)
88
+ - [Save](#save)
89
+ - [Server](#server)
90
+ - [Gallery](#gallery)
91
+ - [Python AST](#python-ast)
92
+ - [GitHub Repository](#github-repository)
93
+ - [Python AST - 3D Force-Directed Animation](#python-ast---3d-force-directed-animation)
94
+ - [Web Page Links](#web-page-links)
95
+ - [Development](#development)
96
+ - [Ruff](#ruff)
97
+ - [Test](#test)
98
+ - [Standard (cobertura) XML Coverage Report](#standard-cobertura-xml-coverage-report)
99
+ - [HTML Coverage Report](#html-coverage-report)
100
+ - [Docs](#docs)
101
+ - [test](#test-1)
102
+ - [build](#build)
103
+ - [Acknowledgements](#acknowledgements)
104
+ - [Dependencies](#dependencies)
105
+ - [Python](#python)
106
+ - [Javascript and HTML](#javascript-and-html)
107
+ - [Dev Tools](#dev-tools)
108
+ - [IDE](#ide)
109
+
78
110
  ## Introduction
79
111
 
80
112
  ### What is Graphinate?
@@ -119,11 +151,11 @@ import graphinate
119
151
 
120
152
  N: int = 8
121
153
 
122
- # Define a GraphModel
154
+ # First Define a GraphModel instance.
155
+ # It will be used to hold the graph definitions
123
156
  graph_model: graphinate.GraphModel = graphinate.model(name="Octagonal Graph")
124
157
 
125
-
126
- # Register in the Graph Model the edges' supplier function
158
+ # Register in the Graph Model the edges' supplier generator function
127
159
  @graph_model.edge()
128
160
  def edge():
129
161
  for i in range(N):
@@ -131,24 +163,35 @@ def edge():
131
163
  yield {'source': N, 'target': 0}
132
164
 
133
165
 
134
- # Choose builder and handler
135
- builder, handler = graphinate.materializers.Materializers.NetworkX_with_edge_labels.value
166
+ # Use the NetworkX Builder
167
+ builder = graphinate.builders.NetworkxBuilder(graph_model)
136
168
 
137
- # Materialize the GraphModel
138
- graphinate.materialize(graph_model, builder=builder, builder_output_handler=handler)
139
- ```
169
+ # build the NetworkX GraphRepresentation
170
+ # the output in this case is a nx.Graph instance
171
+ graph = builder.build()
172
+
173
+ # this supplied plot method uses matplotlib to display the graph
174
+ graphinate.matplotlib.plot(graph, with_edge_labels=True)
175
+
176
+ # or use the Mermaid Builder
177
+ builder = graphinate.builders.MermaidBuilder(graph_model)
140
178
 
141
- #### `graphinate.model` function
179
+ # to create a Mermaid diagram
180
+ diagram: str = builder.build()
142
181
 
143
- > [!NOTE]
144
- > This function creates `GraphModel` class that is used to declaratively register _Edge_ and/or _Node_ data
145
- > supplier functions by using the `GraphModel.node()` and `GraphModel.edge()` decorators.
182
+ # and get Markdown or single page HTML to display it
183
+ mermaid_markdown: str = graphinate.mermaid.markdown(diagram)
184
+ mermaid_html: str = graphinate.mermaid.html(diagram, title=graph_model.name)
146
185
 
147
- #### `graphinate.materialize` function
186
+ # or use the GraphQL Builder
187
+ builder = graphinate.builders.GraphQLBuilder(graph_model)
148
188
 
149
- > [!NOTE]
150
- > This function can be used to easily generate an output from a `GraphModel` instance.
189
+ # to create a Strawberry GraphQL schema
190
+ schema = builder.build()
151
191
 
192
+ # and serve it using Uvicorn web server
193
+ graphinate.graphql.server(schema)
194
+ ```
152
195
  ## CLI
153
196
 
154
197
  ### Commands
@@ -195,44 +238,76 @@ Options:
195
238
 
196
239
  ## Gallery
197
240
 
198
- ### Python AST
199
-
200
- ![d3_graph_ast](https://github.com/erivlis/graphinate/assets/9897520/9e7e1ed2-3a5c-41fe-8c5f-999da4b741ff)
241
+ ### Python Class AST
201
242
 
202
- ### GitHub Repository
243
+ #### matplotlib
203
244
 
204
- ![repo_graph](https://github.com/erivlis/graphinate/assets/9897520/9c044bbe-1f21-41b8-b879-95b8362ad48d)
245
+ ![graph_ast](https://github.com/erivlis/graphinate/assets/9897520/9e7e1ed2-3a5c-41fe-8c5f-999da4b741ff)
205
246
 
206
- ### Python AST - 3D Force-Directed Animation
247
+ #### 3D Force-Directed Animation
207
248
 
208
249
  <video width="400" controls>
209
250
  <source src="https://github.com/erivlis/graphinate/assets/9897520/2e9a53b1-5686-4683-a0e4-fbffa850a27b" type="video/mp4">
210
251
  </video>
211
252
 
212
- ### Web Page Links
253
+ ### GitHub Repository
254
+
255
+ ![repo_graph](https://github.com/erivlis/graphinate/assets/9897520/9c044bbe-1f21-41b8-b879-95b8362ad48d)
256
+
257
+
258
+ ### Web Links
213
259
 
214
260
  ![Web Page Links](https://github.com/erivlis/graphinate/assets/9897520/ea5b00a2-75d1-4d0e-86af-272f20973149)
215
261
 
216
262
  ## Development
217
263
 
264
+ ### Install dependencies
265
+
266
+ Use UV to install all dependencies
267
+
268
+ ```shell
269
+ uv sync --all-extras --all-groups
270
+ ```
271
+
272
+ ### Update dependencies
273
+
274
+ ```shell
275
+ uv lock --upgrade
276
+ uv sync --all-extras --all-groups
277
+ ```
278
+
218
279
  ### Ruff
219
280
 
281
+ #### Report issues
282
+
220
283
  ```shell
221
284
  ruff check src
222
285
  ```
223
286
 
287
+ #### Fix issues
288
+
289
+ ```shell
290
+ ruff check src --fix
291
+ ```
292
+
224
293
  ### Test
225
294
 
226
295
  #### Standard (cobertura) XML Coverage Report
227
296
 
228
297
  ```shell
229
- python -m pytest tests -n auto --cov=src --cov-branch --doctest-modules --cov-report=xml --junitxml=test_results.xml
298
+ python -m pytest tests -n auto --cov=src --cov-branch --doctest-modules --cov-report=xml --junitxml=junit.xml
230
299
  ```
231
300
 
232
301
  #### HTML Coverage Report
233
302
 
234
303
  ```shell
235
- python -m pytest tests -n auto --cov=src --cov-branch --doctest-modules --cov-report=html --junitxml=test_results.xml
304
+ python -m pytest tests -n auto --cov=src --cov-branch --doctest-modules --cov-report=html --junitxml=junit.xml
305
+ ```
306
+
307
+ #### Terminal Coverage Report
308
+
309
+ ```shell
310
+ python -m pytest tests -n auto --cov=src --cov-branch --doctest-modules --cov-report=term --junitxml=junit.xml
236
311
  ```
237
312
 
238
313
  ### Docs
@@ -277,10 +352,14 @@ python -m mkdocs build
277
352
 
278
353
  ### IDE
279
354
 
280
- <a href="https://www.jetbrains.com/pycharm/"><img height="60" style="background: linear-gradient(-45deg, #FCF84A, #3DEA62, #21D789);" src="https://resources.jetbrains.com/storage/products/company/brand/logos/PyCharm.png" alt="PyCharm logo"></a>
355
+ <a href="https://www.jetbrains.com/pycharm/"><img height="60" style="padding: 5px; background: linear-gradient(-45deg, #FCF84A, #3DEA62, #21D789);" src="https://resources.jetbrains.com/storage/products/company/brand/logos/PyCharm.png" alt="PyCharm logo"></a>
356
+
357
+ --------------------------------
358
+
359
+ ![Alt](https://repobeats.axiom.co/api/embed/683f50f1d2de0e13e468c34a692612c2de4d56bd.svg "Repobeats analytics image")
281
360
 
282
- ---------------------
361
+ --------------------------------
283
362
 
284
- <img alt="Star Chart" src="https://forthebadge.com/images/badges/works-on-my-machine.svg">
363
+ <img alt="Work on my Machine" src="https://forthebadge.com/images/badges/works-on-my-machine.svg">
285
364
 
286
- Copyright © 2023 Eran Rivlis
365
+ Copyright © 2023-2025 Eran Rivlis
@@ -0,0 +1,86 @@
1
+ {
2
+ "acknowledge.md": {
3
+ "created": "2023-08-20T00:21:55.621436",
4
+ "modified": "2025-03-12T00:39:57.859235"
5
+ },
6
+ "index.md": {
7
+ "created": "2023-08-15T00:05:21.586874",
8
+ "modified": "2025-03-12T00:40:46.459147"
9
+ },
10
+ "intro.md": {
11
+ "created": "2023-08-19T23:54:18.668094",
12
+ "modified": "2025-03-11T23:24:02.836144"
13
+ },
14
+ "start.md": {
15
+ "created": "2023-08-20T00:07:42.683716",
16
+ "modified": "2025-03-11T23:45:05.567864"
17
+ },
18
+ "tutorial.md": {
19
+ "created": "2025-02-26T00:03:30.194156",
20
+ "modified": "2025-03-12T00:12:38.290310"
21
+ },
22
+ "examples\\code.md": {
23
+ "created": "2023-08-20T00:09:32.677003",
24
+ "modified": "2025-03-07T10:14:05.629365"
25
+ },
26
+ "examples\\github.md": {
27
+ "created": "2023-10-05T11:43:15.316025",
28
+ "modified": "2025-01-28T23:47:41.840220"
29
+ },
30
+ "examples\\math.md": {
31
+ "created": "2023-10-05T11:43:22.861997",
32
+ "modified": "2025-01-28T23:54:42.968373"
33
+ },
34
+ "examples\\social.md": {
35
+ "created": "2025-02-24T23:49:35.972953",
36
+ "modified": "2025-03-11T23:47:36.266891"
37
+ },
38
+ "examples\\system.md": {
39
+ "created": "2024-03-27T01:28:38.922865",
40
+ "modified": "2024-03-27T01:51:20.126046"
41
+ },
42
+ "examples\\web.md": {
43
+ "created": "2023-10-05T11:43:30.550657",
44
+ "modified": "2025-03-12T00:42:43.742512"
45
+ },
46
+ "reference\\SUMMARY.md": {
47
+ "created": "2025-03-08T20:51:52.801367",
48
+ "modified": "2025-03-08T20:51:52.807370"
49
+ },
50
+ "usage\\cli.md": {
51
+ "created": "2023-09-27T21:23:44.140564",
52
+ "modified": "2025-03-01T23:56:33.595498"
53
+ },
54
+ "usage\\lib.md": {
55
+ "created": "2023-09-27T21:23:44.133584",
56
+ "modified": "2025-03-12T00:30:12.961397"
57
+ },
58
+ "reference\\graphinate\\builders.md": {
59
+ "created": "2025-03-08T20:51:52.788270",
60
+ "modified": "2025-03-08T20:51:52.792269"
61
+ },
62
+ "reference\\graphinate\\index.md": {
63
+ "created": "2025-03-08T20:51:52.786270",
64
+ "modified": "2025-03-08T20:51:52.788270"
65
+ },
66
+ "reference\\graphinate\\modeling.md": {
67
+ "created": "2025-03-08T20:51:52.792269",
68
+ "modified": "2025-03-08T20:51:52.795269"
69
+ },
70
+ "reference\\graphinate\\typing.md": {
71
+ "created": "2025-03-08T20:51:52.800360",
72
+ "modified": "2025-03-08T20:51:52.805368"
73
+ },
74
+ "reference\\graphinate\\renderers\\graphql.md": {
75
+ "created": "2025-03-08T20:51:52.796358",
76
+ "modified": "2025-03-08T20:51:52.800360"
77
+ },
78
+ "reference\\graphinate\\renderers\\index.md": {
79
+ "created": "2025-03-08T20:51:52.794269",
80
+ "modified": "2025-03-08T20:51:52.798361"
81
+ },
82
+ "reference\\graphinate\\renderers\\matplotlib.md": {
83
+ "created": "2025-03-08T20:51:52.798361",
84
+ "modified": "2025-03-08T20:51:52.803367"
85
+ }
86
+ }
@@ -14,15 +14,18 @@
14
14
 
15
15
  <a href="https://vasturiano.github.io/3d-force-graph/"><img style="height: 50px; padding: 5px; background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="http://gist.github.com/vasturiano/02affe306ce445e423f992faeea13521/raw/preview.png" alt="3D Force-Directed Graph Logo."></a>
16
16
  <a href="https://github.com/graphql-kit/graphql-voyager"><img style="height: 50px; padding: 5px; background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://github.com/graphql-kit/graphql-voyager/raw/main/docs/cover.png" alt="Graphql Voyager Logo."></a>
17
+ <a href="https://github.com/cocopon/tweakpane"><img style="height: 50px; background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://user-images.githubusercontent.com/602961/184479032-38f50be3-e235-4914-85c0-dce316b33ed2.png" alt="Tweakpane Logo"></a>
17
18
 
18
19
  ## Dev Tools
19
20
 
20
- <a href="https://hatch.pypa.io/"><img style="height: 50px; background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://hatch.pypa.io/latest/assets/images/logo.svg" alt="Hatch logo."></a>
21
- <a href="https://squidfunk.github.io/mkdocs-material/"><img style="height: 50px; background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://raw.githubusercontent.com/squidfunk/mkdocs-material/master/.github/assets/logo.svg" alt="Material for MkDocs"></a>
22
- <a href="https://pytest.org"><img style="height: 50px; background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://docs.pytest.org/en/7.4.x/_static/pytest_logo_curves.svg" alt="pytest logo."></a>
23
- <a href="https://astral.sh/ruff"><img style="height: 50px; background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://astralcms.wpengine.com/wp-content/uploads/2023/03/Ruff-Logo.svg" alt="Ruff logo."></a>
24
21
  <a href="https://astral.sh/uv"><img style="height: 50px; background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://avatars.githubusercontent.com/u/115962839" alt="uv logo."></a>
22
+ <a href="https://astral.sh/ruff"><img style="height: 50px; background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://astralcms.wpengine.com/wp-content/uploads/2023/03/Ruff-Logo.svg" alt="Ruff logo."></a>
23
+ <a href="https://squidfunk.github.io/mkdocs-material/"><img style="height: 50px; background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://raw.githubusercontent.com/squidfunk/mkdocs-material/master/.github/assets/logo.svg" alt="Material for MkDocs"></a>
24
+ <a href="https://pytest.org"><img style="height: 50px; background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://docs.pytest.org/en/7.4.x/_static/pytest_logo_curves.svg" alt="pytest logo."></a>
25
+ <a href="https://hatch.pypa.io/"><img style="height: 50px; background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://hatch.pypa.io/latest/assets/images/logo.svg" alt="Hatch logo."></a>
26
+
27
+
25
28
 
26
29
  ## IDE
27
30
 
28
- <a href="https://www.jetbrains.com/pycharm/"><img style="height: 50px; background: linear-gradient(-45deg, #FCF84A, #3DEA62, #21D789);" src="https://resources.jetbrains.com/storage/products/company/brand/logos/PyCharm.png" alt="PyCharm logo."></a>
31
+ <a href="https://www.jetbrains.com/pycharm/"><img style="height: 50px; padding: 5px; background: linear-gradient(-45deg, #FCF84A, #3DEA62, #21D789);" src="https://resources.jetbrains.com/storage/products/company/brand/logos/PyCharm.png" alt="PyCharm logo."></a>
@@ -1,10 +1,20 @@
1
1
  # Code
2
2
 
3
+ ## GIT Commits
4
+
5
+ === "GIT Commits"
6
+
7
+ ``` python title="examples/code/git_commits.py" linenums="1"
8
+ --8<-- "examples/code/git_commits.py"
9
+ ```
10
+
11
+ ---
12
+
3
13
  ## Python AST
4
14
 
5
15
  === "Python AST"
6
16
 
7
- ``` python title="examples/code/python_ast.py" linenums="1"
17
+ ```python title="examples/code/python_ast.py" linenums="1"
8
18
  --8<-- "examples/code/python_ast.py"
9
19
  ```
10
20
 
@@ -24,12 +34,7 @@
24
34
 
25
35
  === "Python Dependencies"
26
36
 
27
- ``` python title="examples/code/python_dependencies.py" linenums="1"
37
+ ```python title="examples/code/python_dependencies.py" linenums="1"
28
38
  --8<-- "examples/code/python_dependencies.py"
29
39
  ```
30
40
 
31
- === "Requirements"
32
-
33
- ``` text title="examples/code/requirements.txt" linenums="1"
34
- --8<-- "examples/code/requirements.txt"
35
- ```