Graphinate 0.3.0__tar.gz → 0.3.2__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 (103) hide show
  1. {graphinate-0.3.0 → graphinate-0.3.2}/.github/workflows/test-beta.yml +2 -1
  2. {graphinate-0.3.0 → graphinate-0.3.2}/.github/workflows/test.yml +10 -1
  3. {graphinate-0.3.0 → graphinate-0.3.2}/.gitignore +1 -0
  4. graphinate-0.3.2/.sonarcloud.properties +15 -0
  5. {graphinate-0.3.0 → graphinate-0.3.2}/PKG-INFO +52 -41
  6. {graphinate-0.3.0 → graphinate-0.3.2}/README.md +35 -25
  7. {graphinate-0.3.0 → graphinate-0.3.2}/STATS.md +7 -1
  8. {graphinate-0.3.0 → graphinate-0.3.2}/docs/acknowledge.md +1 -1
  9. {graphinate-0.3.0 → graphinate-0.3.2}/docs/index.md +1 -0
  10. graphinate-0.3.2/examples/code/requirements.txt +2 -0
  11. graphinate-0.3.2/examples/github/requirements.txt +2 -0
  12. {graphinate-0.3.0 → graphinate-0.3.2}/examples/math/graph_atlas.py +4 -2
  13. {graphinate-0.3.0 → graphinate-0.3.2}/examples/math/polygonal_graph.py +11 -8
  14. graphinate-0.3.2/examples/system/requirements.txt +2 -0
  15. graphinate-0.3.2/examples/web/requirements.txt +4 -0
  16. {graphinate-0.3.0 → graphinate-0.3.2}/pyproject.toml +22 -18
  17. {graphinate-0.3.0 → graphinate-0.3.2}/src/graphinate/__init__.py +4 -5
  18. {graphinate-0.3.0 → graphinate-0.3.2}/src/graphinate/builders.py +27 -16
  19. {graphinate-0.3.0 → graphinate-0.3.2}/src/graphinate/color.py +1 -1
  20. {graphinate-0.3.0 → graphinate-0.3.2}/src/graphinate/materializers/__init__.py +7 -7
  21. {graphinate-0.3.0 → graphinate-0.3.2}/src/graphinate/modeling.py +25 -19
  22. graphinate-0.3.2/src/graphinate/server/web/static/js/murmurhash3_gc.js +64 -0
  23. {graphinate-0.3.0 → graphinate-0.3.2}/src/graphinate/server/web/viewer/index.html +1 -1
  24. {graphinate-0.3.0 → graphinate-0.3.2}/src/graphinate/tools/gui.py +2 -2
  25. {graphinate-0.3.0 → graphinate-0.3.2}/src/graphinate/tools/mutators.py +2 -2
  26. graphinate-0.3.2/src/graphinate/typing.py +65 -0
  27. {graphinate-0.3.0 → graphinate-0.3.2}/tests/conftest.py +8 -7
  28. {graphinate-0.3.0 → graphinate-0.3.2}/tests/graphinate/test_builders.py +37 -34
  29. {graphinate-0.3.0 → graphinate-0.3.2}/tests/graphinate/test_cli.py +3 -2
  30. {graphinate-0.3.0 → graphinate-0.3.2}/tests/graphinate/test_color.py +1 -0
  31. {graphinate-0.3.0 → graphinate-0.3.2}/tests/graphinate/test_materializers.py +9 -9
  32. {graphinate-0.3.0 → graphinate-0.3.2}/tests/graphinate/test_modeling.py +13 -5
  33. {graphinate-0.3.0 → graphinate-0.3.2}/tests/graphinate/test_server.py +4 -3
  34. graphinate-0.3.0/examples/code/requirements.txt +0 -2
  35. graphinate-0.3.0/examples/github/requirements.txt +0 -2
  36. graphinate-0.3.0/examples/system/requirements.txt +0 -2
  37. graphinate-0.3.0/examples/web/requirements.txt +0 -3
  38. graphinate-0.3.0/src/graphinate/typing.py +0 -54
  39. {graphinate-0.3.0 → graphinate-0.3.2}/.coveragerc +0 -0
  40. {graphinate-0.3.0 → graphinate-0.3.2}/.github/dependabot.yml +0 -0
  41. {graphinate-0.3.0 → graphinate-0.3.2}/.github/workflows/codeql.yml +0 -0
  42. {graphinate-0.3.0 → graphinate-0.3.2}/.github/workflows/publish-docs.yaml +0 -0
  43. {graphinate-0.3.0 → graphinate-0.3.2}/.github/workflows/publish.yml +0 -0
  44. {graphinate-0.3.0 → graphinate-0.3.2}/LICENSE +0 -0
  45. {graphinate-0.3.0 → graphinate-0.3.2}/docs/assets/images/logo-128.png +0 -0
  46. {graphinate-0.3.0 → graphinate-0.3.2}/docs/assets/images/network_graph.png +0 -0
  47. {graphinate-0.3.0 → graphinate-0.3.2}/docs/assets/stylesheets/extra.css +0 -0
  48. {graphinate-0.3.0 → graphinate-0.3.2}/docs/dev.md +0 -0
  49. {graphinate-0.3.0 → graphinate-0.3.2}/docs/examples/code.md +0 -0
  50. {graphinate-0.3.0 → graphinate-0.3.2}/docs/examples/github.md +0 -0
  51. {graphinate-0.3.0 → graphinate-0.3.2}/docs/examples/math.md +0 -0
  52. {graphinate-0.3.0 → graphinate-0.3.2}/docs/examples/system.md +0 -0
  53. {graphinate-0.3.0 → graphinate-0.3.2}/docs/examples/web.md +0 -0
  54. {graphinate-0.3.0 → graphinate-0.3.2}/docs/gen_ref_pages.py +0 -0
  55. {graphinate-0.3.0 → graphinate-0.3.2}/docs/intro.md +0 -0
  56. {graphinate-0.3.0 → graphinate-0.3.2}/docs/start.md +0 -0
  57. {graphinate-0.3.0 → graphinate-0.3.2}/docs/usage/cli.md +0 -0
  58. {graphinate-0.3.0 → graphinate-0.3.2}/docs/usage/lib.md +0 -0
  59. {graphinate-0.3.0 → graphinate-0.3.2}/examples/code/python_ast.py +0 -0
  60. {graphinate-0.3.0 → graphinate-0.3.2}/examples/code/python_dependencies.py +0 -0
  61. {graphinate-0.3.0 → graphinate-0.3.2}/examples/github/_client.py +0 -0
  62. {graphinate-0.3.0 → graphinate-0.3.2}/examples/github/commits_visibilty_graph.py +0 -0
  63. {graphinate-0.3.0 → graphinate-0.3.2}/examples/github/followers.graphql +0 -0
  64. {graphinate-0.3.0 → graphinate-0.3.2}/examples/github/followers.py +0 -0
  65. {graphinate-0.3.0 → graphinate-0.3.2}/examples/github/graphql.config.yml +0 -0
  66. {graphinate-0.3.0 → graphinate-0.3.2}/examples/github/repositories.graphql +0 -0
  67. {graphinate-0.3.0 → graphinate-0.3.2}/examples/github/repositories.py +0 -0
  68. {graphinate-0.3.0 → graphinate-0.3.2}/examples/math/requirements.txt +0 -0
  69. {graphinate-0.3.0 → graphinate-0.3.2}/examples/system/processes.py +0 -0
  70. {graphinate-0.3.0 → graphinate-0.3.2}/examples/web/page_links.py +0 -0
  71. {graphinate-0.3.0 → graphinate-0.3.2}/mkdocs.yml +0 -0
  72. {graphinate-0.3.0 → graphinate-0.3.2}/playground/ethernet/traceroute.py +0 -0
  73. {graphinate-0.3.0 → graphinate-0.3.2}/playground/genric_graph.graphql +0 -0
  74. {graphinate-0.3.0 → graphinate-0.3.2}/playground/graphql.config.yml +0 -0
  75. {graphinate-0.3.0 → graphinate-0.3.2}/playground/house_of_graphs.py +0 -0
  76. {graphinate-0.3.0 → graphinate-0.3.2}/playground/social/albums.json +0 -0
  77. {graphinate-0.3.0 → graphinate-0.3.2}/playground/social/musicisians.py +0 -0
  78. {graphinate-0.3.0 → graphinate-0.3.2}/playground/text/nlp_graph.py +0 -0
  79. {graphinate-0.3.0 → graphinate-0.3.2}/playground/text/requirements.txt +0 -0
  80. {graphinate-0.3.0 → graphinate-0.3.2}/playground/time_series/requirements.txt +0 -0
  81. {graphinate-0.3.0 → graphinate-0.3.2}/playground/time_series/visibility_graph.py +0 -0
  82. {graphinate-0.3.0 → graphinate-0.3.2}/sonar-project.properties +0 -0
  83. {graphinate-0.3.0 → graphinate-0.3.2}/src/graphinate/__main__.py +0 -0
  84. {graphinate-0.3.0 → graphinate-0.3.2}/src/graphinate/cli.py +0 -0
  85. {graphinate-0.3.0 → graphinate-0.3.2}/src/graphinate/materializers/matplotlib.py +0 -0
  86. {graphinate-0.3.0 → graphinate-0.3.2}/src/graphinate/server/__init__.py +0 -0
  87. {graphinate-0.3.0 → graphinate-0.3.2}/src/graphinate/server/starlette/__init__.py +0 -0
  88. {graphinate-0.3.0 → graphinate-0.3.2}/src/graphinate/server/starlette/views.py +0 -0
  89. {graphinate-0.3.0 → graphinate-0.3.2}/src/graphinate/server/web/__init__.py +0 -0
  90. {graphinate-0.3.0 → graphinate-0.3.2}/src/graphinate/server/web/elements/__init__.py +0 -0
  91. {graphinate-0.3.0 → graphinate-0.3.2}/src/graphinate/server/web/elements/index.html +0 -0
  92. {graphinate-0.3.0 → graphinate-0.3.2}/src/graphinate/server/web/graphiql/__init__.py +0 -0
  93. {graphinate-0.3.0 → graphinate-0.3.2}/src/graphinate/server/web/graphiql/index.html +0 -0
  94. {graphinate-0.3.0 → graphinate-0.3.2}/src/graphinate/server/web/rapidoc/__init__.py +0 -0
  95. {graphinate-0.3.0 → graphinate-0.3.2}/src/graphinate/server/web/rapidoc/index.html +0 -0
  96. {graphinate-0.3.0 → graphinate-0.3.2}/src/graphinate/server/web/static/images/logo-128.png +0 -0
  97. {graphinate-0.3.0 → graphinate-0.3.2}/src/graphinate/server/web/static/images/network_graph.png +0 -0
  98. {graphinate-0.3.0 → graphinate-0.3.2}/src/graphinate/server/web/viewer/__init__.py +0 -0
  99. {graphinate-0.3.0 → graphinate-0.3.2}/src/graphinate/server/web/voyager/__init__.py +0 -0
  100. {graphinate-0.3.0 → graphinate-0.3.2}/src/graphinate/server/web/voyager/index.html +0 -0
  101. {graphinate-0.3.0 → graphinate-0.3.2}/src/graphinate/tools/__init__.py +0 -0
  102. {graphinate-0.3.0 → graphinate-0.3.2}/src/graphinate/tools/converters.py +0 -0
  103. {graphinate-0.3.0 → graphinate-0.3.2}/tests/graphinate/test_tools.py +0 -0
@@ -15,7 +15,8 @@ jobs:
15
15
  strategy:
16
16
  fail-fast: false
17
17
  matrix:
18
- python-version: [ "3.13.0a1" ]
18
+ # https://github.com/actions/python-versions/blob/main/versions-manifest.json
19
+ python-version: [ "3.14.0-alpha.2" ]
19
20
  steps:
20
21
  - uses: actions/checkout@v4
21
22
  - name: Set up Python ${{ matrix.python-version }}
@@ -15,7 +15,7 @@ jobs:
15
15
  strategy:
16
16
  fail-fast: false
17
17
  matrix:
18
- python-version: [ "3.10", "3.11", "3.12" ]
18
+ python-version: [ "3.10", "3.11", "3.12", "3.13"]
19
19
  steps:
20
20
  - uses: actions/checkout@v4
21
21
  - name: Set up Python ${{ matrix.python-version }}
@@ -43,3 +43,12 @@ jobs:
43
43
  uses: codecov/codecov-action@v4
44
44
  with:
45
45
  token: ${{ secrets.CODECOV_TOKEN }}
46
+ - name: Run codacy-coverage-reporter
47
+ uses: codacy/codacy-coverage-reporter-action@v1.3.0
48
+ with:
49
+ #project-token: ${{ secrets.CODACY_PROJECT_TOKEN }}
50
+ # or
51
+ api-token: ${{ secrets.CODACY_API_TOKEN }}
52
+ coverage-reports: coverage.xml
53
+ # or a comma-separated list for multiple reports
54
+ # coverage-reports: <PATH_TO_REPORT>, <PATH_TO_REPORT>
@@ -781,3 +781,4 @@ cython_debug/
781
781
  # option (not recommended) you can uncomment the following to ignore the entire idea folder.
782
782
  #.idea/
783
783
 
784
+ /.idea/**
@@ -0,0 +1,15 @@
1
+ # Path to sources
2
+ #sonar.sources=.
3
+ #sonar.exclusions=
4
+ #sonar.inclusions=
5
+
6
+ # Path to tests
7
+ #sonar.tests=
8
+ #sonar.test.exclusions=
9
+ #sonar.test.inclusions=
10
+
11
+ # Source encoding
12
+ #sonar.sourceEncoding=UTF-8
13
+
14
+ # Exclusions for copy-paste detection
15
+ #sonar.cpd.exclusions=
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.3
1
+ Metadata-Version: 2.4
2
2
  Name: Graphinate
3
- Version: 0.3.0
3
+ Version: 0.3.2
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
@@ -21,17 +21,18 @@ Classifier: Programming Language :: Python :: 3 :: Only
21
21
  Classifier: Programming Language :: Python :: 3.10
22
22
  Classifier: Programming Language :: Python :: 3.11
23
23
  Classifier: Programming Language :: Python :: 3.12
24
+ Classifier: Programming Language :: Python :: 3.13
24
25
  Classifier: Programming Language :: Python :: Implementation :: CPython
25
26
  Classifier: Topic :: Scientific/Engineering
26
27
  Classifier: Topic :: Software Development :: Libraries
27
28
  Classifier: Typing :: Typed
28
29
  Requires-Python: >=3.10
29
- Requires-Dist: click>=8.1.7
30
- Requires-Dist: inflect>=7.3.0
31
- Requires-Dist: loguru>=0.7.2
32
- Requires-Dist: matplotlib>=3.9.0
33
- Requires-Dist: networkx>=3.3
34
- Requires-Dist: strawberry-graphql[asgi,opentelemetry]>=0.235.1
30
+ Requires-Dist: click
31
+ Requires-Dist: inflect
32
+ Requires-Dist: loguru
33
+ Requires-Dist: matplotlib
34
+ Requires-Dist: networkx
35
+ Requires-Dist: strawberry-graphql[asgi,opentelemetry]
35
36
  Provides-Extra: dev
36
37
  Requires-Dist: pipdeptree; extra == 'dev'
37
38
  Requires-Dist: ruff; extra == 'dev'
@@ -44,17 +45,17 @@ Requires-Dist: mkdocs-material; extra == 'docs'
44
45
  Requires-Dist: mkdocs-section-index; extra == 'docs'
45
46
  Requires-Dist: mkdocstrings-python; extra == 'docs'
46
47
  Provides-Extra: plot
47
- Requires-Dist: scipy>=1.14.0; extra == 'plot'
48
+ Requires-Dist: scipy; extra == 'plot'
48
49
  Provides-Extra: server
49
50
  Requires-Dist: starlette-prometheus; extra == 'server'
50
- Requires-Dist: uvicorn[standard]>=0.30.1; extra == 'server'
51
+ Requires-Dist: uvicorn[standard]; extra == 'server'
51
52
  Provides-Extra: test
52
- Requires-Dist: faker>=23.2.1; extra == 'test'
53
- Requires-Dist: pytest-asyncio>=0.23.7; extra == 'test'
54
- Requires-Dist: pytest-cov>=5.0.0; extra == 'test'
55
- Requires-Dist: pytest-randomly>=3.15.0; extra == 'test'
56
- Requires-Dist: pytest-xdist>=3.6.1; extra == 'test'
57
- Requires-Dist: pytest>=8.2.2; extra == 'test'
53
+ Requires-Dist: faker; extra == 'test'
54
+ Requires-Dist: pytest; extra == 'test'
55
+ Requires-Dist: pytest-asyncio; extra == 'test'
56
+ Requires-Dist: pytest-cov; extra == 'test'
57
+ Requires-Dist: pytest-randomly; extra == 'test'
58
+ Requires-Dist: pytest-xdist; extra == 'test'
58
59
  Description-Content-Type: text/markdown
59
60
 
60
61
  # [Graphinate. Data to Graphs.](https://erivlis.github.io/graphinate/)
@@ -65,31 +66,38 @@ Description-Content-Type: text/markdown
65
66
  <tr style="vertical-align: middle;">
66
67
  <td>Package</td>
67
68
  <td>
68
- <img alt="PyPI - version" src="https://img.shields.io/pypi/v/graphinate">
69
- <img alt="PyPI - Status" src="https://img.shields.io/pypi/status/graphinate">
70
- <img alt="PyPI - Python Version" src="https://img.shields.io/pypi/pyversions/graphinate">
71
- <img alt="PyPI - Downloads" src="https://img.shields.io/pypi/dd/graphinate">
72
- <br>
69
+ <img alt="PyPI - version" src="https://img.shields.io/pypi/v/graphinate.svg?logo=pypi&logoColor=lightblue">
70
+ <img alt="PyPI - Status" src="https://img.shields.io/pypi/status/graphinate.svg?logo=pypi&logoColor=lightblue">
71
+ <img alt="PyPI - Python Version" src="https://img.shields.io/pypi/pyversions/graphinate.svg?logo=python&label=Python&logoColor=lightblue">
72
+ <img alt="PyPI - Downloads" src="https://img.shields.io/pypi/dd/graphinate.svg?logo=pypi&logoColor=lightblue">
73
+ <img alt="Libraries.io SourceRank" src="https://img.shields.io/librariesio/sourcerank/pypi/Graphinate.svg?logo=Libraries.io&label=SourceRank">
74
+ </td>
75
+ </tr>
76
+ <tr>
77
+ <td>Code</td>
78
+ <td>
73
79
  <img alt="GitHub" src="https://img.shields.io/github/license/erivlis/graphinate">
74
- <img alt="GitHub repo size" src="https://img.shields.io/github/repo-size/erivlis/graphinate">
75
- <img alt="GitHub last commit (by committer)" src="https://img.shields.io/github/last-commit/erivlis/graphinate">
76
- <a href="https://github.com/erivlis/graphinate/graphs/contributors"><img alt="Contributors" src="https://img.shields.io/github/contributors/erivlis/graphinate.svg"></a>
80
+ <img alt="GitHub repo size" src="https://img.shields.io/github/repo-size/erivlis/graphinate.svg?label=Size&logo=git">
81
+ <img alt="GitHub last commit (by committer)" src="https://img.shields.io/github/last-commit/erivlis/graphinate.svg?&logo=git">
82
+ <a href="https://github.com/erivlis/graphinate/graphs/contributors"><img alt="Contributors" src="https://img.shields.io/github/contributors/erivlis/graphinate.svg?&logo=git"></a>
77
83
  </td>
78
84
  </tr>
79
85
  <tr>
80
86
  <td>Tools</td>
81
87
  <td>
82
88
  <a href="https://www.jetbrains.com/pycharm/"><img alt="PyCharm" src="https://img.shields.io/badge/PyCharm-FCF84A.svg?logo=PyCharm&logoColor=black&labelColor=21D789&color=FCF84A"></a>
83
- <a href="https://github.com/astral-sh/ruff"><img src="https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json" alt="Ruff" style="max-width:100%;"></a>
84
- <a href="https://github.com/astral-sh/uv"><img src="https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/uv/main/assets/badge/v0.json" alt="uv" style="max-width:100%;"></a>
85
- <a href="https://squidfunk.github.io/mkdocs-material/"><img src="https://img.shields.io/badge/Material_for_MkDocs-526CFE?&logo=MaterialForMkDocs&logoColor=white&labelColor=grey"></a>
86
- <a href="https://github.com/tox-dev/pipdeptree"><img 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>
89
+ <a href="https://github.com/astral-sh/uv"><img alt="uv" src="https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/uv/main/assets/badge/v0.json" style="max-width:100%;"></a>
90
+ <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>
91
+ <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>
92
+ <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>
93
+ <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>
87
94
  </td>
88
95
  </tr>
89
96
  <tr>
90
97
  <td>CI/CD</td>
91
98
  <td>
92
99
  <a href="https://github.com/erivlis/graphinate/actions/workflows/test.yml"><img alt="Tests" src="https://github.com/erivlis/graphinate/actions/workflows/test.yml/badge.svg?branch=master"></a>
100
+ <a href="https://github.com/erivlis/graphinate/actions/workflows/test.yml"><img alt="Tests" src="https://github.com/erivlis/graphinate/actions/workflows/test-beta.yml/badge.svg?branch=master"></a>
93
101
  <a href="https://github.com/erivlis/graphinate/actions/workflows/publish.yml"><img alt="Publish" src="https://github.com/erivlis/graphinate/actions/workflows/publish.yml/badge.svg"></a>
94
102
  <a href="https://github.com/erivlis/graphinate/actions/workflows/publish-docs.yaml"><img alt="Publish Docs" src="https://github.com/erivlis/graphinate/actions/workflows/publish-docs.yaml/badge.svg"></a>
95
103
  </td>
@@ -98,19 +106,18 @@ Description-Content-Type: text/markdown
98
106
  <td>Scans</td>
99
107
  <td>
100
108
  <a href="https://codecov.io/gh/erivlis/graphinate"><img alt="Coverage" src="https://codecov.io/gh/erivlis/graphinate/graph/badge.svg?token=POODT8M9NV"/></a>
101
- <br>
102
109
  <a href="https://sonarcloud.io/summary/new_code?id=erivlis_graphinate"><img alt="Quality Gate Status" src="https://sonarcloud.io/api/project_badges/measure?project=erivlis_graphinate&metric=alert_status"></a>
103
110
  <a href="https://sonarcloud.io/summary/new_code?id=erivlis_graphinate"><img alt="Security Rating" src="https://sonarcloud.io/api/project_badges/measure?project=erivlis_graphinate&metric=security_rating"></a>
104
111
  <a href="https://sonarcloud.io/summary/new_code?id=erivlis_graphinate"><img alt="Maintainability Rating" src="https://sonarcloud.io/api/project_badges/measure?project=erivlis_graphinate&metric=sqale_rating"></a>
105
112
  <a href="https://sonarcloud.io/summary/new_code?id=erivlis_graphinate"><img alt="Reliability Rating" src="https://sonarcloud.io/api/project_badges/measure?project=erivlis_graphinate&metric=reliability_rating"></a>
106
- <br>
107
113
  <a href="https://sonarcloud.io/summary/new_code?id=erivlis_graphinate"><img alt="Lines of Code" src="https://sonarcloud.io/api/project_badges/measure?project=erivlis_graphinate&metric=ncloc"></a>
108
114
  <a href="https://sonarcloud.io/summary/new_code?id=erivlis_graphinate"><img alt="Vulnerabilities" src="https://sonarcloud.io/api/project_badges/measure?project=erivlis_graphinate&metric=vulnerabilities"></a>
109
115
  <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>
110
- <br>
111
116
  <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>
117
+ <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>
112
118
  <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>
113
- <!--a href="https://snyk.io/test/github/erivlis/graphinate"><img alt="Snyk" src="https://snyk.io/test/github/erivlis/Graphinate/badge.svg"></a -->
119
+ <a href="https://www.codefactor.io/repository/github/erivlis/graphinate"><img src="https://www.codefactor.io/repository/github/erivlis/graphinate/badge" alt="CodeFactor" /></a>
120
+ <a href="https://snyk.io/test/github/erivlis/graphinate"><img alt="Snyk" src="https://snyk.io/test/github/erivlis/Graphinate/badge.svg"></a>
114
121
  </td>
115
122
  </tr>
116
123
  </table>
@@ -132,9 +139,9 @@ In addition, there are several modes of output to enable examination of the Grap
132
139
 
133
140
  ### Links
134
141
 
135
- - Website (including documentation): https://erivlis.github.io/graphinate
136
- - Source: https://github.com/erivlis/graphinate
137
- - Package: https://pypi.org/project/graphinate
142
+ - Website (including documentation): <https://erivlis.github.io/graphinate>
143
+ - Source: <https://github.com/erivlis/graphinate>
144
+ - Package: <https://pypi.org/project/graphinate>
138
145
 
139
146
  ## Quick Start
140
147
 
@@ -177,11 +184,15 @@ def edge():
177
184
  graphinate.materialize(graph_model)
178
185
  ```
179
186
 
187
+ #### `graphinate.model` function
188
+
180
189
  > [!NOTE]
181
- > ### `graphinate.model` function
182
190
  > This function creates `GraphModel` class that is used to declaratively register _Edge_ and/or _Node_ data
183
191
  > supplier functions by using the `GraphModel.node()` and `GraphModel.edge()` decorators.
184
- > ### `graphinate.materialize` function
192
+
193
+ #### `graphinate.materialize` function
194
+
195
+ > [!NOTE]
185
196
  > This function can be used to easily generate an output from a `GraphModel` instance.
186
197
  > By default, it will prompt the user to choose the output format, using a popup GUI dialog box.
187
198
 
@@ -189,7 +200,7 @@ graphinate.materialize(graph_model)
189
200
 
190
201
  ### Commands
191
202
 
192
- ```
203
+ ```text
193
204
  Usage: python -m graphinate [OPTIONS] COMMAND [ARGS]...
194
205
 
195
206
  Options:
@@ -202,7 +213,7 @@ Commands:
202
213
 
203
214
  #### Save
204
215
 
205
- ```
216
+ ```text
206
217
  Usage: python -m graphinate save [OPTIONS]
207
218
 
208
219
  Options:
@@ -215,7 +226,7 @@ Options:
215
226
 
216
227
  #### Server
217
228
 
218
- ```
229
+ ```text
219
230
  Usage: python -m graphinate server [OPTIONS]
220
231
 
221
232
  Options:
@@ -311,7 +322,7 @@ python -m mkdocs build
311
322
 
312
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>
313
324
 
314
- ------
325
+ ---------------------
315
326
 
316
327
  <img alt="Star Chart" src="https://forthebadge.com/images/badges/works-on-my-machine.svg">
317
328
 
@@ -6,31 +6,38 @@
6
6
  <tr style="vertical-align: middle;">
7
7
  <td>Package</td>
8
8
  <td>
9
- <img alt="PyPI - version" src="https://img.shields.io/pypi/v/graphinate">
10
- <img alt="PyPI - Status" src="https://img.shields.io/pypi/status/graphinate">
11
- <img alt="PyPI - Python Version" src="https://img.shields.io/pypi/pyversions/graphinate">
12
- <img alt="PyPI - Downloads" src="https://img.shields.io/pypi/dd/graphinate">
13
- <br>
9
+ <img alt="PyPI - version" src="https://img.shields.io/pypi/v/graphinate.svg?logo=pypi&logoColor=lightblue">
10
+ <img alt="PyPI - Status" src="https://img.shields.io/pypi/status/graphinate.svg?logo=pypi&logoColor=lightblue">
11
+ <img alt="PyPI - Python Version" src="https://img.shields.io/pypi/pyversions/graphinate.svg?logo=python&label=Python&logoColor=lightblue">
12
+ <img alt="PyPI - Downloads" src="https://img.shields.io/pypi/dd/graphinate.svg?logo=pypi&logoColor=lightblue">
13
+ <img alt="Libraries.io SourceRank" src="https://img.shields.io/librariesio/sourcerank/pypi/Graphinate.svg?logo=Libraries.io&label=SourceRank">
14
+ </td>
15
+ </tr>
16
+ <tr>
17
+ <td>Code</td>
18
+ <td>
14
19
  <img alt="GitHub" src="https://img.shields.io/github/license/erivlis/graphinate">
15
- <img alt="GitHub repo size" src="https://img.shields.io/github/repo-size/erivlis/graphinate">
16
- <img alt="GitHub last commit (by committer)" src="https://img.shields.io/github/last-commit/erivlis/graphinate">
17
- <a href="https://github.com/erivlis/graphinate/graphs/contributors"><img alt="Contributors" src="https://img.shields.io/github/contributors/erivlis/graphinate.svg"></a>
20
+ <img alt="GitHub repo size" src="https://img.shields.io/github/repo-size/erivlis/graphinate.svg?label=Size&logo=git">
21
+ <img alt="GitHub last commit (by committer)" src="https://img.shields.io/github/last-commit/erivlis/graphinate.svg?&logo=git">
22
+ <a href="https://github.com/erivlis/graphinate/graphs/contributors"><img alt="Contributors" src="https://img.shields.io/github/contributors/erivlis/graphinate.svg?&logo=git"></a>
18
23
  </td>
19
24
  </tr>
20
25
  <tr>
21
26
  <td>Tools</td>
22
27
  <td>
23
28
  <a href="https://www.jetbrains.com/pycharm/"><img alt="PyCharm" src="https://img.shields.io/badge/PyCharm-FCF84A.svg?logo=PyCharm&logoColor=black&labelColor=21D789&color=FCF84A"></a>
24
- <a href="https://github.com/astral-sh/ruff"><img src="https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json" alt="Ruff" style="max-width:100%;"></a>
25
- <a href="https://github.com/astral-sh/uv"><img src="https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/uv/main/assets/badge/v0.json" alt="uv" style="max-width:100%;"></a>
26
- <a href="https://squidfunk.github.io/mkdocs-material/"><img src="https://img.shields.io/badge/Material_for_MkDocs-526CFE?&logo=MaterialForMkDocs&logoColor=white&labelColor=grey"></a>
27
- <a href="https://github.com/tox-dev/pipdeptree"><img 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>
29
+ <a href="https://github.com/astral-sh/uv"><img alt="uv" src="https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/uv/main/assets/badge/v0.json" style="max-width:100%;"></a>
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
+ <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
+ <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://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>
28
34
  </td>
29
35
  </tr>
30
36
  <tr>
31
37
  <td>CI/CD</td>
32
38
  <td>
33
39
  <a href="https://github.com/erivlis/graphinate/actions/workflows/test.yml"><img alt="Tests" src="https://github.com/erivlis/graphinate/actions/workflows/test.yml/badge.svg?branch=master"></a>
40
+ <a href="https://github.com/erivlis/graphinate/actions/workflows/test.yml"><img alt="Tests" src="https://github.com/erivlis/graphinate/actions/workflows/test-beta.yml/badge.svg?branch=master"></a>
34
41
  <a href="https://github.com/erivlis/graphinate/actions/workflows/publish.yml"><img alt="Publish" src="https://github.com/erivlis/graphinate/actions/workflows/publish.yml/badge.svg"></a>
35
42
  <a href="https://github.com/erivlis/graphinate/actions/workflows/publish-docs.yaml"><img alt="Publish Docs" src="https://github.com/erivlis/graphinate/actions/workflows/publish-docs.yaml/badge.svg"></a>
36
43
  </td>
@@ -39,19 +46,18 @@
39
46
  <td>Scans</td>
40
47
  <td>
41
48
  <a href="https://codecov.io/gh/erivlis/graphinate"><img alt="Coverage" src="https://codecov.io/gh/erivlis/graphinate/graph/badge.svg?token=POODT8M9NV"/></a>
42
- <br>
43
49
  <a href="https://sonarcloud.io/summary/new_code?id=erivlis_graphinate"><img alt="Quality Gate Status" src="https://sonarcloud.io/api/project_badges/measure?project=erivlis_graphinate&metric=alert_status"></a>
44
50
  <a href="https://sonarcloud.io/summary/new_code?id=erivlis_graphinate"><img alt="Security Rating" src="https://sonarcloud.io/api/project_badges/measure?project=erivlis_graphinate&metric=security_rating"></a>
45
51
  <a href="https://sonarcloud.io/summary/new_code?id=erivlis_graphinate"><img alt="Maintainability Rating" src="https://sonarcloud.io/api/project_badges/measure?project=erivlis_graphinate&metric=sqale_rating"></a>
46
52
  <a href="https://sonarcloud.io/summary/new_code?id=erivlis_graphinate"><img alt="Reliability Rating" src="https://sonarcloud.io/api/project_badges/measure?project=erivlis_graphinate&metric=reliability_rating"></a>
47
- <br>
48
53
  <a href="https://sonarcloud.io/summary/new_code?id=erivlis_graphinate"><img alt="Lines of Code" src="https://sonarcloud.io/api/project_badges/measure?project=erivlis_graphinate&metric=ncloc"></a>
49
54
  <a href="https://sonarcloud.io/summary/new_code?id=erivlis_graphinate"><img alt="Vulnerabilities" src="https://sonarcloud.io/api/project_badges/measure?project=erivlis_graphinate&metric=vulnerabilities"></a>
50
55
  <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>
51
- <br>
52
56
  <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
+ <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>
53
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>
54
- <!--a href="https://snyk.io/test/github/erivlis/graphinate"><img alt="Snyk" src="https://snyk.io/test/github/erivlis/Graphinate/badge.svg"></a -->
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://snyk.io/test/github/erivlis/graphinate"><img alt="Snyk" src="https://snyk.io/test/github/erivlis/Graphinate/badge.svg"></a>
55
61
  </td>
56
62
  </tr>
57
63
  </table>
@@ -73,9 +79,9 @@ In addition, there are several modes of output to enable examination of the Grap
73
79
 
74
80
  ### Links
75
81
 
76
- - Website (including documentation): https://erivlis.github.io/graphinate
77
- - Source: https://github.com/erivlis/graphinate
78
- - Package: https://pypi.org/project/graphinate
82
+ - Website (including documentation): <https://erivlis.github.io/graphinate>
83
+ - Source: <https://github.com/erivlis/graphinate>
84
+ - Package: <https://pypi.org/project/graphinate>
79
85
 
80
86
  ## Quick Start
81
87
 
@@ -118,11 +124,15 @@ def edge():
118
124
  graphinate.materialize(graph_model)
119
125
  ```
120
126
 
127
+ #### `graphinate.model` function
128
+
121
129
  > [!NOTE]
122
- > ### `graphinate.model` function
123
130
  > This function creates `GraphModel` class that is used to declaratively register _Edge_ and/or _Node_ data
124
131
  > supplier functions by using the `GraphModel.node()` and `GraphModel.edge()` decorators.
125
- > ### `graphinate.materialize` function
132
+
133
+ #### `graphinate.materialize` function
134
+
135
+ > [!NOTE]
126
136
  > This function can be used to easily generate an output from a `GraphModel` instance.
127
137
  > By default, it will prompt the user to choose the output format, using a popup GUI dialog box.
128
138
 
@@ -130,7 +140,7 @@ graphinate.materialize(graph_model)
130
140
 
131
141
  ### Commands
132
142
 
133
- ```
143
+ ```text
134
144
  Usage: python -m graphinate [OPTIONS] COMMAND [ARGS]...
135
145
 
136
146
  Options:
@@ -143,7 +153,7 @@ Commands:
143
153
 
144
154
  #### Save
145
155
 
146
- ```
156
+ ```text
147
157
  Usage: python -m graphinate save [OPTIONS]
148
158
 
149
159
  Options:
@@ -156,7 +166,7 @@ Options:
156
166
 
157
167
  #### Server
158
168
 
159
- ```
169
+ ```text
160
170
  Usage: python -m graphinate server [OPTIONS]
161
171
 
162
172
  Options:
@@ -252,7 +262,7 @@ python -m mkdocs build
252
262
 
253
263
  <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>
254
264
 
255
- ------
265
+ ---------------------
256
266
 
257
267
  <img alt="Star Chart" src="https://forthebadge.com/images/badges/works-on-my-machine.svg">
258
268
 
@@ -7,6 +7,12 @@
7
7
 
8
8
  ## Repos
9
9
 
10
- ### Graphinate Stars
10
+ ### Graphinate
11
11
 
12
12
  <img alt="Graphinate Star Chart" src="https://starchart.cc/erivlis/graphinate.svg">
13
+
14
+ https://starchart.cc/erivlis/graphinate.svg
15
+
16
+ ### MappingTools
17
+
18
+ <img alt="MappingTools Star Chart" src="https://starchart.cc/erivlis/mappingtools.svg">
@@ -25,4 +25,4 @@
25
25
 
26
26
  ## IDE
27
27
 
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>
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>
@@ -49,6 +49,7 @@
49
49
  <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>
50
50
  <br>
51
51
  <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>
52
+ <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>
52
53
  <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>
53
54
  </td>
54
55
  </tr>
@@ -0,0 +1,2 @@
1
+ graphinate
2
+ pipdeptree
@@ -0,0 +1,2 @@
1
+ graphinate
2
+ PyGithub
@@ -1,8 +1,8 @@
1
1
  import itertools
2
2
 
3
3
  import graphinate
4
- import graphinate.tools.gui
5
4
  import networkx as nx
5
+ from graphinate.tools.gui import listbox_chooser
6
6
 
7
7
 
8
8
  def cylinder_edges(circumference: int, length: int):
@@ -820,7 +820,9 @@ def models(iterable):
820
820
  model = next(models(atlas().items()))
821
821
 
822
822
  if __name__ == '__main__':
823
- choices = graphinate.tools.gui.modal_listbox_chooser('Choose Graph', atlas())
823
+ # choices = graphinate.tools.gui.modal_listbox_chooser('Choose Graph', atlas())
824
+
825
+ choices = listbox_chooser('Choose Graph', atlas())
824
826
 
825
827
  for model in models(choices):
826
828
  graphinate.materialize(model)
@@ -2,34 +2,37 @@ import graphinate
2
2
  import graphinate.modeling
3
3
  import networkx as nx
4
4
 
5
- N: int = 8
6
5
 
6
+ def polygonal_graph_edges(edges_count: int):
7
+ for i in range(1, edges_count):
8
+ yield {'source': i, 'target': i + 1}
9
+ yield {'source': edges_count, 'target': 1}
7
10
 
8
- def polygonal_graph_model(number_of_sides: int = N):
11
+
12
+ def polygonal_graph_model(name: str, number_of_sides: int) -> graphinate.GraphModel:
9
13
  """
10
14
  Create a polygonal graph model.
11
15
 
12
16
  Args:
13
- number_of_sides (int): Number of sides in the polygon. Defaults to N.
17
+ name (str): The Graph's name.
18
+ number_of_sides (int): Number of sides in the polygon.
14
19
 
15
20
  Returns:
16
21
  GraphModel: A graph model representing a polygonal graph.
17
22
  """
18
23
 
19
24
  # Define GraphModel
20
- graph_model = graphinate.model(name="Octagonal Graph")
25
+ graph_model = graphinate.model(name)
21
26
 
22
27
  # Register edges supplier function
23
28
  @graph_model.edge()
24
29
  def edge():
25
- for i in range(number_of_sides - 1):
26
- yield {'source': i, 'target': i + 1}
27
- yield {'source': number_of_sides - 1, 'target': 0}
30
+ yield from polygonal_graph_edges(number_of_sides)
28
31
 
29
32
  return graph_model
30
33
 
31
34
 
32
- model = polygonal_graph_model()
35
+ model = polygonal_graph_model("Octagonal Graph", 8)
33
36
 
34
37
  if __name__ == '__main__':
35
38
  use_materialize = True
@@ -0,0 +1,2 @@
1
+ graphinate
2
+ psutil
@@ -0,0 +1,4 @@
1
+ beautifulsoup4
2
+ loguru
3
+ lxml
4
+ requests
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "Graphinate"
3
- version = "0.3.0"
3
+ version = "0.3.2"
4
4
  authors = [
5
5
  { name = "Eran Rivlis", email = "eran@rivlis.info" },
6
6
  ]
@@ -16,6 +16,7 @@ classifiers = [
16
16
  "Programming Language :: Python :: 3.10",
17
17
  "Programming Language :: Python :: 3.11",
18
18
  "Programming Language :: Python :: 3.12",
19
+ "Programming Language :: Python :: 3.13",
19
20
  "Programming Language :: Python :: 3 :: Only",
20
21
  "Programming Language :: Python :: Implementation :: CPython",
21
22
  "License :: OSI Approved :: GNU Lesser General Public License v3 or later (LGPLv3+)",
@@ -27,12 +28,12 @@ classifiers = [
27
28
  ]
28
29
  keywords = ['graph', 'declarative']
29
30
  dependencies = [
30
- "click>=8.1.7",
31
- "inflect>=7.3.0",
32
- "loguru>=0.7.2",
33
- "matplotlib>=3.9.0",
34
- "networkx>=3.3",
35
- "strawberry-graphql[asgi,opentelemetry]>=0.235.1"
31
+ "click",
32
+ "inflect",
33
+ "loguru",
34
+ "matplotlib",
35
+ "networkx",
36
+ "strawberry-graphql[asgi,opentelemetry]"
36
37
  ]
37
38
 
38
39
 
@@ -58,19 +59,19 @@ docs = [
58
59
  "mkdocs-section-index",
59
60
  ]
60
61
  test = [
61
- "faker>=23.2.1",
62
- "pytest>=8.2.2",
63
- "pytest-asyncio>=0.23.7",
64
- "pytest-cov>=5.0.0",
65
- "pytest-randomly>=3.15.0",
66
- "pytest-xdist>=3.6.1"
62
+ "faker",
63
+ "pytest",
64
+ "pytest-asyncio",
65
+ "pytest-cov",
66
+ "pytest-randomly",
67
+ "pytest-xdist"
67
68
  ]
68
69
  plot = [
69
- "scipy>=1.14.0"
70
+ "scipy"
70
71
  ]
71
72
  server = [
72
73
  "starlette-prometheus",
73
- "uvicorn[standard]>=0.30.1"
74
+ "uvicorn[standard]"
74
75
  ]
75
76
 
76
77
 
@@ -78,16 +79,19 @@ server = [
78
79
  requires = ["hatchling"]
79
80
  build-backend = "hatchling.build"
80
81
 
81
-
82
82
  [tool.hatch.metadata]
83
83
  allow-direct-references = true
84
84
 
85
+ [tool.hatch.envs.default]
86
+ installer = "uv"
87
+
88
+ #[tool.hatch.build.targets.wheel]
89
+ #packages = ["src/graphinate"]
85
90
 
86
91
  [tool.pytest.ini_options]
87
92
  pythonpath = ["src"]
88
93
  testpaths = ["tests"]
89
94
 
90
-
91
95
  [tool.coverage.report]
92
96
  exclude_also = [
93
97
  "...",
@@ -128,7 +132,7 @@ select = [
128
132
  "TRY",
129
133
  "RUF",
130
134
  ]
131
- ignore = ["F401", "TRY003"]
135
+ ignore = ["TRY003", "UP007", "UP038", "RUF100"]
132
136
  # Exclude a variety of commonly ignored directories.
133
137
  exclude = [
134
138
  ".bzr",