fastapi-voyager 0.4.2__tar.gz → 0.4.3__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 (42) hide show
  1. {fastapi_voyager-0.4.2 → fastapi_voyager-0.4.3}/PKG-INFO +1 -1
  2. {fastapi_voyager-0.4.2 → fastapi_voyager-0.4.3}/src/fastapi_voyager/graph.py +1 -1
  3. {fastapi_voyager-0.4.2 → fastapi_voyager-0.4.3}/src/fastapi_voyager/type_helper.py +24 -7
  4. {fastapi_voyager-0.4.2 → fastapi_voyager-0.4.3}/src/fastapi_voyager/version.py +1 -1
  5. {fastapi_voyager-0.4.2 → fastapi_voyager-0.4.3}/tests/demo_anno.py +7 -0
  6. {fastapi_voyager-0.4.2 → fastapi_voyager-0.4.3}/.gitignore +0 -0
  7. {fastapi_voyager-0.4.2 → fastapi_voyager-0.4.3}/LICENSE +0 -0
  8. {fastapi_voyager-0.4.2 → fastapi_voyager-0.4.3}/README.md +0 -0
  9. {fastapi_voyager-0.4.2 → fastapi_voyager-0.4.3}/pyproject.toml +0 -0
  10. {fastapi_voyager-0.4.2 → fastapi_voyager-0.4.3}/src/fastapi_voyager/__init__.py +0 -0
  11. {fastapi_voyager-0.4.2 → fastapi_voyager-0.4.3}/src/fastapi_voyager/cli.py +0 -0
  12. {fastapi_voyager-0.4.2 → fastapi_voyager-0.4.3}/src/fastapi_voyager/filter.py +0 -0
  13. {fastapi_voyager-0.4.2 → fastapi_voyager-0.4.3}/src/fastapi_voyager/module.py +0 -0
  14. {fastapi_voyager-0.4.2 → fastapi_voyager-0.4.3}/src/fastapi_voyager/server.py +0 -0
  15. {fastapi_voyager-0.4.2 → fastapi_voyager-0.4.3}/src/fastapi_voyager/type.py +0 -0
  16. {fastapi_voyager-0.4.2 → fastapi_voyager-0.4.3}/src/fastapi_voyager/web/component/route-code-display.js +0 -0
  17. {fastapi_voyager-0.4.2 → fastapi_voyager-0.4.3}/src/fastapi_voyager/web/component/schema-code-display.js +0 -0
  18. {fastapi_voyager-0.4.2 → fastapi_voyager-0.4.3}/src/fastapi_voyager/web/component/schema-field-filter.js +0 -0
  19. {fastapi_voyager-0.4.2 → fastapi_voyager-0.4.3}/src/fastapi_voyager/web/graph-ui.js +0 -0
  20. {fastapi_voyager-0.4.2 → fastapi_voyager-0.4.3}/src/fastapi_voyager/web/graphviz.svg.css +0 -0
  21. {fastapi_voyager-0.4.2 → fastapi_voyager-0.4.3}/src/fastapi_voyager/web/graphviz.svg.js +0 -0
  22. {fastapi_voyager-0.4.2 → fastapi_voyager-0.4.3}/src/fastapi_voyager/web/icon/android-chrome-192x192.png +0 -0
  23. {fastapi_voyager-0.4.2 → fastapi_voyager-0.4.3}/src/fastapi_voyager/web/icon/android-chrome-512x512.png +0 -0
  24. {fastapi_voyager-0.4.2 → fastapi_voyager-0.4.3}/src/fastapi_voyager/web/icon/apple-touch-icon.png +0 -0
  25. {fastapi_voyager-0.4.2 → fastapi_voyager-0.4.3}/src/fastapi_voyager/web/icon/favicon-16x16.png +0 -0
  26. {fastapi_voyager-0.4.2 → fastapi_voyager-0.4.3}/src/fastapi_voyager/web/icon/favicon-32x32.png +0 -0
  27. {fastapi_voyager-0.4.2 → fastapi_voyager-0.4.3}/src/fastapi_voyager/web/icon/favicon.ico +0 -0
  28. {fastapi_voyager-0.4.2 → fastapi_voyager-0.4.3}/src/fastapi_voyager/web/icon/site.webmanifest +0 -0
  29. {fastapi_voyager-0.4.2 → fastapi_voyager-0.4.3}/src/fastapi_voyager/web/index.html +0 -0
  30. {fastapi_voyager-0.4.2 → fastapi_voyager-0.4.3}/src/fastapi_voyager/web/quasar.min.css +0 -0
  31. {fastapi_voyager-0.4.2 → fastapi_voyager-0.4.3}/src/fastapi_voyager/web/quasar.min.js +0 -0
  32. {fastapi_voyager-0.4.2 → fastapi_voyager-0.4.3}/src/fastapi_voyager/web/vue-main.js +0 -0
  33. {fastapi_voyager-0.4.2 → fastapi_voyager-0.4.3}/tests/__init__.py +0 -0
  34. {fastapi_voyager-0.4.2 → fastapi_voyager-0.4.3}/tests/demo.py +0 -0
  35. {fastapi_voyager-0.4.2 → fastapi_voyager-0.4.3}/tests/service/__init__.py +0 -0
  36. {fastapi_voyager-0.4.2 → fastapi_voyager-0.4.3}/tests/service/schema.py +0 -0
  37. {fastapi_voyager-0.4.2 → fastapi_voyager-0.4.3}/tests/test_analysis.py +0 -0
  38. {fastapi_voyager-0.4.2 → fastapi_voyager-0.4.3}/tests/test_import.py +0 -0
  39. {fastapi_voyager-0.4.2 → fastapi_voyager-0.4.3}/tests/test_module.py +0 -0
  40. {fastapi_voyager-0.4.2 → fastapi_voyager-0.4.3}/tests/test_type_alias.py +0 -0
  41. {fastapi_voyager-0.4.2 → fastapi_voyager-0.4.3}/uv.lock +0 -0
  42. {fastapi_voyager-0.4.2 → fastapi_voyager-0.4.3}/voyager.jpg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fastapi-voyager
3
- Version: 0.4.2
3
+ Version: 0.4.3
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
@@ -112,7 +112,6 @@ class Analytics:
112
112
  # add response_models and create links from route -> response_model
113
113
  for schema in get_core_types(route.response_model):
114
114
  if schema and issubclass(schema, BaseModel):
115
- update_forward_refs(schema)
116
115
  target_name = full_class_name(schema)
117
116
  self.links.append(Link(
118
117
  source=route_id,
@@ -182,6 +181,7 @@ class Analytics:
182
181
  3. recursively run walk_schema
183
182
  """
184
183
 
184
+ update_forward_refs(schema)
185
185
  self.add_to_node_set(schema)
186
186
 
187
187
  # handle schema inside ensure_subset(schema)
@@ -4,6 +4,7 @@ from pydantic import BaseModel
4
4
  from typing import get_origin, get_args, Union, Annotated, Any, Type
5
5
  from fastapi_voyager.type import FieldInfo
6
6
  from types import UnionType
7
+ import pydantic_resolve.constant as const
7
8
 
8
9
  # Python <3.12 compatibility: TypeAliasType exists only from 3.12 (PEP 695)
9
10
  try: # pragma: no cover - import guard
@@ -149,8 +150,9 @@ def get_type_name(anno):
149
150
 
150
151
  return name_of(anno)
151
152
 
153
+
152
154
  def is_inheritance_of_pydantic_base(cls):
153
- return issubclass(cls, BaseModel) and cls is not BaseModel
155
+ return issubclass(cls, BaseModel) and cls is not BaseModel
154
156
 
155
157
 
156
158
  def get_bases_fields(schemas: list[type[BaseModel]]) -> set[str]:
@@ -240,15 +242,30 @@ def safe_issubclass(kls, classinfo):
240
242
 
241
243
 
242
244
  def update_forward_refs(kls):
243
- def update_pydantic_forward_refs(kls: Type[BaseModel]):
245
+ def update_pydantic_forward_refs(kls2: Type[BaseModel]):
244
246
  """
245
247
  recursively update refs.
246
248
  """
247
- kls.model_rebuild()
248
- values = kls.model_fields.values()
249
+
250
+ kls2.model_rebuild()
251
+ setattr(kls2, const.PYDANTIC_FORWARD_REF_UPDATED, True)
252
+
253
+ values = kls2.model_fields.values()
249
254
  for field in values:
250
255
  update_forward_refs(field.annotation)
251
256
 
252
- for shelled_types in get_core_types(kls):
253
- if safe_issubclass(shelled_types, BaseModel):
254
- update_pydantic_forward_refs(shelled_types)
257
+ if safe_issubclass(kls, BaseModel):
258
+ kls.model_rebuild()
259
+ setattr(kls, const.PYDANTIC_FORWARD_REF_UPDATED, True)
260
+
261
+ for shelled_type in get_core_types(kls):
262
+ if getattr(shelled_type, const.PYDANTIC_FORWARD_REF_UPDATED, False):
263
+ continue
264
+ if safe_issubclass(shelled_type, BaseModel):
265
+ update_pydantic_forward_refs(shelled_type)
266
+
267
+ if __name__ == "__main__":
268
+ from tests.demo_anno import PageSprint, PageOverall
269
+
270
+ update_forward_refs(PageOverall)
271
+ update_forward_refs(PageSprint)
@@ -1,2 +1,2 @@
1
1
  __all__ = ["__version__"]
2
- __version__ = "0.4.2"
2
+ __version__ = "0.4.3"
@@ -12,6 +12,11 @@ app = FastAPI(title="Demo API", description="A demo FastAPI application for rout
12
12
  def get_sprint():
13
13
  return []
14
14
 
15
+ class Tree(BaseModel):
16
+ id: int
17
+ name: str
18
+ children: list[Tree] = []
19
+
15
20
  class PageMember(serv.Member):
16
21
  fullname: str = ''
17
22
  def post_fullname(self):
@@ -51,6 +56,8 @@ class PageStory(BaseModel):
51
56
  owner: Optional[PageMember] = None
52
57
  union_tasks: list[TaskUnion] = []
53
58
 
59
+ tree: Optional[Tree] = None
60
+
54
61
  @app.get("/page_overall", tags=['for-page'], response_model=PageOverall)
55
62
  async def get_page_info():
56
63
  page_overall = PageOverall(sprints=[]) # focus on schema only
File without changes
File without changes