fastapi-voyager 0.12.1__py3-none-any.whl → 0.12.3__py3-none-any.whl
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.
- fastapi_voyager/__init__.py +1 -2
- fastapi_voyager/cli.py +3 -3
- fastapi_voyager/filter.py +6 -5
- fastapi_voyager/module.py +11 -10
- fastapi_voyager/render.py +17 -8
- fastapi_voyager/server.py +36 -17
- fastapi_voyager/type.py +5 -3
- fastapi_voyager/type_helper.py +13 -7
- fastapi_voyager/version.py +1 -1
- fastapi_voyager/voyager.py +14 -10
- fastapi_voyager/web/index.html +2 -0
- {fastapi_voyager-0.12.1.dist-info → fastapi_voyager-0.12.3.dist-info}/METADATA +5 -7
- {fastapi_voyager-0.12.1.dist-info → fastapi_voyager-0.12.3.dist-info}/RECORD +16 -16
- {fastapi_voyager-0.12.1.dist-info → fastapi_voyager-0.12.3.dist-info}/WHEEL +0 -0
- {fastapi_voyager-0.12.1.dist-info → fastapi_voyager-0.12.3.dist-info}/entry_points.txt +0 -0
- {fastapi_voyager-0.12.1.dist-info → fastapi_voyager-0.12.3.dist-info}/licenses/LICENSE +0 -0
fastapi_voyager/__init__.py
CHANGED
|
@@ -2,8 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Utilities to introspect a FastAPI application and visualize its routing tree.
|
|
4
4
|
"""
|
|
5
|
-
from .version import __version__ # noqa: F401
|
|
6
|
-
|
|
7
5
|
from .server import create_voyager
|
|
6
|
+
from .version import __version__ # noqa: F401
|
|
8
7
|
|
|
9
8
|
__all__ = ["__version__", "create_voyager"]
|
fastapi_voyager/cli.py
CHANGED
|
@@ -5,9 +5,9 @@ import importlib.util
|
|
|
5
5
|
import logging
|
|
6
6
|
import os
|
|
7
7
|
import sys
|
|
8
|
-
from typing import Optional
|
|
9
8
|
|
|
10
9
|
from fastapi import FastAPI
|
|
10
|
+
|
|
11
11
|
from fastapi_voyager import server as viz_server
|
|
12
12
|
from fastapi_voyager.version import __version__
|
|
13
13
|
from fastapi_voyager.voyager import Voyager
|
|
@@ -15,7 +15,7 @@ from fastapi_voyager.voyager import Voyager
|
|
|
15
15
|
logger = logging.getLogger(__name__)
|
|
16
16
|
|
|
17
17
|
|
|
18
|
-
def load_fastapi_app_from_file(module_path: str, app_name: str = "app") ->
|
|
18
|
+
def load_fastapi_app_from_file(module_path: str, app_name: str = "app") -> FastAPI | None:
|
|
19
19
|
"""Load FastAPI app from a Python module file."""
|
|
20
20
|
try:
|
|
21
21
|
# Convert relative path to absolute path
|
|
@@ -47,7 +47,7 @@ def load_fastapi_app_from_file(module_path: str, app_name: str = "app") -> Optio
|
|
|
47
47
|
return None
|
|
48
48
|
|
|
49
49
|
|
|
50
|
-
def load_fastapi_app_from_module(module_name: str, app_name: str = "app") ->
|
|
50
|
+
def load_fastapi_app_from_module(module_name: str, app_name: str = "app") -> FastAPI | None:
|
|
51
51
|
"""Load FastAPI app from a Python module name."""
|
|
52
52
|
try:
|
|
53
53
|
# Temporarily add the current working directory to sys.path
|
fastapi_voyager/filter.py
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
|
+
|
|
2
3
|
from collections import deque
|
|
3
|
-
|
|
4
|
-
from fastapi_voyager.type import
|
|
4
|
+
|
|
5
|
+
from fastapi_voyager.type import PK, Link, Route, SchemaNode, Tag
|
|
5
6
|
|
|
6
7
|
|
|
7
8
|
def filter_graph(
|
|
@@ -13,7 +14,7 @@ def filter_graph(
|
|
|
13
14
|
nodes: list[SchemaNode],
|
|
14
15
|
links: list[Link],
|
|
15
16
|
node_set: dict[str, SchemaNode],
|
|
16
|
-
) ->
|
|
17
|
+
) -> tuple[list[Tag], list[Route], list[SchemaNode], list[Link]]:
|
|
17
18
|
"""Filter tags, routes, schema nodes and links based on a target schema and optional field.
|
|
18
19
|
|
|
19
20
|
Behaviour summary (mirrors previous Analytics.filter_nodes_and_schemas_based_on_schemas):
|
|
@@ -113,7 +114,7 @@ def filter_subgraph_by_module_prefix(
|
|
|
113
114
|
links: list[Link],
|
|
114
115
|
nodes: list[SchemaNode],
|
|
115
116
|
module_prefix: str
|
|
116
|
-
) ->
|
|
117
|
+
) -> tuple[list[Tag], list[Route], list[SchemaNode], list[Link]]:
|
|
117
118
|
"""Collapse schema graph so routes link directly to nodes whose module matches ``module_prefix``.
|
|
118
119
|
|
|
119
120
|
The routine keeps tag→route links untouched, prunes schema nodes whose module does not start
|
|
@@ -202,7 +203,7 @@ def filter_subgraph_from_tag_to_schema_by_module_prefix(
|
|
|
202
203
|
links: list[Link],
|
|
203
204
|
nodes: list[SchemaNode],
|
|
204
205
|
module_prefix: str
|
|
205
|
-
) ->
|
|
206
|
+
) -> tuple[list[Tag], list[Route], list[SchemaNode], list[Link]]:
|
|
206
207
|
"""Collapse schema graph so routes link directly to nodes whose module matches ``module_prefix``.
|
|
207
208
|
|
|
208
209
|
The routine keeps tag→route links untouched, prunes schema nodes whose module does not start
|
fastapi_voyager/module.py
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
from
|
|
2
|
-
from
|
|
1
|
+
from collections.abc import Callable
|
|
2
|
+
from typing import Any, TypeVar
|
|
3
3
|
|
|
4
|
+
from fastapi_voyager.type import ModuleNode, ModuleRoute, Route, SchemaNode
|
|
4
5
|
|
|
5
6
|
N = TypeVar('N') # Node type: ModuleNode or ModuleRoute
|
|
6
7
|
I = TypeVar('I') # Item type: SchemaNode or Route
|
|
@@ -10,7 +11,7 @@ def _build_module_tree(
|
|
|
10
11
|
items: list[I],
|
|
11
12
|
*,
|
|
12
13
|
get_module_path: Callable[[I], str | None],
|
|
13
|
-
NodeClass:
|
|
14
|
+
NodeClass: type[N],
|
|
14
15
|
item_list_attr: str,
|
|
15
16
|
) -> list[N]:
|
|
16
17
|
"""
|
|
@@ -34,13 +35,13 @@ def _build_module_tree(
|
|
|
34
35
|
return NodeClass(**kwargs) # type: ignore[arg-type]
|
|
35
36
|
|
|
36
37
|
def get_or_create(child_name: str, parent: N) -> N:
|
|
37
|
-
for m in
|
|
38
|
+
for m in parent.modules:
|
|
38
39
|
if m.name == child_name:
|
|
39
40
|
return m
|
|
40
|
-
parent_full =
|
|
41
|
+
parent_full = parent.fullname
|
|
41
42
|
fullname = child_name if not parent_full or parent_full == "__root__" else f"{parent_full}.{child_name}"
|
|
42
43
|
new_node = make_node(child_name, fullname)
|
|
43
|
-
|
|
44
|
+
parent.modules.append(new_node)
|
|
44
45
|
return new_node
|
|
45
46
|
|
|
46
47
|
# Build the tree
|
|
@@ -65,13 +66,13 @@ def _build_module_tree(
|
|
|
65
66
|
|
|
66
67
|
# Collapse linear chains: no items on node and exactly one child module
|
|
67
68
|
def collapse(node: N) -> None:
|
|
68
|
-
while len(
|
|
69
|
-
child =
|
|
69
|
+
while len(node.modules) == 1 and len(getattr(node, item_list_attr)) == 0:
|
|
70
|
+
child = node.modules[0]
|
|
70
71
|
node.name = f"{node.name}.{child.name}"
|
|
71
72
|
node.fullname = child.fullname
|
|
72
73
|
setattr(node, item_list_attr, getattr(child, item_list_attr))
|
|
73
|
-
|
|
74
|
-
for m in
|
|
74
|
+
node.modules = child.modules
|
|
75
|
+
for m in node.modules:
|
|
75
76
|
collapse(m)
|
|
76
77
|
|
|
77
78
|
for top in result:
|
fastapi_voyager/render.py
CHANGED
|
@@ -1,8 +1,17 @@
|
|
|
1
|
-
from typing import Optional
|
|
2
|
-
from fastapi_voyager.type import SchemaNode, ModuleNode, Link, Tag, Route, FieldType, PK, ModuleRoute
|
|
3
|
-
from fastapi_voyager.module import build_module_schema_tree, build_module_route_tree
|
|
4
1
|
from logging import getLogger
|
|
5
2
|
|
|
3
|
+
from fastapi_voyager.module import build_module_route_tree, build_module_schema_tree
|
|
4
|
+
from fastapi_voyager.type import (
|
|
5
|
+
PK,
|
|
6
|
+
FieldType,
|
|
7
|
+
Link,
|
|
8
|
+
ModuleNode,
|
|
9
|
+
ModuleRoute,
|
|
10
|
+
Route,
|
|
11
|
+
SchemaNode,
|
|
12
|
+
Tag,
|
|
13
|
+
)
|
|
14
|
+
|
|
6
15
|
logger = getLogger(__name__)
|
|
7
16
|
|
|
8
17
|
|
|
@@ -23,7 +32,7 @@ class Renderer:
|
|
|
23
32
|
logger.info(f'show_module: {self.show_module}')
|
|
24
33
|
logger.info(f'module_color: {self.module_color}')
|
|
25
34
|
|
|
26
|
-
def render_schema_label(self, node: SchemaNode, color:
|
|
35
|
+
def render_schema_label(self, node: SchemaNode, color: str | None=None) -> str:
|
|
27
36
|
has_base_fields = any(f.from_base for f in node.fields)
|
|
28
37
|
fields = [n for n in node.fields if n.from_base is False]
|
|
29
38
|
|
|
@@ -74,7 +83,7 @@ class Renderer:
|
|
|
74
83
|
raise ValueError(f'Unknown link type: {link.type}')
|
|
75
84
|
|
|
76
85
|
def render_module_schema_content(self, nodes: list[SchemaNode]) -> str:
|
|
77
|
-
def render_node(node: SchemaNode, color:
|
|
86
|
+
def render_node(node: SchemaNode, color: str | None=None) -> str:
|
|
78
87
|
return f'''
|
|
79
88
|
"{node.id}" [
|
|
80
89
|
label = {self.render_schema_label(node, color)}
|
|
@@ -82,8 +91,8 @@ class Renderer:
|
|
|
82
91
|
margin="0.5,0.1"
|
|
83
92
|
];'''
|
|
84
93
|
|
|
85
|
-
def render_module_schema(mod: ModuleNode, inherit_color:
|
|
86
|
-
color:
|
|
94
|
+
def render_module_schema(mod: ModuleNode, inherit_color: str | None=None, show_cluster:bool=True) -> str:
|
|
95
|
+
color: str | None = inherit_color
|
|
87
96
|
|
|
88
97
|
# recursively vist module from short to long: 'a', 'a.b', 'a.b.c'
|
|
89
98
|
# color_flag: {'a', 'a.b.c'}
|
|
@@ -109,7 +118,7 @@ class Renderer:
|
|
|
109
118
|
label = " {mod.name}"
|
|
110
119
|
labeljust = "l"
|
|
111
120
|
{(f'pencolor = "{color}"' if color else 'pencolor="#ccc"')}
|
|
112
|
-
{(
|
|
121
|
+
{('penwidth = 3' if color else 'penwidth=""')}
|
|
113
122
|
{inner_nodes_str}
|
|
114
123
|
{child_str}
|
|
115
124
|
}}'''
|
fastapi_voyager/server.py
CHANGED
|
@@ -1,20 +1,37 @@
|
|
|
1
1
|
from pathlib import Path
|
|
2
|
-
from typing import
|
|
3
|
-
|
|
4
|
-
from
|
|
5
|
-
from
|
|
6
|
-
from fastapi.responses import HTMLResponse, PlainTextResponse, JSONResponse
|
|
2
|
+
from typing import Literal
|
|
3
|
+
|
|
4
|
+
from fastapi import APIRouter, FastAPI
|
|
5
|
+
from fastapi.responses import HTMLResponse, JSONResponse, PlainTextResponse
|
|
7
6
|
from fastapi.staticfiles import StaticFiles
|
|
8
|
-
from
|
|
9
|
-
from
|
|
7
|
+
from pydantic import BaseModel
|
|
8
|
+
from starlette.middleware.gzip import GZipMiddleware
|
|
9
|
+
|
|
10
10
|
from fastapi_voyager.render import Renderer
|
|
11
|
+
from fastapi_voyager.type import CoreData, SchemaNode, Tag
|
|
11
12
|
from fastapi_voyager.type_helper import get_source, get_vscode_link
|
|
12
13
|
from fastapi_voyager.version import __version__
|
|
13
|
-
|
|
14
|
+
from fastapi_voyager.voyager import Voyager
|
|
14
15
|
|
|
15
16
|
WEB_DIR = Path(__file__).parent / "web"
|
|
16
17
|
WEB_DIR.mkdir(exist_ok=True)
|
|
17
18
|
|
|
19
|
+
GA_PLACEHOLDER = "<!-- GA_SNIPPET -->"
|
|
20
|
+
|
|
21
|
+
def _build_ga_snippet(ga_id: str | None) -> str:
|
|
22
|
+
if not ga_id:
|
|
23
|
+
return ""
|
|
24
|
+
|
|
25
|
+
return f""" <script async src="https://www.googletagmanager.com/gtag/js?id={ga_id}"></script>
|
|
26
|
+
<script>
|
|
27
|
+
window.dataLayer = window.dataLayer || [];
|
|
28
|
+
function gtag(){{dataLayer.push(arguments);}}
|
|
29
|
+
gtag('js', new Date());
|
|
30
|
+
|
|
31
|
+
gtag('config', '{ga_id}');
|
|
32
|
+
</script>
|
|
33
|
+
"""
|
|
34
|
+
|
|
18
35
|
INITIAL_PAGE_POLICY = Literal['first', 'full', 'empty']
|
|
19
36
|
|
|
20
37
|
class OptionParam(BaseModel):
|
|
@@ -24,13 +41,13 @@ class OptionParam(BaseModel):
|
|
|
24
41
|
enable_brief_mode: bool
|
|
25
42
|
version: str
|
|
26
43
|
initial_page_policy: INITIAL_PAGE_POLICY
|
|
27
|
-
swagger_url:
|
|
44
|
+
swagger_url: str | None = None
|
|
28
45
|
|
|
29
46
|
class Payload(BaseModel):
|
|
30
|
-
tags:
|
|
31
|
-
schema_name:
|
|
32
|
-
schema_field:
|
|
33
|
-
route_name:
|
|
47
|
+
tags: list[str] | None = None
|
|
48
|
+
schema_name: str | None = None
|
|
49
|
+
schema_field: str | None = None
|
|
50
|
+
route_name: str | None = None
|
|
34
51
|
show_fields: str = 'object'
|
|
35
52
|
show_meta: bool = False
|
|
36
53
|
brief: bool = False
|
|
@@ -42,10 +59,11 @@ def create_voyager(
|
|
|
42
59
|
target_app: FastAPI,
|
|
43
60
|
module_color: dict[str, str] | None = None,
|
|
44
61
|
gzip_minimum_size: int | None = 500,
|
|
45
|
-
module_prefix:
|
|
46
|
-
swagger_url:
|
|
47
|
-
online_repo_url:
|
|
62
|
+
module_prefix: str | None = None,
|
|
63
|
+
swagger_url: str | None = None,
|
|
64
|
+
online_repo_url: str | None = None,
|
|
48
65
|
initial_page_policy: INITIAL_PAGE_POLICY = 'first',
|
|
66
|
+
ga_id: str | None = None,
|
|
49
67
|
) -> FastAPI:
|
|
50
68
|
router = APIRouter(tags=['fastapi-voyager'])
|
|
51
69
|
|
|
@@ -116,7 +134,8 @@ def create_voyager(
|
|
|
116
134
|
def index():
|
|
117
135
|
index_file = WEB_DIR / "index.html"
|
|
118
136
|
if index_file.exists():
|
|
119
|
-
|
|
137
|
+
content = index_file.read_text(encoding="utf-8")
|
|
138
|
+
return content.replace(GA_PLACEHOLDER, _build_ga_snippet(ga_id))
|
|
120
139
|
# fallback simple page if index.html missing
|
|
121
140
|
return """
|
|
122
141
|
<!doctype html>
|
fastapi_voyager/type.py
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
from dataclasses import field
|
|
2
|
+
from typing import Literal
|
|
3
|
+
|
|
2
4
|
from pydantic.dataclasses import dataclass
|
|
3
|
-
|
|
5
|
+
|
|
4
6
|
|
|
5
7
|
@dataclass
|
|
6
8
|
class NodeBase:
|
|
@@ -76,5 +78,5 @@ class CoreData:
|
|
|
76
78
|
nodes: list[SchemaNode]
|
|
77
79
|
links: list[Link]
|
|
78
80
|
show_fields: FieldType
|
|
79
|
-
module_color:
|
|
80
|
-
schema:
|
|
81
|
+
module_color: dict[str, str] | None = None
|
|
82
|
+
schema: str | None = None
|
fastapi_voyager/type_helper.py
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import inspect
|
|
2
2
|
import logging
|
|
3
3
|
import os
|
|
4
|
-
from pydantic import BaseModel
|
|
5
|
-
from typing import get_origin, get_args, Union, Annotated, Any, Type, Generic, Optional
|
|
6
|
-
from fastapi_voyager.type import FieldInfo
|
|
7
4
|
from types import UnionType
|
|
5
|
+
from typing import Annotated, Any, Generic, Union, get_args, get_origin
|
|
6
|
+
|
|
8
7
|
import pydantic_resolve.constant as const
|
|
8
|
+
from pydantic import BaseModel
|
|
9
|
+
|
|
10
|
+
from fastapi_voyager.type import FieldInfo
|
|
9
11
|
|
|
10
12
|
logger = logging.getLogger(__name__)
|
|
11
13
|
|
|
@@ -185,7 +187,7 @@ def get_pydantic_fields(schema: type[BaseModel], bases_fields: set[str]) -> list
|
|
|
185
187
|
return fields
|
|
186
188
|
|
|
187
189
|
|
|
188
|
-
def get_vscode_link(kls, online_repo_url:
|
|
190
|
+
def get_vscode_link(kls, online_repo_url: str | None = None) -> str:
|
|
189
191
|
"""Build a VSCode deep link to the class definition.
|
|
190
192
|
|
|
191
193
|
Priority:
|
|
@@ -241,7 +243,7 @@ def safe_issubclass(kls, target_kls):
|
|
|
241
243
|
|
|
242
244
|
def update_forward_refs(kls):
|
|
243
245
|
# TODO: refactor
|
|
244
|
-
def update_pydantic_forward_refs(pydantic_kls:
|
|
246
|
+
def update_pydantic_forward_refs(pydantic_kls: type[BaseModel]):
|
|
245
247
|
"""
|
|
246
248
|
recursively update refs.
|
|
247
249
|
"""
|
|
@@ -254,7 +256,11 @@ def update_forward_refs(kls):
|
|
|
254
256
|
update_forward_refs(field.annotation)
|
|
255
257
|
|
|
256
258
|
for shelled_type in get_core_types(kls):
|
|
257
|
-
if
|
|
259
|
+
# Only treat as updated if the flag is set on the class itself, not via inheritance
|
|
260
|
+
|
|
261
|
+
local_attrs = getattr(shelled_type, '__dict__', {})
|
|
262
|
+
if local_attrs.get(const.PYDANTIC_FORWARD_REF_UPDATED, False):
|
|
263
|
+
logger.debug(shelled_type.__qualname__, 'visited')
|
|
258
264
|
continue
|
|
259
265
|
if safe_issubclass(shelled_type, BaseModel):
|
|
260
266
|
update_pydantic_forward_refs(shelled_type)
|
|
@@ -287,7 +293,7 @@ def is_non_pydantic_type(tp):
|
|
|
287
293
|
return True
|
|
288
294
|
|
|
289
295
|
if __name__ == "__main__":
|
|
290
|
-
from tests.demo_anno import
|
|
296
|
+
from tests.demo_anno import PageOverall, PageSprint
|
|
291
297
|
|
|
292
298
|
update_forward_refs(PageOverall)
|
|
293
299
|
update_forward_refs(PageSprint)
|
fastapi_voyager/version.py
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
__all__ = ["__version__"]
|
|
2
|
-
__version__ = "0.12.
|
|
2
|
+
__version__ = "0.12.3"
|
fastapi_voyager/voyager.py
CHANGED
|
@@ -1,21 +1,25 @@
|
|
|
1
|
-
|
|
1
|
+
|
|
2
|
+
import pydantic_resolve.constant as const
|
|
2
3
|
from fastapi import FastAPI, routing
|
|
3
|
-
from
|
|
4
|
+
from pydantic import BaseModel
|
|
5
|
+
|
|
6
|
+
from fastapi_voyager.filter import (
|
|
7
|
+
filter_graph,
|
|
8
|
+
filter_subgraph_by_module_prefix,
|
|
9
|
+
filter_subgraph_from_tag_to_schema_by_module_prefix,
|
|
10
|
+
)
|
|
11
|
+
from fastapi_voyager.render import Renderer
|
|
12
|
+
from fastapi_voyager.type import PK, CoreData, FieldType, Link, LinkType, Route, SchemaNode, Tag
|
|
4
13
|
from fastapi_voyager.type_helper import (
|
|
5
|
-
get_core_types,
|
|
6
14
|
full_class_name,
|
|
7
15
|
get_bases_fields,
|
|
8
|
-
|
|
16
|
+
get_core_types,
|
|
9
17
|
get_pydantic_fields,
|
|
10
18
|
get_type_name,
|
|
19
|
+
is_inheritance_of_pydantic_base,
|
|
20
|
+
is_non_pydantic_type,
|
|
11
21
|
update_forward_refs,
|
|
12
|
-
is_non_pydantic_type
|
|
13
22
|
)
|
|
14
|
-
from pydantic import BaseModel
|
|
15
|
-
from fastapi_voyager.type import Route, SchemaNode, Link, Tag, LinkType, FieldType, PK, CoreData
|
|
16
|
-
from fastapi_voyager.filter import filter_graph, filter_subgraph_from_tag_to_schema_by_module_prefix, filter_subgraph_by_module_prefix
|
|
17
|
-
from fastapi_voyager.render import Renderer
|
|
18
|
-
import pydantic_resolve.constant as const
|
|
19
23
|
|
|
20
24
|
|
|
21
25
|
class Voyager:
|
fastapi_voyager/web/index.html
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: fastapi-voyager
|
|
3
|
-
Version: 0.12.
|
|
3
|
+
Version: 0.12.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
|
|
@@ -12,7 +12,6 @@ Classifier: Framework :: FastAPI
|
|
|
12
12
|
Classifier: Intended Audience :: Developers
|
|
13
13
|
Classifier: License :: OSI Approved :: MIT License
|
|
14
14
|
Classifier: Programming Language :: Python :: 3
|
|
15
|
-
Classifier: Programming Language :: Python :: 3.9
|
|
16
15
|
Classifier: Programming Language :: Python :: 3.10
|
|
17
16
|
Classifier: Programming Language :: Python :: 3.11
|
|
18
17
|
Classifier: Programming Language :: Python :: 3.12
|
|
@@ -40,6 +39,10 @@ Visualize your FastAPI endpoints, and explore them interactively.
|
|
|
40
39
|
|
|
41
40
|
<img width="1600" height="986" alt="image" src="https://github.com/user-attachments/assets/8829cda0-f42d-4c84-be2f-b019bb5fe7e1" />
|
|
42
41
|
|
|
42
|
+
## Plan & Raodmap
|
|
43
|
+
- [ideas](./docs/idea.md)
|
|
44
|
+
- [changelog & roadmap](./docs/changelog.md)
|
|
45
|
+
|
|
43
46
|
## Installation
|
|
44
47
|
|
|
45
48
|
```bash
|
|
@@ -176,8 +179,3 @@ backend:
|
|
|
176
179
|
- `voyager.py`: main entry
|
|
177
180
|
- `render.py`: generate dot file
|
|
178
181
|
- `server.py`: serve mode
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
## Plan & Raodmap
|
|
182
|
-
- [ideas](./docs/idea.md)
|
|
183
|
-
- [changelog & roadmap](./docs/changelog.md)
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
fastapi_voyager/__init__.py,sha256=
|
|
2
|
-
fastapi_voyager/cli.py,sha256=
|
|
3
|
-
fastapi_voyager/filter.py,sha256=
|
|
4
|
-
fastapi_voyager/module.py,sha256=
|
|
5
|
-
fastapi_voyager/render.py,sha256=
|
|
6
|
-
fastapi_voyager/server.py,sha256=
|
|
7
|
-
fastapi_voyager/type.py,sha256=
|
|
8
|
-
fastapi_voyager/type_helper.py,sha256=
|
|
9
|
-
fastapi_voyager/version.py,sha256=
|
|
10
|
-
fastapi_voyager/voyager.py,sha256=
|
|
1
|
+
fastapi_voyager/__init__.py,sha256=kqwzThE1YhmQ_7jPKGlnWvqRGC-hFrRqq_lKhKaleYU,229
|
|
2
|
+
fastapi_voyager/cli.py,sha256=td3yIIigEomhSdDO-Xkh-CgpEwCafwlwnpvxnT9QsBo,10488
|
|
3
|
+
fastapi_voyager/filter.py,sha256=AN_HIu8-DtKisIq5mFt7CnqRHtxKewedNGyyaI82hSY,11529
|
|
4
|
+
fastapi_voyager/module.py,sha256=h9YR3BpS-CAcJW9WCdVkF4opqwY32w9T67g9GfdLytk,3425
|
|
5
|
+
fastapi_voyager/render.py,sha256=1S9GFQ4LnNC_Qd-yiM8Jw8FkTxt2huREppc2sO0dFxA,9820
|
|
6
|
+
fastapi_voyager/server.py,sha256=MZNRpcXor2q8Rj3OSf6EH8NkgDChxfzUtnIY8ilRkaY,7053
|
|
7
|
+
fastapi_voyager/type.py,sha256=7EL1zaIwKVRGpLig7fqaOrZGN5k0Rm31C9COfck3CSs,1750
|
|
8
|
+
fastapi_voyager/type_helper.py,sha256=quQPV0dbb5JwpfpC5tL2Zad73f_fJXF2-k46ZMuXrZs,9716
|
|
9
|
+
fastapi_voyager/version.py,sha256=TeMwxEaDOniKVMHjL1Q1lrmHL9cdAEzO838ewxqUUAU,49
|
|
10
|
+
fastapi_voyager/voyager.py,sha256=LiRUb0ZG2cfnyY_pwRqoeZjxb6Pu6xy_lqPiMupxoKM,13510
|
|
11
11
|
fastapi_voyager/web/graph-ui.js,sha256=9ONPxQHvk4HxYq6KtKc_2VbJmUgd-gh7i3Biv1rkqC4,5734
|
|
12
12
|
fastapi_voyager/web/graphviz.svg.css,sha256=zDCjjpT0Idufu5YOiZI76PL70-avP3vTyzGPh9M85Do,1563
|
|
13
13
|
fastapi_voyager/web/graphviz.svg.js,sha256=lvAdbjHc-lMSk4GQp-iqYA2PCFX4RKnW7dFaoe0LUHs,16005
|
|
14
|
-
fastapi_voyager/web/index.html,sha256=
|
|
14
|
+
fastapi_voyager/web/index.html,sha256=8cmlwQzE5tonHj_QozdKcr3z-7JFsvE7cjf70dye0y8,19377
|
|
15
15
|
fastapi_voyager/web/quasar.min.css,sha256=F5jQe7X2XT54VlvAaa2V3GsBFdVD-vxDZeaPLf6U9CU,203145
|
|
16
16
|
fastapi_voyager/web/quasar.min.js,sha256=h0ftyPMW_CRiyzeVfQqiup0vrVt4_QWojpqmpnpn07E,502974
|
|
17
17
|
fastapi_voyager/web/vue-main.js,sha256=m6U24ythzjQuAYXUm9BsTdFrApFNqW26B0Bf7TsybqQ,13275
|
|
@@ -26,8 +26,8 @@ fastapi_voyager/web/icon/favicon-16x16.png,sha256=JC07jEzfIYxBIoQn_FHXvyHuxESdhW
|
|
|
26
26
|
fastapi_voyager/web/icon/favicon-32x32.png,sha256=C7v1h58cfWOsiLp9yOIZtlx-dLasBcq3NqpHVGRmpt4,1859
|
|
27
27
|
fastapi_voyager/web/icon/favicon.ico,sha256=tZolYIXkkBcFiYl1A8ksaXN2VjGamzcSdes838dLvNc,15406
|
|
28
28
|
fastapi_voyager/web/icon/site.webmanifest,sha256=ep4Hzh9zhmiZF2At3Fp1dQrYQuYF_3ZPZxc1KcGBvwQ,263
|
|
29
|
-
fastapi_voyager-0.12.
|
|
30
|
-
fastapi_voyager-0.12.
|
|
31
|
-
fastapi_voyager-0.12.
|
|
32
|
-
fastapi_voyager-0.12.
|
|
33
|
-
fastapi_voyager-0.12.
|
|
29
|
+
fastapi_voyager-0.12.3.dist-info/METADATA,sha256=zCZqZOPMmQMh0guXA7dmVHP0QD1M8ZJKFT6dyR_hWRo,6009
|
|
30
|
+
fastapi_voyager-0.12.3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
31
|
+
fastapi_voyager-0.12.3.dist-info/entry_points.txt,sha256=pEIKoUnIDXEtdMBq8EmXm70m16vELIu1VPz9-TBUFWM,53
|
|
32
|
+
fastapi_voyager-0.12.3.dist-info/licenses/LICENSE,sha256=lNVRR3y_bFVoFKuK2JM8N4sFaj3m-7j29kvL3olFi5Y,1067
|
|
33
|
+
fastapi_voyager-0.12.3.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|