fastapi-voyager 0.6.1__tar.gz → 0.6.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 (47) hide show
  1. {fastapi_voyager-0.6.1 → fastapi_voyager-0.6.2}/PKG-INFO +8 -8
  2. {fastapi_voyager-0.6.1 → fastapi_voyager-0.6.2}/README.md +7 -7
  3. {fastapi_voyager-0.6.1 → fastapi_voyager-0.6.2}/src/fastapi_voyager/type_helper.py +23 -2
  4. {fastapi_voyager-0.6.1 → fastapi_voyager-0.6.2}/src/fastapi_voyager/version.py +1 -1
  5. {fastapi_voyager-0.6.1 → fastapi_voyager-0.6.2}/tests/demo.py +3 -1
  6. fastapi_voyager-0.6.2/tests/test_generic.py +20 -0
  7. {fastapi_voyager-0.6.1 → fastapi_voyager-0.6.2}/.gitignore +0 -0
  8. {fastapi_voyager-0.6.1 → fastapi_voyager-0.6.2}/.python-version +0 -0
  9. {fastapi_voyager-0.6.1 → fastapi_voyager-0.6.2}/LICENSE +0 -0
  10. {fastapi_voyager-0.6.1 → fastapi_voyager-0.6.2}/pyproject.toml +0 -0
  11. {fastapi_voyager-0.6.1 → fastapi_voyager-0.6.2}/src/fastapi_voyager/__init__.py +0 -0
  12. {fastapi_voyager-0.6.1 → fastapi_voyager-0.6.2}/src/fastapi_voyager/cli.py +0 -0
  13. {fastapi_voyager-0.6.1 → fastapi_voyager-0.6.2}/src/fastapi_voyager/filter.py +0 -0
  14. {fastapi_voyager-0.6.1 → fastapi_voyager-0.6.2}/src/fastapi_voyager/module.py +0 -0
  15. {fastapi_voyager-0.6.1 → fastapi_voyager-0.6.2}/src/fastapi_voyager/render.py +0 -0
  16. {fastapi_voyager-0.6.1 → fastapi_voyager-0.6.2}/src/fastapi_voyager/server.py +0 -0
  17. {fastapi_voyager-0.6.1 → fastapi_voyager-0.6.2}/src/fastapi_voyager/type.py +0 -0
  18. {fastapi_voyager-0.6.1 → fastapi_voyager-0.6.2}/src/fastapi_voyager/voyager.py +0 -0
  19. {fastapi_voyager-0.6.1 → fastapi_voyager-0.6.2}/src/fastapi_voyager/web/component/render-graph.js +0 -0
  20. {fastapi_voyager-0.6.1 → fastapi_voyager-0.6.2}/src/fastapi_voyager/web/component/route-code-display.js +0 -0
  21. {fastapi_voyager-0.6.1 → fastapi_voyager-0.6.2}/src/fastapi_voyager/web/component/schema-code-display.js +0 -0
  22. {fastapi_voyager-0.6.1 → fastapi_voyager-0.6.2}/src/fastapi_voyager/web/component/schema-field-filter.js +0 -0
  23. {fastapi_voyager-0.6.1 → fastapi_voyager-0.6.2}/src/fastapi_voyager/web/graph-ui.js +0 -0
  24. {fastapi_voyager-0.6.1 → fastapi_voyager-0.6.2}/src/fastapi_voyager/web/graphviz.svg.css +0 -0
  25. {fastapi_voyager-0.6.1 → fastapi_voyager-0.6.2}/src/fastapi_voyager/web/graphviz.svg.js +0 -0
  26. {fastapi_voyager-0.6.1 → fastapi_voyager-0.6.2}/src/fastapi_voyager/web/icon/android-chrome-192x192.png +0 -0
  27. {fastapi_voyager-0.6.1 → fastapi_voyager-0.6.2}/src/fastapi_voyager/web/icon/android-chrome-512x512.png +0 -0
  28. {fastapi_voyager-0.6.1 → fastapi_voyager-0.6.2}/src/fastapi_voyager/web/icon/apple-touch-icon.png +0 -0
  29. {fastapi_voyager-0.6.1 → fastapi_voyager-0.6.2}/src/fastapi_voyager/web/icon/favicon-16x16.png +0 -0
  30. {fastapi_voyager-0.6.1 → fastapi_voyager-0.6.2}/src/fastapi_voyager/web/icon/favicon-32x32.png +0 -0
  31. {fastapi_voyager-0.6.1 → fastapi_voyager-0.6.2}/src/fastapi_voyager/web/icon/favicon.ico +0 -0
  32. {fastapi_voyager-0.6.1 → fastapi_voyager-0.6.2}/src/fastapi_voyager/web/icon/site.webmanifest +0 -0
  33. {fastapi_voyager-0.6.1 → fastapi_voyager-0.6.2}/src/fastapi_voyager/web/index.html +0 -0
  34. {fastapi_voyager-0.6.1 → fastapi_voyager-0.6.2}/src/fastapi_voyager/web/quasar.min.css +0 -0
  35. {fastapi_voyager-0.6.1 → fastapi_voyager-0.6.2}/src/fastapi_voyager/web/quasar.min.js +0 -0
  36. {fastapi_voyager-0.6.1 → fastapi_voyager-0.6.2}/src/fastapi_voyager/web/vue-main.js +0 -0
  37. {fastapi_voyager-0.6.1 → fastapi_voyager-0.6.2}/tests/__init__.py +0 -0
  38. {fastapi_voyager-0.6.1 → fastapi_voyager-0.6.2}/tests/demo_anno.py +0 -0
  39. {fastapi_voyager-0.6.1 → fastapi_voyager-0.6.2}/tests/programatic.py +0 -0
  40. {fastapi_voyager-0.6.1 → fastapi_voyager-0.6.2}/tests/service/__init__.py +0 -0
  41. {fastapi_voyager-0.6.1 → fastapi_voyager-0.6.2}/tests/service/schema.py +0 -0
  42. {fastapi_voyager-0.6.1 → fastapi_voyager-0.6.2}/tests/test_analysis.py +0 -0
  43. {fastapi_voyager-0.6.1 → fastapi_voyager-0.6.2}/tests/test_import.py +0 -0
  44. {fastapi_voyager-0.6.1 → fastapi_voyager-0.6.2}/tests/test_module.py +0 -0
  45. {fastapi_voyager-0.6.1 → fastapi_voyager-0.6.2}/tests/test_type_helper.py +0 -0
  46. {fastapi_voyager-0.6.1 → fastapi_voyager-0.6.2}/uv.lock +0 -0
  47. {fastapi_voyager-0.6.1 → fastapi_voyager-0.6.2}/voyager.jpg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fastapi-voyager
3
- Version: 0.6.1
3
+ Version: 0.6.2
4
4
  Summary: Visualize FastAPI application's routing tree and dependencies
5
5
  Project-URL: Homepage, https://github.com/allmonday/fastapi-voyager
6
6
  Project-URL: Source, https://github.com/allmonday/fastapi-voyager
@@ -183,13 +183,7 @@ features
183
183
  - [ ] abstract render module
184
184
  - [ ] export voyager core data into json (for better debugging)
185
185
  - [ ] add api to rebuild core data from json, and render it
186
- - [ ] fix Generic case
187
-
188
- ```python
189
- class Paged(BaseModel, Generic[T]):
190
- total: int
191
- items: List[T]
192
- ```
186
+ - [x] fix Generic case `test_generic.py`
193
187
 
194
188
  bugs:
195
189
  - [ ] fix duplicated link from class and parent class, it also break clicking highlight
@@ -205,3 +199,9 @@ TODO: ...
205
199
 
206
200
  - https://apis.guru/graphql-voyager/, for inspiration.
207
201
  - https://github.com/tintinweb/vscode-interactive-graphviz, for web visualization.
202
+
203
+
204
+ ## Changelog
205
+
206
+ - 0.6.2:
207
+ - fix generic related issue
@@ -156,13 +156,7 @@ features
156
156
  - [ ] abstract render module
157
157
  - [ ] export voyager core data into json (for better debugging)
158
158
  - [ ] add api to rebuild core data from json, and render it
159
- - [ ] fix Generic case
160
-
161
- ```python
162
- class Paged(BaseModel, Generic[T]):
163
- total: int
164
- items: List[T]
165
- ```
159
+ - [x] fix Generic case `test_generic.py`
166
160
 
167
161
  bugs:
168
162
  - [ ] fix duplicated link from class and parent class, it also break clicking highlight
@@ -178,3 +172,9 @@ TODO: ...
178
172
 
179
173
  - https://apis.guru/graphql-voyager/, for inspiration.
180
174
  - https://github.com/tintinweb/vscode-interactive-graphviz, for web visualization.
175
+
176
+
177
+ ## Changelog
178
+
179
+ - 0.6.2:
180
+ - fix generic related issue
@@ -1,7 +1,7 @@
1
1
  import inspect
2
2
  import os
3
3
  from pydantic import BaseModel
4
- from typing import get_origin, get_args, Union, Annotated, Any, Type
4
+ from typing import get_origin, get_args, Union, Annotated, Any, Type, Generic
5
5
  from fastapi_voyager.type import FieldInfo
6
6
  from types import UnionType
7
7
  import pydantic_resolve.constant as const
@@ -142,7 +142,7 @@ def get_type_name(anno):
142
142
 
143
143
 
144
144
  def is_inheritance_of_pydantic_base(cls):
145
- return safe_issubclass(cls, BaseModel) and cls is not BaseModel
145
+ return safe_issubclass(cls, BaseModel) and cls is not BaseModel and not is_generic_container(cls)
146
146
 
147
147
 
148
148
  def get_bases_fields(schemas: list[type[BaseModel]]) -> set[str]:
@@ -256,6 +256,27 @@ def update_forward_refs(kls):
256
256
  if safe_issubclass(shelled_type, BaseModel):
257
257
  update_pydantic_forward_refs(shelled_type)
258
258
 
259
+
260
+ def is_generic_container(cls):
261
+ """
262
+ T = TypeVar('T')
263
+ class DataModel(BaseModel, Generic[T]):
264
+ data: T
265
+ id: int
266
+
267
+ type DataModelPageStory = DataModel[PageStory]
268
+
269
+ is_generic_container(DataModel) -> True
270
+ is_generic_container(DataModel[PageStory]) -> False
271
+
272
+ DataModel.__parameters__ == (T,)
273
+ DataModelPageStory.__parameters__ == (,)
274
+ """
275
+ try:
276
+ return (hasattr(cls, '__bases__') and Generic in cls.__bases__ and (hasattr(cls, '__parameters__') and bool(cls.__parameters__)))
277
+ except (TypeError, AttributeError):
278
+ return False
279
+
259
280
  if __name__ == "__main__":
260
281
  from tests.demo_anno import PageSprint, PageOverall
261
282
 
@@ -1,2 +1,2 @@
1
1
  __all__ = ["__version__"]
2
- __version__ = "0.6.1"
2
+ __version__ = "0.6.2"
@@ -69,6 +69,8 @@ class DataModel(BaseModel, Generic[T]):
69
69
  data: T
70
70
  id: int
71
71
 
72
- @app.get("/page_test_1/", tags=['for-page'], response_model=DataModel[PageStory])
72
+ type DataModelPageStory = DataModel[PageStory]
73
+
74
+ @app.get("/page_test_1/", tags=['for-page'], response_model=DataModelPageStory)
73
75
  def get_page_test_1():
74
76
  return {} # no implementation
@@ -0,0 +1,20 @@
1
+ from pydantic import BaseModel
2
+ from typing import Generic, TypeVar
3
+ from fastapi_voyager.type_helper import is_generic_container
4
+
5
+ class PageStory(BaseModel):
6
+ id: int
7
+ title: str
8
+
9
+ T = TypeVar('T')
10
+ class DataModel(BaseModel, Generic[T]):
11
+ data: T
12
+ id: int
13
+
14
+ type DataModelPageStory = DataModel[PageStory]
15
+
16
+ def test_is_generic_container():
17
+ print(DataModelPageStory.__value__.__bases__)
18
+ print(DataModelPageStory.__value__.model_fields.items())
19
+ assert is_generic_container(DataModel) is True
20
+ assert is_generic_container(DataModelPageStory) is False
File without changes
File without changes