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.
@@ -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") -> Optional[FastAPI]:
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") -> Optional[FastAPI]:
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
- from typing import Tuple
4
- from fastapi_voyager.type import Tag, Route, SchemaNode, Link, PK
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
- ) -> Tuple[list[Tag], list[Route], list[SchemaNode], list[Link]]:
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
- ) -> Tuple[list[Tag], list[Route], list[SchemaNode], list[Link]]:
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
- ) -> Tuple[list[Tag], list[Route], list[SchemaNode], list[Link]]:
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 typing import Callable, Type, TypeVar, Any
2
- from fastapi_voyager.type import SchemaNode, ModuleNode, Route, ModuleRoute
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: Type[N],
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 getattr(parent, 'modules'):
38
+ for m in parent.modules:
38
39
  if m.name == child_name:
39
40
  return m
40
- parent_full = getattr(parent, 'fullname')
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
- getattr(parent, 'modules').append(new_node)
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(getattr(node, 'modules')) == 1 and len(getattr(node, item_list_attr)) == 0:
69
- child = getattr(node, 'modules')[0]
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
- setattr(node, 'modules', getattr(child, 'modules'))
74
- for m in getattr(node, 'modules'):
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: Optional[str]=None) -> str:
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: Optional[str]=None) -> str:
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: Optional[str]=None, show_cluster:bool=True) -> str:
86
- color: Optional[str] = inherit_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
- {(f'penwidth = 3' if color else 'penwidth=""')}
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 Optional, Literal
3
- from fastapi import FastAPI, APIRouter
4
- from starlette.middleware.gzip import GZipMiddleware
5
- from pydantic import BaseModel
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 fastapi_voyager.voyager import Voyager
9
- from fastapi_voyager.type import Tag, FieldInfo, CoreData, SchemaNode
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: Optional[str] = None
44
+ swagger_url: str | None = None
28
45
 
29
46
  class Payload(BaseModel):
30
- tags: Optional[list[str]] = None
31
- schema_name: Optional[str] = None
32
- schema_field: Optional[str] = None
33
- route_name: Optional[str] = None
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: Optional[str] = None,
46
- swagger_url: Optional[str] = None,
47
- online_repo_url: Optional[str] = None,
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
- return index_file.read_text(encoding="utf-8")
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
- from typing import Literal, Optional
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: Optional[dict[str, str]] = None
80
- schema: Optional[str] = None
81
+ module_color: dict[str, str] | None = None
82
+ schema: str | None = None
@@ -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: Optional[str] = None) -> str:
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: Type[BaseModel]):
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 getattr(shelled_type, const.PYDANTIC_FORWARD_REF_UPDATED, False):
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 PageSprint, PageOverall
296
+ from tests.demo_anno import PageOverall, PageSprint
291
297
 
292
298
  update_forward_refs(PageOverall)
293
299
  update_forward_refs(PageSprint)
@@ -1,2 +1,2 @@
1
1
  __all__ = ["__version__"]
2
- __version__ = "0.12.1"
2
+ __version__ = "0.12.3"
@@ -1,21 +1,25 @@
1
- from pydantic import BaseModel
1
+
2
+ import pydantic_resolve.constant as const
2
3
  from fastapi import FastAPI, routing
3
- from typing import Callable
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
- is_inheritance_of_pydantic_base,
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:
@@ -477,5 +477,7 @@
477
477
  });
478
478
  </script>
479
479
  <script type="module" src="fastapi-voyager-static/vue-main.js"></script>
480
+
481
+ <!-- GA_SNIPPET -->
480
482
  </body>
481
483
  </html>
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fastapi-voyager
3
- Version: 0.12.1
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=tZy0Nkj8kTaMgbvHy-mGxVcFGVX0Km-36dnzsAIG2uk,230
2
- fastapi_voyager/cli.py,sha256=xK8DT-m2qP38FK2dGhLP-sHEuS29SBw6ACrnX9w85P0,10521
3
- fastapi_voyager/filter.py,sha256=9Y-NepveIiCLOI-5eXk6DNK9H3dr5_h4xUbWYHkbo7M,11552
4
- fastapi_voyager/module.py,sha256=Z2QHNmiLk6ZAJlm2nSmO875Q33TweSg8UxZSzIpU9zY,3499
5
- fastapi_voyager/render.py,sha256=8hVsEDQi2-aP3QKN6KI3RnNz0uG-FuDr_k4D7QNsdQQ,9823
6
- fastapi_voyager/server.py,sha256=XEWEfW02eha07piXfEOYeVC1lD6sMgzsCpRcNWgs_HE,6587
7
- fastapi_voyager/type.py,sha256=VmcTB1G-LOT70EWCzi4LU_FUkSGWUIBJX15T_J5HnOo,1764
8
- fastapi_voyager/type_helper.py,sha256=TqtYP2_54aar_iQjD0XhjJPXYhfi6icnPPrxkj0a4sk,9523
9
- fastapi_voyager/version.py,sha256=RTrsxEThIEJd6F22bbMAXSloKYEyLTUiKljxyyCXfjQ,49
10
- fastapi_voyager/voyager.py,sha256=nioo56oFDeZ8nwwPWDtaQbkpe4pVssFoBVHCWFhs0K4,13549
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=JgkoMbFTKuufSVVLs9_6mNP2_fDCrQPgTjN3EymBK3Y,19352
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.1.dist-info/METADATA,sha256=huz9XjY9D2KrxDQFgnq1ZJgANwmKZyT0qRRI9btk8uA,6060
30
- fastapi_voyager-0.12.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
31
- fastapi_voyager-0.12.1.dist-info/entry_points.txt,sha256=pEIKoUnIDXEtdMBq8EmXm70m16vELIu1VPz9-TBUFWM,53
32
- fastapi_voyager-0.12.1.dist-info/licenses/LICENSE,sha256=lNVRR3y_bFVoFKuK2JM8N4sFaj3m-7j29kvL3olFi5Y,1067
33
- fastapi_voyager-0.12.1.dist-info/RECORD,,
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,,