Graphinate 0.8.4__tar.gz → 0.8.6__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.6/.coveragerc +9 -0
  2. graphinate-0.8.6/.deepsource.toml +28 -0
  3. {graphinate-0.8.4 → graphinate-0.8.6}/.github/workflows/codeql.yml +1 -1
  4. {graphinate-0.8.4 → graphinate-0.8.6}/.github/workflows/publish-docs.yaml +1 -1
  5. {graphinate-0.8.4 → graphinate-0.8.6}/.github/workflows/publish.yml +1 -1
  6. {graphinate-0.8.4 → graphinate-0.8.6}/.github/workflows/test-beta.yml +3 -3
  7. {graphinate-0.8.4 → graphinate-0.8.6}/.github/workflows/test.yml +2 -2
  8. {graphinate-0.8.4 → graphinate-0.8.6}/PKG-INFO +26 -14
  9. {graphinate-0.8.4 → graphinate-0.8.6}/README.md +23 -12
  10. {graphinate-0.8.4 → graphinate-0.8.6}/docs/.dates_cache.json +4 -4
  11. graphinate-0.8.4/docs/acknowledge.md → graphinate-0.8.6/docs/acknowledgements.md +7 -7
  12. {graphinate-0.8.4 → graphinate-0.8.6}/examples/code/python_ast.py +3 -1
  13. {graphinate-0.8.4 → graphinate-0.8.6}/examples/github/_client.py +10 -10
  14. {graphinate-0.8.4 → graphinate-0.8.6}/examples/github/followers.py +2 -3
  15. {graphinate-0.8.4 → graphinate-0.8.6}/examples/github/repositories.py +18 -19
  16. {graphinate-0.8.4 → graphinate-0.8.6}/examples/math/materializers.py +3 -4
  17. {graphinate-0.8.4 → graphinate-0.8.6}/mkdocs.yml +27 -5
  18. {graphinate-0.8.4 → graphinate-0.8.6}/pyproject.toml +20 -5
  19. {graphinate-0.8.4 → graphinate-0.8.6}/src/graphinate/builders.py +90 -29
  20. {graphinate-0.8.4 → graphinate-0.8.6}/src/graphinate/color.py +34 -7
  21. {graphinate-0.8.4 → graphinate-0.8.6}/src/graphinate/modeling.py +23 -23
  22. {graphinate-0.8.4 → graphinate-0.8.6}/src/graphinate/renderers/graphql.py +9 -3
  23. {graphinate-0.8.4 → graphinate-0.8.6}/src/graphinate/renderers/matplotlib.py +1 -1
  24. {graphinate-0.8.4 → graphinate-0.8.6}/src/graphinate/server/starlette/__init__.py +1 -3
  25. {graphinate-0.8.4 → graphinate-0.8.6}/src/graphinate/server/web/rapidoc/index.html +3 -2
  26. {graphinate-0.8.4 → graphinate-0.8.6}/src/graphinate/server/web/viewer/index.html +91 -40
  27. {graphinate-0.8.4 → graphinate-0.8.6}/src/graphinate/server/web/voyager/index.html +2 -2
  28. {graphinate-0.8.4 → graphinate-0.8.6}/src/graphinate/typing.py +20 -11
  29. graphinate-0.8.6/tests/graphinate/renderers/test_graphql.py +225 -0
  30. graphinate-0.8.6/tests/graphinate/renderers/test_matplotlib_draw.py +251 -0
  31. graphinate-0.8.6/tests/graphinate/renderers/test_matplotlib_plot.py +265 -0
  32. graphinate-0.8.6/tests/graphinate/server/test_starlette.py +78 -0
  33. {graphinate-0.8.4 → graphinate-0.8.6}/tests/graphinate/test_builders.py +210 -0
  34. graphinate-0.8.6/tests/graphinate/test_modeling.py +197 -0
  35. graphinate-0.8.4/.coveragerc +0 -3
  36. graphinate-0.8.4/tests/graphinate/test_modeling.py +0 -39
  37. {graphinate-0.8.4 → graphinate-0.8.6}/.github/dependabot.yml +0 -0
  38. {graphinate-0.8.4 → graphinate-0.8.6}/.gitignore +0 -0
  39. {graphinate-0.8.4 → graphinate-0.8.6}/.sonarcloud.properties +0 -0
  40. {graphinate-0.8.4 → graphinate-0.8.6}/LICENSE +0 -0
  41. {graphinate-0.8.4 → graphinate-0.8.6}/docs/assets/badge/v0.json +0 -0
  42. {graphinate-0.8.4 → graphinate-0.8.6}/docs/assets/images/logo-128.png +0 -0
  43. {graphinate-0.8.4 → graphinate-0.8.6}/docs/assets/images/network_graph.png +0 -0
  44. {graphinate-0.8.4 → graphinate-0.8.6}/docs/assets/stylesheets/extra.css +0 -0
  45. {graphinate-0.8.4 → graphinate-0.8.6}/docs/examples/code.md +0 -0
  46. {graphinate-0.8.4 → graphinate-0.8.6}/docs/examples/github.md +0 -0
  47. {graphinate-0.8.4 → graphinate-0.8.6}/docs/examples/math.md +0 -0
  48. {graphinate-0.8.4 → graphinate-0.8.6}/docs/examples/social.md +0 -0
  49. {graphinate-0.8.4 → graphinate-0.8.6}/docs/examples/system.md +0 -0
  50. {graphinate-0.8.4 → graphinate-0.8.6}/docs/examples/web.md +0 -0
  51. {graphinate-0.8.4 → graphinate-0.8.6}/docs/gen_ref_pages.py +0 -0
  52. {graphinate-0.8.4 → graphinate-0.8.6}/docs/index.md +0 -0
  53. /graphinate-0.8.4/docs/intro.md → /graphinate-0.8.6/docs/introduction.md +0 -0
  54. {graphinate-0.8.4 → graphinate-0.8.6}/docs/start.md +0 -0
  55. {graphinate-0.8.4 → graphinate-0.8.6}/docs/tutorial.md +0 -0
  56. {graphinate-0.8.4 → graphinate-0.8.6}/docs/usage/cli.md +0 -0
  57. {graphinate-0.8.4 → graphinate-0.8.6}/docs/usage/lib.md +0 -0
  58. {graphinate-0.8.4 → graphinate-0.8.6}/examples/code/git_commits.py +0 -0
  59. {graphinate-0.8.4 → graphinate-0.8.6}/examples/code/python_dependencies.py +0 -0
  60. {graphinate-0.8.4 → graphinate-0.8.6}/examples/code/requirements.txt +0 -0
  61. {graphinate-0.8.4 → graphinate-0.8.6}/examples/code/tokens.py +0 -0
  62. {graphinate-0.8.4 → graphinate-0.8.6}/examples/github/commits_visibilty_graph.py +0 -0
  63. {graphinate-0.8.4 → graphinate-0.8.6}/examples/github/followers.graphql +0 -0
  64. {graphinate-0.8.4 → graphinate-0.8.6}/examples/github/graphql.config.yml +0 -0
  65. {graphinate-0.8.4 → graphinate-0.8.6}/examples/github/repositories.graphql +0 -0
  66. {graphinate-0.8.4 → graphinate-0.8.6}/examples/github/requirements.txt +0 -0
  67. {graphinate-0.8.4 → graphinate-0.8.6}/examples/math/__init__.py +0 -0
  68. {graphinate-0.8.4 → graphinate-0.8.6}/examples/math/_test_materializers.py +0 -0
  69. {graphinate-0.8.4 → graphinate-0.8.6}/examples/math/graph_atlas.py +0 -0
  70. {graphinate-0.8.4 → graphinate-0.8.6}/examples/math/graphs.py +0 -0
  71. {graphinate-0.8.4 → graphinate-0.8.6}/examples/math/gui.py +0 -0
  72. {graphinate-0.8.4 → graphinate-0.8.6}/examples/math/polygonal_graph.py +0 -0
  73. {graphinate-0.8.4 → graphinate-0.8.6}/examples/math/requirements.txt +0 -0
  74. {graphinate-0.8.4 → graphinate-0.8.6}/examples/social/cache/13/dd/73ce25face7beb30b69b64feeb77.val +0 -0
  75. {graphinate-0.8.4 → graphinate-0.8.6}/examples/social/cache/21/9e/00846f323987ba16cfbe0127d8eb.val +0 -0
  76. {graphinate-0.8.4 → graphinate-0.8.6}/examples/social/cache/70/b6/2aefb0269adce7fedf877fa0d267.val +0 -0
  77. {graphinate-0.8.4 → graphinate-0.8.6}/examples/social/cache/87/f5/ec1739bc369e84c3fcb302bf532a.val +0 -0
  78. {graphinate-0.8.4 → graphinate-0.8.6}/examples/social/cache/ba/fe/3aca7b2c38abff60e7ce5eb486a8.val +0 -0
  79. {graphinate-0.8.4 → graphinate-0.8.6}/examples/social/cache/c7/9e/ce82b0288020b7152779df09bd73.val +0 -0
  80. {graphinate-0.8.4 → graphinate-0.8.6}/examples/social/cache/cache.db +0 -0
  81. {graphinate-0.8.4 → graphinate-0.8.6}/examples/social/cache/d2/53/3b88f2fc162561cfdbbe9abc352a.val +0 -0
  82. {graphinate-0.8.4 → graphinate-0.8.6}/examples/social/cache/e2/d5/5d079f200eabf9b625b0473f6fbe.val +0 -0
  83. {graphinate-0.8.4 → graphinate-0.8.6}/examples/social/gui.py +0 -0
  84. {graphinate-0.8.4 → graphinate-0.8.6}/examples/social/music_artists.py +0 -0
  85. {graphinate-0.8.4 → graphinate-0.8.6}/examples/social/requirements.txt +0 -0
  86. {graphinate-0.8.4 → graphinate-0.8.6}/examples/system/.ignore +0 -0
  87. {graphinate-0.8.4 → graphinate-0.8.6}/examples/system/files.py +0 -0
  88. {graphinate-0.8.4 → graphinate-0.8.6}/examples/system/processes.py +0 -0
  89. {graphinate-0.8.4 → graphinate-0.8.6}/examples/system/requirements.txt +0 -0
  90. {graphinate-0.8.4 → graphinate-0.8.6}/examples/web/html_dom.py +0 -0
  91. {graphinate-0.8.4 → graphinate-0.8.6}/examples/web/page_links.py +0 -0
  92. {graphinate-0.8.4 → graphinate-0.8.6}/examples/web/requirements.txt +0 -0
  93. {graphinate-0.8.4 → graphinate-0.8.6}/playground/ethernet/traceroute.py +0 -0
  94. {graphinate-0.8.4 → graphinate-0.8.6}/playground/genric_graph.graphql +0 -0
  95. {graphinate-0.8.4 → graphinate-0.8.6}/playground/graphql.config.yml +0 -0
  96. {graphinate-0.8.4 → graphinate-0.8.6}/playground/house_of_graphs.py +0 -0
  97. {graphinate-0.8.4 → graphinate-0.8.6}/playground/science/caffeine.py +0 -0
  98. {graphinate-0.8.4 → graphinate-0.8.6}/playground/social/albums.json +0 -0
  99. {graphinate-0.8.4 → graphinate-0.8.6}/playground/social/musicisians.py +0 -0
  100. {graphinate-0.8.4 → graphinate-0.8.6}/playground/text/nlp_graph.py +0 -0
  101. {graphinate-0.8.4 → graphinate-0.8.6}/playground/text/requirements.txt +0 -0
  102. {graphinate-0.8.4 → graphinate-0.8.6}/playground/time_series/requirements.txt +0 -0
  103. {graphinate-0.8.4 → graphinate-0.8.6}/playground/time_series/visibility_graph.py +0 -0
  104. {graphinate-0.8.4 → graphinate-0.8.6}/sonar-project.properties +0 -0
  105. {graphinate-0.8.4 → graphinate-0.8.6}/src/graphinate/__init__.py +0 -0
  106. {graphinate-0.8.4 → graphinate-0.8.6}/src/graphinate/__main__.py +0 -0
  107. {graphinate-0.8.4 → graphinate-0.8.6}/src/graphinate/cli.py +0 -0
  108. {graphinate-0.8.4 → graphinate-0.8.6}/src/graphinate/constants.py +0 -0
  109. {graphinate-0.8.4 → graphinate-0.8.6}/src/graphinate/converters.py +0 -0
  110. {graphinate-0.8.4 → graphinate-0.8.6}/src/graphinate/renderers/__init__.py +0 -0
  111. {graphinate-0.8.4 → graphinate-0.8.6}/src/graphinate/server/__init__.py +0 -0
  112. {graphinate-0.8.4 → graphinate-0.8.6}/src/graphinate/server/starlette/views.py +0 -0
  113. {graphinate-0.8.4 → graphinate-0.8.6}/src/graphinate/server/web/__init__.py +0 -0
  114. {graphinate-0.8.4 → graphinate-0.8.6}/src/graphinate/server/web/elements/__init__.py +0 -0
  115. {graphinate-0.8.4 → graphinate-0.8.6}/src/graphinate/server/web/elements/index.html +0 -0
  116. {graphinate-0.8.4 → graphinate-0.8.6}/src/graphinate/server/web/graphiql/__init__.py +0 -0
  117. {graphinate-0.8.4 → graphinate-0.8.6}/src/graphinate/server/web/graphiql/index.html +0 -0
  118. {graphinate-0.8.4 → graphinate-0.8.6}/src/graphinate/server/web/rapidoc/__init__.py +0 -0
  119. {graphinate-0.8.4 → graphinate-0.8.6}/src/graphinate/server/web/static/images/logo-128.png +0 -0
  120. {graphinate-0.8.4 → graphinate-0.8.6}/src/graphinate/server/web/static/images/logo.svg +0 -0
  121. {graphinate-0.8.4 → graphinate-0.8.6}/src/graphinate/server/web/static/images/network_graph.png +0 -0
  122. {graphinate-0.8.4 → graphinate-0.8.6}/src/graphinate/server/web/viewer/__init__.py +0 -0
  123. {graphinate-0.8.4 → graphinate-0.8.6}/src/graphinate/server/web/voyager/__init__.py +0 -0
  124. {graphinate-0.8.4 → graphinate-0.8.6}/src/graphinate/tools.py +0 -0
  125. {graphinate-0.8.4 → graphinate-0.8.6}/tests/conftest.py +0 -0
  126. {graphinate-0.8.4 → graphinate-0.8.6}/tests/graphinate/test_cli.py +0 -0
  127. {graphinate-0.8.4 → graphinate-0.8.6}/tests/graphinate/test_color.py +0 -0
  128. {graphinate-0.8.4 → graphinate-0.8.6}/tests/graphinate/test_converters.py +0 -0
  129. {graphinate-0.8.4 → graphinate-0.8.6}/tests/graphinate/test_server.py +0 -0
@@ -0,0 +1,9 @@
1
+ [run]
2
+ branch = True
3
+ relative_files = True
4
+ omit =
5
+ .venv/*
6
+ docs/*
7
+ examples/*
8
+ playground/*
9
+ tests/*
@@ -0,0 +1,28 @@
1
+ version = 1
2
+
3
+ test_patterns = [
4
+ "tests/**",
5
+ "test_*.py"
6
+ ]
7
+
8
+ exclude_patterns = [
9
+ "docs/**",
10
+ "examples/**",
11
+ "playground/**"
12
+ ]
13
+
14
+ [[analyzers]]
15
+ name = "javascript"
16
+
17
+ [analyzers.meta]
18
+ environment = ["browser"]
19
+
20
+ [[analyzers]]
21
+ name = "test-coverage"
22
+
23
+ [[analyzers]]
24
+ name = "python"
25
+
26
+ [analyzers.meta]
27
+ runtime_version = "3.x.x"
28
+
@@ -46,7 +46,7 @@ jobs:
46
46
 
47
47
  steps:
48
48
  - name: Checkout repository
49
- uses: actions/checkout@v4
49
+ uses: actions/checkout@v5
50
50
 
51
51
  # Initializes the CodeQL tools for scanning.
52
52
  - name: Initialize CodeQL
@@ -9,7 +9,7 @@ jobs:
9
9
  deploy:
10
10
  runs-on: ubuntu-latest
11
11
  steps:
12
- - uses: actions/checkout@v4
12
+ - uses: actions/checkout@v5
13
13
  - uses: actions/setup-python@v5
14
14
  with:
15
15
  python-version: 3.x
@@ -16,7 +16,7 @@ jobs:
16
16
  deploy:
17
17
  runs-on: ubuntu-latest
18
18
  steps:
19
- - uses: actions/checkout@v4
19
+ - uses: actions/checkout@v5
20
20
  - name: Set up Python
21
21
  uses: actions/setup-python@v5
22
22
  with:
@@ -16,9 +16,9 @@ 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.14.0-alpha.6" ]
19
+ python-version: [ "3.14.0-rc.2" ]
20
20
  steps:
21
- - uses: actions/checkout@v4
21
+ - uses: actions/checkout@v5
22
22
  - name: Set up Python ${{ matrix.python-version }}
23
23
  uses: actions/setup-python@v5
24
24
  with:
@@ -38,5 +38,5 @@ jobs:
38
38
  flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
39
39
  - name: Test with pytest
40
40
  run: |
41
- python -m pip install faker pytest pytest-asyncio pytest-cov pytest-randomly pytest-xdist starlette-prometheus uvicorn[standard]
41
+ python -m pip install faker pytest pytest-asyncio pytest-cov pytest-mock pytest-randomly pytest-xdist starlette-prometheus uvicorn[standard]
42
42
  pytest tests --cov=src --cov-branch --cov-report=xml --junitxml=test_results.xml -n auto
@@ -17,7 +17,7 @@ jobs:
17
17
  matrix:
18
18
  python-version: [ "3.10", "3.11", "3.12", "3.13"]
19
19
  steps:
20
- - uses: actions/checkout@v4
20
+ - uses: actions/checkout@v5
21
21
  - name: Set up Python ${{ matrix.python-version }}
22
22
  uses: actions/setup-python@v5
23
23
  with:
@@ -37,7 +37,7 @@ jobs:
37
37
  flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
38
38
  - name: Test with pytest
39
39
  run: |
40
- python -m pip install faker pytest pytest-asyncio pytest-cov pytest-randomly pytest-xdist starlette-prometheus uvicorn[standard]
40
+ python -m pip install faker pytest pytest-asyncio pytest-cov pytest-mock pytest-randomly pytest-xdist starlette-prometheus uvicorn[standard]
41
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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: Graphinate
3
- Version: 0.8.4
3
+ Version: 0.8.6
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
@@ -33,7 +33,8 @@ 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
+ Requires-Dist: networkx-mermaid
37
+ Requires-Dist: networkx-query>=2.1.3
37
38
  Requires-Dist: strawberry-graphql[asgi,opentelemetry]
38
39
  Provides-Extra: plot
39
40
  Requires-Dist: scipy; extra == 'plot'
@@ -74,6 +75,7 @@ Description-Content-Type: text/markdown
74
75
  <a href="https://github.com/astral-sh/ruff"><img alt="ruff" src="https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json" style="max-width:100%;"></a>
75
76
  <a href="https://github.com/tox-dev/pipdeptree"><img alt="pipdeptree" src="https://img.shields.io/badge/pipdeptree-526CFE.svg?labelColor=gray&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADFElEQVR4nFxTW2tcVRRe39773E/mliZjwKRmhBaKt4BWRKmGgihCH3xUKNWC/Q/ii76IP8AHpSIiRfqmD5YKCinalhgiCMZLSVtMM0mTdDLTuZyZc9l7yTlp7WXBgXPW+fa31rfWtxU9FLMN79Crr028e+iJsZfb7fJMp23xRlOvbTR3L/y5cuOL3Vbv7/vxuPviecI/eWr6k/mj4+8AkM11y+zs2MKwMJvNgIgYINZX/rlx+tIvf72fZXr4P0EQyOCjjw98P9vwn8+/+z3Bq6sek7AJkNhsOjQcyjvFmHd2upd+PP/zsSxNI5mnPvjw8U9fPFJ9XVkgNuDVayEbcgVEfgikNfFg4JAmh1LyyfGq06QqE9vN6+fEs4fHnjv25vjbAOA4AsL2MVZ1hRcI4QXIH7ilMqQXkiYXRBJRbFNQnTsRlqfmxFvH66ccFyAQMxP3I5cqNZBSxIWcKORMO9g3yeSHzFkGbnVCIkDUZ+beEy+8VJ4XguC6TMPYokwrCAHUJsBxYptoFBYSMi0oLIlcAkuFYhal8Zl5VanZU0zErgfurufMFjEkWZ7iRFY4SlgYfW9bUIJKFQNjiNPYf1QZOZn/hTaStPQKTI4eDCxSjsL4I6BeJzOjgcnT0HqPqwBJCdHZjW/miWjkkG3hzqKIe5FVlM3llGuWqOxTDMBkWlJ/6PB2p0Sb21gXixdvLeTtDGOHLFvQHpkiYyTuNU5kuxJercTdpEK3Bz4yLdFrXVsQ33x1/bModjhvyrKKVXB/YD9gb8PgKAlolAZipmFTOIYcxq21Xz8XS5dbi+e+2zqbA3MjxYninH3PpkyZljwYjZE2FoxBIWm6YVHaW/k66qwtF05curz509OHHzvqBqWp232fE+2AoCjOXNMfhcRcjAxxoijNFNpbG0vL588cNzpLC4I00cnCD1fPBuVqffbA5DMGNjR5MOSBpC+UYxGE5G5PmNXff/vy4rdnTmRJHD1wG+9G42D9qVfeePLk/oONI8qv7+/2fbq11f53ZfnqhStLi6d3b67/cT/+vwAAAP//Xo5dwOtdLi4AAAAASUVORK5CYII="></a>
76
77
  <a href="https://squidfunk.github.io/mkdocs-material/"><img alt="mkdocs-material" src="https://img.shields.io/badge/Material_for_MkDocs-526CFE?&logo=MaterialForMkDocs&logoColor=white&labelColor=grey"></a>
78
+ <a href="https://github.com/hukkin/mdformat"><img alt="mdformat" src="https://img.shields.io/badge/mdformat-526CFE?&logo=markdown&logoColor=white&labelColor=grey"></a>
77
79
  <a href="https://hatch.pypa.io"><img alt="Hatch project" class="off-glb" loading="lazy" src="https://img.shields.io/badge/%F0%9F%A5%9A-Hatch-4051b5.svg"></a>
78
80
  </td>
79
81
  </tr>
@@ -99,8 +101,9 @@ Description-Content-Type: text/markdown
99
101
  <a href="https://sonarcloud.io/summary/new_code?id=erivlis_graphinate"><img alt="Bugs" src="https://sonarcloud.io/api/project_badges/measure?project=erivlis_graphinate&metric=bugs"></a>
100
102
  <a href="https://app.codacy.com/gh/erivlis/graphinate/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade"><img alt="Codacy Badge" src="https://app.codacy.com/project/badge/Grade/54b33c3f7313448f9471d01e2a06f037"></a>
101
103
  <a href="https://app.codacy.com/gh/erivlis/graphinate/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_coverage"><img alt="Codacy Coverage" src="https://app.codacy.com/project/badge/Coverage/54b33c3f7313448f9471d01e2a06f037"/></a>
102
- <a href="https://scrutinizer-ci.com/g/erivlis/graphinate"><img alt="Scrutinizer" src="https://scrutinizer-ci.com/g/erivlis/graphinate/badges/quality-score.png?b=main"></a>
103
104
  <a href="https://www.codefactor.io/repository/github/erivlis/graphinate"><img src="https://www.codefactor.io/repository/github/erivlis/graphinate/badge" alt="CodeFactor" /></a>
105
+ <a href="https://app.deepsource.com/gh/erivlis/graphinate/" target="_blank"><img alt="DeepSource" title="DeepSource" src="https://app.deepsource.com/gh/erivlis/graphinate.svg/?label=active+issues&show_trend=true&token=5n11jDEmcZB-6eyGR34rQaxF"/></a>
106
+ <a href="https://app.deepsource.com/gh/erivlis/graphinate/" target="_blank"><img alt="DeepSource" title="DeepSource" src="https://app.deepsource.com/gh/erivlis/graphinate.svg/?label=resolved+issues&show_trend=true&token=5n11jDEmcZB-6eyGR34rQaxF"/></a>
104
107
  <a href="https://snyk.io/test/github/erivlis/graphinate"><img alt="Snyk" src="https://snyk.io/test/github/erivlis/Graphinate/badge.svg"></a>
105
108
  </td>
106
109
  </tr>
@@ -137,10 +140,13 @@ Description-Content-Type: text/markdown
137
140
  - [Python AST - 3D Force-Directed Animation](#python-ast---3d-force-directed-animation)
138
141
  - [Web Page Links](#web-page-links)
139
142
  - [Development](#development)
143
+ - [Install dependencies](#install-dependencies)
144
+ - [Update dependencies](#update-dependencies)
140
145
  - [Ruff](#ruff)
141
146
  - [Test](#test)
142
147
  - [Standard (cobertura) XML Coverage Report](#standard-cobertura-xml-coverage-report)
143
148
  - [HTML Coverage Report](#html-coverage-report)
149
+ - [Terminal Coverage Report](#terminal-coverage-report)
144
150
  - [Docs](#docs)
145
151
  - [test](#test-1)
146
152
  - [build](#build)
@@ -199,6 +205,7 @@ N: int = 8
199
205
  # It will be used to hold the graph definitions
200
206
  graph_model: graphinate.GraphModel = graphinate.model(name="Octagonal Graph")
201
207
 
208
+
202
209
  # Register in the Graph Model the edges' supplier generator function
203
210
  @graph_model.edge()
204
211
  def edge():
@@ -236,6 +243,7 @@ schema = builder.build()
236
243
  # and serve it using Uvicorn web server
237
244
  graphinate.graphql.server(schema)
238
245
  ```
246
+
239
247
  ## CLI
240
248
 
241
249
  ### Commands
@@ -298,7 +306,6 @@ Options:
298
306
 
299
307
  ![repo_graph](https://github.com/erivlis/graphinate/assets/9897520/9c044bbe-1f21-41b8-b879-95b8362ad48d)
300
308
 
301
-
302
309
  ### Web Links
303
310
 
304
311
  ![Web Page Links](https://github.com/erivlis/graphinate/assets/9897520/ea5b00a2-75d1-4d0e-86af-272f20973149)
@@ -320,6 +327,7 @@ uv lock --upgrade
320
327
  uv sync --all-extras --all-groups
321
328
  ```
322
329
 
330
+
323
331
  ### Ruff
324
332
 
325
333
  #### Report issues
@@ -374,35 +382,39 @@ python -m mkdocs build
374
382
 
375
383
  #### Python
376
384
 
377
- <a href="https://palletsprojects.com/p/click/"><img height="60" style="padding: 5px; background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://click.palletsprojects.com/en/7.x/_images/click-logo.png" alt="Click Logo"></a>
385
+ <a href="https://palletsprojects.com/projects/click/"><img height="60" style="padding: 5px; background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://palletsprojects.com/static/content/projects/click-name.svg" alt="Click Logo"></a>
378
386
  <a href="https://github.com/Delgan/loguru"><img height="60" style="padding: 5px; background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://raw.githubusercontent.com/Delgan/loguru/master/docs/_static/img/logo.png" alt="Loguru Logo"></a>
379
- <a href="https://matplotlib.org/"><img height="60" style="padding: 5px; background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://matplotlib.org/_static/logo_dark.svg" alt="matplotlib Logo."></a>
380
- <a href="https://networkx.org/"><img height="60" style="padding: 5px; background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://networkx.org/_static/networkx_logo.svg" alt="NetworkX Logo."></a>
387
+ <a href="https://matplotlib.org/"><img height="60" style="padding: 5px; background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://matplotlib.org/_static/logo_dark.svg" alt="matplotlib Logo"></a>
388
+ <a href="https://networkx.org/"><img height="60" style="padding: 5px; background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://networkx.org/_static/networkx_logo.svg" alt="NetworkX Logo"></a>
389
+ <a href="https://www.starlette.io/"><img height="60" style="padding: 5px; background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://www.starlette.io/img/starlette.svg#only-light" alt="Starlette Logo"></a>
381
390
  <a href="https://strawberry.rocks/"><img height="60" style="padding: 5px; background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://github.com/strawberry-graphql/strawberry/raw/main/.github/logo.png" alt="Strawberry GraphQL Logo"></a>
382
391
 
383
392
  #### Javascript and HTML
384
393
 
385
- <a href="https://vasturiano.github.io/3d-force-graph/"><img height="60" style="background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="http://gist.github.com/vasturiano/02affe306ce445e423f992faeea13521/raw/preview.png" alt="3D Force-Directed Graph Logo"></a>
394
+ <a href="https://vasturiano.github.io/3d-force-graph/"><img height="60" style="background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="http://gist.github.com/vasturiano/02affe306ce445e423f992faeea13521/raw/preview.png" alt="3D Force-Directed Graph"></a>
386
395
  <a href="https://github.com/graphql-kit/graphql-voyager"><img height="60" style="background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://github.com/graphql-kit/graphql-voyager/raw/main/docs/cover.png" alt="Graphql Voyager Logo"></a>
387
- <a href="https://github.com/cocopon/tweakpane"><img height="60" style="background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://user-images.githubusercontent.com/602961/184479032-38f50be3-e235-4914-85c0-dce316b33ed2.png" alt="Tweakpane Logo"></a>
396
+ <a href="https://github.com/cocopon/tweakpane"><img height="60" style="background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://user-images.githubusercontent.com/602961/184479032-38f50be3-e235-4914-85c0-dce316b33ed2.png" alt="Tweakpane"></a>
388
397
 
389
398
  ### Dev Tools
390
399
 
391
- <a href="https://hatch.pypa.io/"><img height="60" style="background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://hatch.pypa.io/latest/assets/images/logo.svg" alt="Hatch logo."></a>
400
+ <a href="https://astral.sh/uv"><img height="60" style="padding: 16px; background: #261230;" src="https://docs.astral.sh/uv/assets/logo-letter.svg" alt="uv logo"></a>
401
+ <a href="https://astral.sh/ruff"><img height="60" style="background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://astralcms.wpengine.com/wp-content/uploads/2023/03/Ruff-Logo.svg" alt="Ruff logo"></a>
402
+ <a href="https://mdformat.readthedocs.io"><img height="60" width="60" style="aspect-ratio: auto; padding: 4px; background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://mdformat.readthedocs.io/en/stable/_static/logo-150px.png" alt="mdformat"></a>
392
403
  <a href="https://squidfunk.github.io/mkdocs-material/"><img height="60" style="background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://raw.githubusercontent.com/squidfunk/mkdocs-material/master/.github/assets/logo.svg" alt="Material for MkDocs"></a>
393
404
  <a href="https://pytest.org"><img height="60" style="background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://docs.pytest.org/en/7.4.x/_static/pytest_logo_curves.svg" alt="pytest logo"></a>
394
- <a href="https://astral.sh/ruff"><img height="60" style="background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://astralcms.wpengine.com/wp-content/uploads/2023/03/Ruff-Logo.svg" alt="Ruff logo"></a>
395
- <a href="https://astral.sh/uv"><img height="60" style="padding: 16px; background: #261230;" src="https://docs.astral.sh/uv/assets/logo-letter.svg" alt="uv logo"></a>
405
+ <a href="https://hatch.pypa.io/"><img height="60" style="background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://hatch.pypa.io/latest/assets/images/logo.svg" alt="Hatch logo."></a>
406
+
407
+
396
408
 
397
409
  ### IDE
398
410
 
399
411
  <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
412
 
401
- --------------------------------
413
+ ______________________________________________________________________
402
414
 
403
415
  ![Alt](https://repobeats.axiom.co/api/embed/683f50f1d2de0e13e468c34a692612c2de4d56bd.svg "Repobeats analytics image")
404
416
 
405
- --------------------------------
417
+ ______________________________________________________________________
406
418
 
407
419
  <img alt="Work on my Machine" src="https://forthebadge.com/images/badges/works-on-my-machine.svg">
408
420
 
@@ -30,6 +30,7 @@
30
30
  <a href="https://github.com/astral-sh/ruff"><img alt="ruff" src="https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json" style="max-width:100%;"></a>
31
31
  <a href="https://github.com/tox-dev/pipdeptree"><img alt="pipdeptree" src="https://img.shields.io/badge/pipdeptree-526CFE.svg?labelColor=gray&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADFElEQVR4nFxTW2tcVRRe39773E/mliZjwKRmhBaKt4BWRKmGgihCH3xUKNWC/Q/ii76IP8AHpSIiRfqmD5YKCinalhgiCMZLSVtMM0mTdDLTuZyZc9l7yTlp7WXBgXPW+fa31rfWtxU9FLMN79Crr028e+iJsZfb7fJMp23xRlOvbTR3L/y5cuOL3Vbv7/vxuPviecI/eWr6k/mj4+8AkM11y+zs2MKwMJvNgIgYINZX/rlx+tIvf72fZXr4P0EQyOCjjw98P9vwn8+/+z3Bq6sek7AJkNhsOjQcyjvFmHd2upd+PP/zsSxNI5mnPvjw8U9fPFJ9XVkgNuDVayEbcgVEfgikNfFg4JAmh1LyyfGq06QqE9vN6+fEs4fHnjv25vjbAOA4AsL2MVZ1hRcI4QXIH7ilMqQXkiYXRBJRbFNQnTsRlqfmxFvH66ccFyAQMxP3I5cqNZBSxIWcKORMO9g3yeSHzFkGbnVCIkDUZ+beEy+8VJ4XguC6TMPYokwrCAHUJsBxYptoFBYSMi0oLIlcAkuFYhal8Zl5VanZU0zErgfurufMFjEkWZ7iRFY4SlgYfW9bUIJKFQNjiNPYf1QZOZn/hTaStPQKTI4eDCxSjsL4I6BeJzOjgcnT0HqPqwBJCdHZjW/miWjkkG3hzqKIe5FVlM3llGuWqOxTDMBkWlJ/6PB2p0Sb21gXixdvLeTtDGOHLFvQHpkiYyTuNU5kuxJercTdpEK3Bz4yLdFrXVsQ33x1/bModjhvyrKKVXB/YD9gb8PgKAlolAZipmFTOIYcxq21Xz8XS5dbi+e+2zqbA3MjxYninH3PpkyZljwYjZE2FoxBIWm6YVHaW/k66qwtF05curz509OHHzvqBqWp232fE+2AoCjOXNMfhcRcjAxxoijNFNpbG0vL588cNzpLC4I00cnCD1fPBuVqffbA5DMGNjR5MOSBpC+UYxGE5G5PmNXff/vy4rdnTmRJHD1wG+9G42D9qVfeePLk/oONI8qv7+/2fbq11f53ZfnqhStLi6d3b67/cT/+vwAAAP//Xo5dwOtdLi4AAAAASUVORK5CYII="></a>
32
32
  <a href="https://squidfunk.github.io/mkdocs-material/"><img alt="mkdocs-material" src="https://img.shields.io/badge/Material_for_MkDocs-526CFE?&logo=MaterialForMkDocs&logoColor=white&labelColor=grey"></a>
33
+ <a href="https://github.com/hukkin/mdformat"><img alt="mdformat" src="https://img.shields.io/badge/mdformat-526CFE?&logo=markdown&logoColor=white&labelColor=grey"></a>
33
34
  <a href="https://hatch.pypa.io"><img alt="Hatch project" class="off-glb" loading="lazy" src="https://img.shields.io/badge/%F0%9F%A5%9A-Hatch-4051b5.svg"></a>
34
35
  </td>
35
36
  </tr>
@@ -55,8 +56,9 @@
55
56
  <a href="https://sonarcloud.io/summary/new_code?id=erivlis_graphinate"><img alt="Bugs" src="https://sonarcloud.io/api/project_badges/measure?project=erivlis_graphinate&metric=bugs"></a>
56
57
  <a href="https://app.codacy.com/gh/erivlis/graphinate/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade"><img alt="Codacy Badge" src="https://app.codacy.com/project/badge/Grade/54b33c3f7313448f9471d01e2a06f037"></a>
57
58
  <a href="https://app.codacy.com/gh/erivlis/graphinate/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_coverage"><img alt="Codacy Coverage" src="https://app.codacy.com/project/badge/Coverage/54b33c3f7313448f9471d01e2a06f037"/></a>
58
- <a href="https://scrutinizer-ci.com/g/erivlis/graphinate"><img alt="Scrutinizer" src="https://scrutinizer-ci.com/g/erivlis/graphinate/badges/quality-score.png?b=main"></a>
59
59
  <a href="https://www.codefactor.io/repository/github/erivlis/graphinate"><img src="https://www.codefactor.io/repository/github/erivlis/graphinate/badge" alt="CodeFactor" /></a>
60
+ <a href="https://app.deepsource.com/gh/erivlis/graphinate/" target="_blank"><img alt="DeepSource" title="DeepSource" src="https://app.deepsource.com/gh/erivlis/graphinate.svg/?label=active+issues&show_trend=true&token=5n11jDEmcZB-6eyGR34rQaxF"/></a>
61
+ <a href="https://app.deepsource.com/gh/erivlis/graphinate/" target="_blank"><img alt="DeepSource" title="DeepSource" src="https://app.deepsource.com/gh/erivlis/graphinate.svg/?label=resolved+issues&show_trend=true&token=5n11jDEmcZB-6eyGR34rQaxF"/></a>
60
62
  <a href="https://snyk.io/test/github/erivlis/graphinate"><img alt="Snyk" src="https://snyk.io/test/github/erivlis/Graphinate/badge.svg"></a>
61
63
  </td>
62
64
  </tr>
@@ -93,10 +95,13 @@
93
95
  - [Python AST - 3D Force-Directed Animation](#python-ast---3d-force-directed-animation)
94
96
  - [Web Page Links](#web-page-links)
95
97
  - [Development](#development)
98
+ - [Install dependencies](#install-dependencies)
99
+ - [Update dependencies](#update-dependencies)
96
100
  - [Ruff](#ruff)
97
101
  - [Test](#test)
98
102
  - [Standard (cobertura) XML Coverage Report](#standard-cobertura-xml-coverage-report)
99
103
  - [HTML Coverage Report](#html-coverage-report)
104
+ - [Terminal Coverage Report](#terminal-coverage-report)
100
105
  - [Docs](#docs)
101
106
  - [test](#test-1)
102
107
  - [build](#build)
@@ -155,6 +160,7 @@ N: int = 8
155
160
  # It will be used to hold the graph definitions
156
161
  graph_model: graphinate.GraphModel = graphinate.model(name="Octagonal Graph")
157
162
 
163
+
158
164
  # Register in the Graph Model the edges' supplier generator function
159
165
  @graph_model.edge()
160
166
  def edge():
@@ -192,6 +198,7 @@ schema = builder.build()
192
198
  # and serve it using Uvicorn web server
193
199
  graphinate.graphql.server(schema)
194
200
  ```
201
+
195
202
  ## CLI
196
203
 
197
204
  ### Commands
@@ -254,7 +261,6 @@ Options:
254
261
 
255
262
  ![repo_graph](https://github.com/erivlis/graphinate/assets/9897520/9c044bbe-1f21-41b8-b879-95b8362ad48d)
256
263
 
257
-
258
264
  ### Web Links
259
265
 
260
266
  ![Web Page Links](https://github.com/erivlis/graphinate/assets/9897520/ea5b00a2-75d1-4d0e-86af-272f20973149)
@@ -276,6 +282,7 @@ uv lock --upgrade
276
282
  uv sync --all-extras --all-groups
277
283
  ```
278
284
 
285
+
279
286
  ### Ruff
280
287
 
281
288
  #### Report issues
@@ -330,35 +337,39 @@ python -m mkdocs build
330
337
 
331
338
  #### Python
332
339
 
333
- <a href="https://palletsprojects.com/p/click/"><img height="60" style="padding: 5px; background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://click.palletsprojects.com/en/7.x/_images/click-logo.png" alt="Click Logo"></a>
340
+ <a href="https://palletsprojects.com/projects/click/"><img height="60" style="padding: 5px; background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://palletsprojects.com/static/content/projects/click-name.svg" alt="Click Logo"></a>
334
341
  <a href="https://github.com/Delgan/loguru"><img height="60" style="padding: 5px; background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://raw.githubusercontent.com/Delgan/loguru/master/docs/_static/img/logo.png" alt="Loguru Logo"></a>
335
- <a href="https://matplotlib.org/"><img height="60" style="padding: 5px; background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://matplotlib.org/_static/logo_dark.svg" alt="matplotlib Logo."></a>
336
- <a href="https://networkx.org/"><img height="60" style="padding: 5px; background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://networkx.org/_static/networkx_logo.svg" alt="NetworkX Logo."></a>
342
+ <a href="https://matplotlib.org/"><img height="60" style="padding: 5px; background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://matplotlib.org/_static/logo_dark.svg" alt="matplotlib Logo"></a>
343
+ <a href="https://networkx.org/"><img height="60" style="padding: 5px; background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://networkx.org/_static/networkx_logo.svg" alt="NetworkX Logo"></a>
344
+ <a href="https://www.starlette.io/"><img height="60" style="padding: 5px; background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://www.starlette.io/img/starlette.svg#only-light" alt="Starlette Logo"></a>
337
345
  <a href="https://strawberry.rocks/"><img height="60" style="padding: 5px; background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://github.com/strawberry-graphql/strawberry/raw/main/.github/logo.png" alt="Strawberry GraphQL Logo"></a>
338
346
 
339
347
  #### Javascript and HTML
340
348
 
341
- <a href="https://vasturiano.github.io/3d-force-graph/"><img height="60" style="background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="http://gist.github.com/vasturiano/02affe306ce445e423f992faeea13521/raw/preview.png" alt="3D Force-Directed Graph Logo"></a>
349
+ <a href="https://vasturiano.github.io/3d-force-graph/"><img height="60" style="background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="http://gist.github.com/vasturiano/02affe306ce445e423f992faeea13521/raw/preview.png" alt="3D Force-Directed Graph"></a>
342
350
  <a href="https://github.com/graphql-kit/graphql-voyager"><img height="60" style="background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://github.com/graphql-kit/graphql-voyager/raw/main/docs/cover.png" alt="Graphql Voyager Logo"></a>
343
- <a href="https://github.com/cocopon/tweakpane"><img height="60" style="background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://user-images.githubusercontent.com/602961/184479032-38f50be3-e235-4914-85c0-dce316b33ed2.png" alt="Tweakpane Logo"></a>
351
+ <a href="https://github.com/cocopon/tweakpane"><img height="60" style="background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://user-images.githubusercontent.com/602961/184479032-38f50be3-e235-4914-85c0-dce316b33ed2.png" alt="Tweakpane"></a>
344
352
 
345
353
  ### Dev Tools
346
354
 
347
- <a href="https://hatch.pypa.io/"><img height="60" style="background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://hatch.pypa.io/latest/assets/images/logo.svg" alt="Hatch logo."></a>
355
+ <a href="https://astral.sh/uv"><img height="60" style="padding: 16px; background: #261230;" src="https://docs.astral.sh/uv/assets/logo-letter.svg" alt="uv logo"></a>
356
+ <a href="https://astral.sh/ruff"><img height="60" style="background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://astralcms.wpengine.com/wp-content/uploads/2023/03/Ruff-Logo.svg" alt="Ruff logo"></a>
357
+ <a href="https://mdformat.readthedocs.io"><img height="60" width="60" style="aspect-ratio: auto; padding: 4px; background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://mdformat.readthedocs.io/en/stable/_static/logo-150px.png" alt="mdformat"></a>
348
358
  <a href="https://squidfunk.github.io/mkdocs-material/"><img height="60" style="background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://raw.githubusercontent.com/squidfunk/mkdocs-material/master/.github/assets/logo.svg" alt="Material for MkDocs"></a>
349
359
  <a href="https://pytest.org"><img height="60" style="background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://docs.pytest.org/en/7.4.x/_static/pytest_logo_curves.svg" alt="pytest logo"></a>
350
- <a href="https://astral.sh/ruff"><img height="60" style="background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://astralcms.wpengine.com/wp-content/uploads/2023/03/Ruff-Logo.svg" alt="Ruff logo"></a>
351
- <a href="https://astral.sh/uv"><img height="60" style="padding: 16px; background: #261230;" src="https://docs.astral.sh/uv/assets/logo-letter.svg" alt="uv logo"></a>
360
+ <a href="https://hatch.pypa.io/"><img height="60" style="background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://hatch.pypa.io/latest/assets/images/logo.svg" alt="Hatch logo."></a>
361
+
362
+
352
363
 
353
364
  ### IDE
354
365
 
355
366
  <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
367
 
357
- --------------------------------
368
+ ______________________________________________________________________
358
369
 
359
370
  ![Alt](https://repobeats.axiom.co/api/embed/683f50f1d2de0e13e468c34a692612c2de4d56bd.svg "Repobeats analytics image")
360
371
 
361
- --------------------------------
372
+ ______________________________________________________________________
362
373
 
363
374
  <img alt="Work on my Machine" src="https://forthebadge.com/images/badges/works-on-my-machine.svg">
364
375
 
@@ -1,15 +1,15 @@
1
1
  {
2
- "acknowledge.md": {
2
+ "acknowledgements.md": {
3
3
  "created": "2023-08-20T00:21:55.621436",
4
- "modified": "2025-03-12T00:39:57.859235"
4
+ "modified": "2025-08-22T22:30:50.704535"
5
5
  },
6
6
  "index.md": {
7
7
  "created": "2023-08-15T00:05:21.586874",
8
8
  "modified": "2025-03-12T00:40:46.459147"
9
9
  },
10
- "intro.md": {
10
+ "introduction.md": {
11
11
  "created": "2023-08-19T23:54:18.668094",
12
- "modified": "2025-03-11T23:24:02.836144"
12
+ "modified": "2025-08-22T22:30:50.705536"
13
13
  },
14
14
  "start.md": {
15
15
  "created": "2023-08-20T00:07:42.683716",
@@ -4,11 +4,12 @@
4
4
 
5
5
  ### Python
6
6
 
7
- <a href="https://palletsprojects.com/p/click/"><img style="height: 50px; padding: 5px; background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://click.palletsprojects.com/en/7.x/_images/click-logo.png" alt="Click Logo."></a>
8
- <a href="https://github.com/Delgan/loguru"><img style="height: 50px; padding: 5px; background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://raw.githubusercontent.com/Delgan/loguru/master/docs/_static/img/logo.png" alt="Loguru Logo."></a>
9
- <a href="https://matplotlib.org/"><img style="height: 50px; padding: 5px; background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://matplotlib.org/_static/logo_dark.svg" alt="matplotlib Logo."></a>
10
- <a href="https://networkx.org/"><img style="height: 50px; padding: 5px; background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://networkx.org/_static/networkx_logo.svg" alt="NetworkX Logo."></a>
11
- <a href="https://strawberry.rocks/"><img style="height: 50px; padding: 5px; background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://github.com/strawberry-graphql/strawberry/raw/main/.github/logo.png" alt="Strawberry GraphQL Logo."></a>
7
+ <a href="https://palletsprojects.com/projects/click/"><img style="height: 50px; padding: 5px; background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://palletsprojects.com/static/content/projects/click-name.svg" alt="Click Logo"></a>
8
+ <a href="https://github.com/Delgan/loguru"><img style="height: 50px; padding: 5px; background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://raw.githubusercontent.com/Delgan/loguru/master/docs/_static/img/logo.png" alt="Loguru Logo"></a>
9
+ <a href="https://matplotlib.org/"><img style="height: 50px; padding: 5px; background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://matplotlib.org/_static/logo_dark.svg" alt="matplotlib Logo"></a>
10
+ <a href="https://networkx.org/"><img style="height: 50px; padding: 5px; background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://networkx.org/_static/networkx_logo.svg" alt="NetworkX Logo"></a>
11
+ <a href="https://www.starlette.io/"><img style="height: 50px; padding: 5px; background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://www.starlette.io/img/starlette.svg" alt="Starlette Logo"></a>
12
+ <a href="https://strawberry.rocks/"><img style="height: 50px; padding: 5px; background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://github.com/strawberry-graphql/strawberry/raw/main/.github/logo.png" alt="Strawberry GraphQL Logo"></a>
12
13
 
13
14
  ### Javascript and HTML
14
15
 
@@ -20,12 +21,11 @@
20
21
 
21
22
  <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
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
+ <a href="https://mdformat.readthedocs.io"><img style="height: 50px; width: 50px; aspect-ratio: auto; padding: 4px; background: linear-gradient(-45deg, #FFFFFF, #CCCCCC);" src="https://mdformat.readthedocs.io/en/stable/_static/logo-150px.png" alt="mdformat"></a>
23
25
  <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
26
  <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
27
  <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
28
 
27
-
28
-
29
29
  ## IDE
30
30
 
31
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>
@@ -51,7 +51,9 @@ def ast_graph_model():
51
51
  GraphModel: A graph model representing the AST nodes and their relationships.
52
52
  """
53
53
 
54
- graph_model = graphinate.model(name='AST Graph')
54
+ code_object = graphinate.builders.D3Builder
55
+
56
+ graph_model = graphinate.model(name=f'AST Graph - {code_object.__qualname__}',)
55
57
 
56
58
  root_ast_node = ast.parse(inspect.getsource(graphinate.builders.D3Builder))
57
59
 
@@ -1,7 +1,7 @@
1
1
  import functools
2
2
  import os
3
3
  from collections.abc import Iterable
4
- from typing import Optional, Union
4
+ from typing import Union
5
5
 
6
6
  # see requirements.txt
7
7
  from github import Auth, Github
@@ -26,11 +26,11 @@ client = Github(auth=auth)
26
26
 
27
27
 
28
28
  @functools.lru_cache
29
- def github_user(user_id: Optional[str] = None) -> Union[NamedUser, AuthenticatedUser]:
29
+ def github_user(user_id: str | None = None) -> Union[NamedUser, AuthenticatedUser]:
30
30
  """
31
31
  Get the GitHub user object for the specified user ID or the authenticated user.
32
32
 
33
- Parameters:
33
+ Args:
34
34
  user_id (Optional[str]): The ID of the user to retrieve.
35
35
  If not provided, retrieve the authenticated user.
36
36
 
@@ -46,12 +46,12 @@ def github_user(user_id: Optional[str] = None) -> Union[NamedUser, Authenticated
46
46
 
47
47
  @functools.lru_cache
48
48
  def github_repositories(
49
- user_id: Optional[str] = None,
50
- repo_id: Optional[str] = None) -> Iterable[Repository]:
49
+ user_id: str | None = None,
50
+ repo_id: str | None = None) -> Iterable[Repository]:
51
51
  """
52
52
  Get the GitHub repositories for the specified user ID or the authenticated user.
53
53
 
54
- Parameters:
54
+ Args:
55
55
  user_id (Optional[str]): The ID of the user whose repositories to retrieve.
56
56
  If not provided, retrieve repositories of the authenticated user.
57
57
  repo_id (Optional[str]): The ID of the repository to retrieve.
@@ -74,11 +74,11 @@ def github_repositories(
74
74
 
75
75
  def github_commits(
76
76
  repo: Repository,
77
- commit_id: Optional[str] = None) -> Iterable[Commit]:
77
+ commit_id: str | None = None) -> Iterable[Commit]:
78
78
  """
79
79
  Retrieve commits from a GitHub repository.
80
80
 
81
- Parameters:
81
+ Args:
82
82
  repo (Repository): The GitHub repository object from which to retrieve commits.
83
83
  commit_id (str, optional): The ID of the commit to retrieve.
84
84
  If provided, only that commit will be returned.
@@ -111,11 +111,11 @@ def github_commits(
111
111
 
112
112
  def github_files(
113
113
  commit: Commit,
114
- file_id: Optional[str] = None) -> Iterable[File]:
114
+ file_id: str | None = None) -> Iterable[File]:
115
115
  """
116
116
  Retrieves Files from a GitHub Commit
117
117
 
118
- Parameters:
118
+ Args:
119
119
  commit (Commit): A Commit object from the GitHub API.
120
120
  file_id (Optional[str]): An optional parameter specifying the filename to filter the files. Default is None.
121
121
 
@@ -4,7 +4,6 @@ It recursively fetches followers of a given user up to a specified maximum depth
4
4
  The function yields edges between users in the graph.
5
5
  """
6
6
 
7
- from typing import Optional
8
7
 
9
8
  from _client import github_user # see _client.py
10
9
 
@@ -26,7 +25,7 @@ def followers_graph_model(max_depth: int = DEPTH):
26
25
 
27
26
  graph_model = graphinate.model(name='Github Followers Graph')
28
27
 
29
- def _followers(user_id: Optional[str] = None, depth: int = 0, **kwargs):
28
+ def _followers(user_id: str | None = None, depth: int = 0, **kwargs):
30
29
  user = github_user(user_id)
31
30
  for follower in user.get_followers():
32
31
  yield {'source': user.login, 'target': follower.login}
@@ -34,7 +33,7 @@ def followers_graph_model(max_depth: int = DEPTH):
34
33
  yield from _followers(follower.login, depth=depth + 1, **kwargs)
35
34
 
36
35
  @graph_model.edge()
37
- def followed_by(user_id: Optional[str] = None, **kwargs):
36
+ def followed_by(user_id: str | None = None, **kwargs):
38
37
  yield from _followers(user_id, **kwargs)
39
38
 
40
39
  return graph_model
@@ -1,7 +1,6 @@
1
1
  import itertools
2
2
  import operator
3
3
  import pathlib
4
- from typing import Optional
5
4
 
6
5
  from _client import github_commits, github_files, github_repositories, github_user # see _client.py
7
6
 
@@ -19,10 +18,10 @@ def repo_graph_model(): # noqa: C901
19
18
  graph_model = graphinate.model(name='GitHub Repository Graph')
20
19
 
21
20
  @graph_model.edge()
22
- def github(user_id: Optional[str] = None,
23
- repository_id: Optional[str] = None,
24
- commit_id: Optional[str] = None,
25
- file_id: Optional[str] = None,
21
+ def github(user_id: str | None = None,
22
+ repository_id: str | None = None,
23
+ commit_id: str | None = None,
24
+ file_id: str | None = None,
26
25
  **kwargs):
27
26
  user = github_user(user_id)
28
27
  for repo in github_repositories(user_id, repository_id):
@@ -62,28 +61,28 @@ def repo_graph_model(): # noqa: C901
62
61
  label=operator.itemgetter('filename'))
63
62
 
64
63
  @user_node
65
- def user(user_id: Optional[str] = None, **kwargs):
64
+ def user(user_id: str | None = None, **kwargs):
66
65
  yield github_user(user_id)
67
66
 
68
67
  @repository_node
69
- def repository(user_id: Optional[str] = None,
70
- repository_id: Optional[str] = None,
68
+ def repository(user_id: str | None = None,
69
+ repository_id: str | None = None,
71
70
  **kwargs):
72
71
  repos = github_repositories(user_id, repository_id)
73
72
  yield from repos
74
73
 
75
74
  @commit_node
76
- def commit(user_id: Optional[str] = None,
77
- repository_id: Optional[str] = None,
78
- commit_id: Optional[str] = None,
75
+ def commit(user_id: str | None = None,
76
+ repository_id: str | None = None,
77
+ commit_id: str | None = None,
79
78
  **kwargs):
80
79
  for repo in github_repositories(user_id, repository_id):
81
80
  yield from github_commits(repo, commit_id)
82
81
 
83
- def file_type(user_id: Optional[str] = None,
84
- repository_id: Optional[str] = None,
85
- commit_id: Optional[str] = None,
86
- file_type_id: Optional[str] = None,
82
+ def file_type(user_id: str | None = None,
83
+ repository_id: str | None = None,
84
+ commit_id: str | None = None,
85
+ file_type_id: str | None = None,
87
86
  **kwargs):
88
87
  def group_key(file):
89
88
  return pathlib.PurePath(file).suffix
@@ -97,10 +96,10 @@ def repo_graph_model(): # noqa: C901
97
96
  ))
98
97
 
99
98
  @file_node
100
- def file(user_id: Optional[str] = None,
101
- repository_id: Optional[str] = None,
102
- commit_id: Optional[str] = None,
103
- file_id: Optional[str] = None,
99
+ def file(user_id: str | None = None,
100
+ repository_id: str | None = None,
101
+ commit_id: str | None = None,
102
+ file_id: str | None = None,
104
103
  **kwargs):
105
104
  for repo in github_repositories(user_id, repository_id):
106
105
  for commit in github_commits(repo, commit_id):