fastapi-voyager 0.12.7__tar.gz → 0.12.9__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 (58) hide show
  1. {fastapi_voyager-0.12.7 → fastapi_voyager-0.12.9}/PKG-INFO +1 -1
  2. {fastapi_voyager-0.12.7 → fastapi_voyager-0.12.9}/docs/changelog.md +5 -0
  3. {fastapi_voyager-0.12.7 → fastapi_voyager-0.12.9}/src/fastapi_voyager/type_helper.py +6 -2
  4. {fastapi_voyager-0.12.7 → fastapi_voyager-0.12.9}/src/fastapi_voyager/version.py +1 -1
  5. {fastapi_voyager-0.12.7 → fastapi_voyager-0.12.9}/src/fastapi_voyager/web/index.html +22 -21
  6. {fastapi_voyager-0.12.7 → fastapi_voyager-0.12.9}/src/fastapi_voyager/web/vue-main.js +13 -16
  7. {fastapi_voyager-0.12.7 → fastapi_voyager-0.12.9}/tests/programatic.py +3 -3
  8. {fastapi_voyager-0.12.7 → fastapi_voyager-0.12.9}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  9. {fastapi_voyager-0.12.7 → fastapi_voyager-0.12.9}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  10. {fastapi_voyager-0.12.7 → fastapi_voyager-0.12.9}/.github/workflows/publish.yml +0 -0
  11. {fastapi_voyager-0.12.7 → fastapi_voyager-0.12.9}/.gitignore +0 -0
  12. {fastapi_voyager-0.12.7 → fastapi_voyager-0.12.9}/.python-version +0 -0
  13. {fastapi_voyager-0.12.7 → fastapi_voyager-0.12.9}/CONTRIBUTING.md +0 -0
  14. {fastapi_voyager-0.12.7 → fastapi_voyager-0.12.9}/LICENSE +0 -0
  15. {fastapi_voyager-0.12.7 → fastapi_voyager-0.12.9}/README.md +0 -0
  16. {fastapi_voyager-0.12.7 → fastapi_voyager-0.12.9}/docs/idea.md +0 -0
  17. {fastapi_voyager-0.12.7 → fastapi_voyager-0.12.9}/pyproject.toml +0 -0
  18. {fastapi_voyager-0.12.7 → fastapi_voyager-0.12.9}/release.md +0 -0
  19. {fastapi_voyager-0.12.7 → fastapi_voyager-0.12.9}/src/fastapi_voyager/__init__.py +0 -0
  20. {fastapi_voyager-0.12.7 → fastapi_voyager-0.12.9}/src/fastapi_voyager/cli.py +0 -0
  21. {fastapi_voyager-0.12.7 → fastapi_voyager-0.12.9}/src/fastapi_voyager/filter.py +0 -0
  22. {fastapi_voyager-0.12.7 → fastapi_voyager-0.12.9}/src/fastapi_voyager/module.py +0 -0
  23. {fastapi_voyager-0.12.7 → fastapi_voyager-0.12.9}/src/fastapi_voyager/render.py +0 -0
  24. {fastapi_voyager-0.12.7 → fastapi_voyager-0.12.9}/src/fastapi_voyager/server.py +0 -0
  25. {fastapi_voyager-0.12.7 → fastapi_voyager-0.12.9}/src/fastapi_voyager/type.py +0 -0
  26. {fastapi_voyager-0.12.7 → fastapi_voyager-0.12.9}/src/fastapi_voyager/voyager.py +0 -0
  27. {fastapi_voyager-0.12.7 → fastapi_voyager-0.12.9}/src/fastapi_voyager/web/component/demo.js +0 -0
  28. {fastapi_voyager-0.12.7 → fastapi_voyager-0.12.9}/src/fastapi_voyager/web/component/render-graph.js +0 -0
  29. {fastapi_voyager-0.12.7 → fastapi_voyager-0.12.9}/src/fastapi_voyager/web/component/route-code-display.js +0 -0
  30. {fastapi_voyager-0.12.7 → fastapi_voyager-0.12.9}/src/fastapi_voyager/web/component/schema-code-display.js +0 -0
  31. {fastapi_voyager-0.12.7 → fastapi_voyager-0.12.9}/src/fastapi_voyager/web/graph-ui.js +0 -0
  32. {fastapi_voyager-0.12.7 → fastapi_voyager-0.12.9}/src/fastapi_voyager/web/graphviz.svg.css +0 -0
  33. {fastapi_voyager-0.12.7 → fastapi_voyager-0.12.9}/src/fastapi_voyager/web/graphviz.svg.js +0 -0
  34. {fastapi_voyager-0.12.7 → fastapi_voyager-0.12.9}/src/fastapi_voyager/web/icon/android-chrome-192x192.png +0 -0
  35. {fastapi_voyager-0.12.7 → fastapi_voyager-0.12.9}/src/fastapi_voyager/web/icon/android-chrome-512x512.png +0 -0
  36. {fastapi_voyager-0.12.7 → fastapi_voyager-0.12.9}/src/fastapi_voyager/web/icon/apple-touch-icon.png +0 -0
  37. {fastapi_voyager-0.12.7 → fastapi_voyager-0.12.9}/src/fastapi_voyager/web/icon/favicon-16x16.png +0 -0
  38. {fastapi_voyager-0.12.7 → fastapi_voyager-0.12.9}/src/fastapi_voyager/web/icon/favicon-32x32.png +0 -0
  39. {fastapi_voyager-0.12.7 → fastapi_voyager-0.12.9}/src/fastapi_voyager/web/icon/favicon.ico +0 -0
  40. {fastapi_voyager-0.12.7 → fastapi_voyager-0.12.9}/src/fastapi_voyager/web/icon/site.webmanifest +0 -0
  41. {fastapi_voyager-0.12.7 → fastapi_voyager-0.12.9}/src/fastapi_voyager/web/quasar.min.css +0 -0
  42. {fastapi_voyager-0.12.7 → fastapi_voyager-0.12.9}/src/fastapi_voyager/web/quasar.min.js +0 -0
  43. {fastapi_voyager-0.12.7 → fastapi_voyager-0.12.9}/src/fastapi_voyager/web/store.js +0 -0
  44. {fastapi_voyager-0.12.7 → fastapi_voyager-0.12.9}/tests/__init__.py +0 -0
  45. {fastapi_voyager-0.12.7 → fastapi_voyager-0.12.9}/tests/demo.py +0 -0
  46. {fastapi_voyager-0.12.7 → fastapi_voyager-0.12.9}/tests/demo_anno.py +0 -0
  47. {fastapi_voyager-0.12.7 → fastapi_voyager-0.12.9}/tests/service/__init__.py +0 -0
  48. {fastapi_voyager-0.12.7 → fastapi_voyager-0.12.9}/tests/service/schema/__init__.py +0 -0
  49. {fastapi_voyager-0.12.7 → fastapi_voyager-0.12.9}/tests/service/schema/extra.py +0 -0
  50. {fastapi_voyager-0.12.7 → fastapi_voyager-0.12.9}/tests/service/schema/schema.py +0 -0
  51. {fastapi_voyager-0.12.7 → fastapi_voyager-0.12.9}/tests/test_analysis.py +0 -0
  52. {fastapi_voyager-0.12.7 → fastapi_voyager-0.12.9}/tests/test_filter.py +0 -0
  53. {fastapi_voyager-0.12.7 → fastapi_voyager-0.12.9}/tests/test_generic.py +0 -0
  54. {fastapi_voyager-0.12.7 → fastapi_voyager-0.12.9}/tests/test_import.py +0 -0
  55. {fastapi_voyager-0.12.7 → fastapi_voyager-0.12.9}/tests/test_module.py +0 -0
  56. {fastapi_voyager-0.12.7 → fastapi_voyager-0.12.9}/tests/test_type_helper.py +0 -0
  57. {fastapi_voyager-0.12.7 → fastapi_voyager-0.12.9}/uv.lock +0 -0
  58. {fastapi_voyager-0.12.7 → fastapi_voyager-0.12.9}/voyager.jpg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fastapi-voyager
3
- Version: 0.12.7
3
+ Version: 0.12.9
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
@@ -122,6 +122,11 @@
122
122
  - 0.12.7
123
123
  - [x] remove search component, integrated into main page
124
124
  - 0.12.8
125
+ - [x] optimize ui elements, change icons, update reset behavior
126
+ - 0.12.9
127
+ - [x] fix: handle logging exception for forward ref info, preventing crash
128
+ - 0.12.10
129
+ - [ ] fix: pick tag and then pick route directly from another tag will render nothing
125
130
  - [ ] refactor vue-main.js, move methods to store
126
131
  - [ ] refactor render.py
127
132
 
@@ -2,7 +2,7 @@ import inspect
2
2
  import logging
3
3
  import os
4
4
  from types import UnionType
5
- from typing import Annotated, Any, Generic, Union, get_args, get_origin
5
+ from typing import Annotated, Any, Generic, Union, get_args, get_origin, ForwardRef
6
6
 
7
7
  import pydantic_resolve.constant as const
8
8
  from pydantic import BaseModel
@@ -237,7 +237,11 @@ def safe_issubclass(kls, target_kls):
237
237
  try:
238
238
  return issubclass(kls, target_kls)
239
239
  except TypeError:
240
- logger.debug(f'{kls.__module__}:{kls.__qualname__} is not subclass of {target_kls.__module__}:{target_kls.__qualname__}')
240
+ # if kls is ForwardRef, log it
241
+ if isinstance(kls, ForwardRef):
242
+ logger.error(f'{str(kls)} is a ForwardRef, not a subclass of {target_kls.__module__}:{target_kls.__qualname__}')
243
+ else:
244
+ logger.debug(f'{kls.__module__}:{kls.__qualname__} is not subclass of {target_kls.__module__}:{target_kls.__qualname__}')
241
245
  return False
242
246
 
243
247
 
@@ -1,2 +1,2 @@
1
1
  __all__ = ["__version__"]
2
- __version__ = "0.12.7"
2
+ __version__ = "0.12.9"
@@ -55,6 +55,12 @@
55
55
  flex: 1 1 auto;
56
56
  overflow: auto;
57
57
  }
58
+ .tag-bg {
59
+ /* background-color: #287e75; */
60
+ /* border-bottom: 2px solid #009485;
61
+ border-left: 2px solid #009485;
62
+ border-top: 0; */
63
+ }
58
64
 
59
65
  .adjust-fit {
60
66
  height: calc(100vh - 54px);
@@ -107,9 +113,20 @@
107
113
  <span> FastAPI Voyager </span>
108
114
  <span v-if="store.state.version" style="font-size: 12px; margin-left: 8px; font-weight: normal;">{{ store.state.version }}</span>
109
115
  </div>
116
+ <div class="col-auto">
117
+ <q-btn
118
+ style="margin-left: 80px"
119
+ outline
120
+ @click="onReset"
121
+ title="clear tag, route selection"
122
+ icon="open_in_full"
123
+ color="primary"
124
+ flat
125
+ class="q-mx-md"
126
+ />
127
+ </div>
110
128
  <div class="col-auto" style="font-size: 16px">
111
129
  <q-option-group
112
- style="margin-left: 80px"
113
130
  v-model="store.state.filter.showFields"
114
131
  :options="store.state.fieldOptions"
115
132
  @update:model-value="(val) => toggleShowField(val)"
@@ -149,28 +166,11 @@
149
166
  v-model="store.state.search.fieldName"
150
167
  :disable="!store.state.search.schemaName || store.state.search.fieldOptions.length===0"
151
168
  :options="store.state.search.fieldOptions"
169
+ @update:model-value="onSearch"
152
170
  style="min-width: 180px"
153
171
  clearable
154
172
  label="Select field (optional)"
155
173
  ></q-select>
156
- <q-btn
157
- outline
158
- icon="search"
159
- flat
160
- class="q-mr-none"
161
- :disable="!store.state.search.schemaName"
162
- :loading="store.state.generating"
163
- @click="onSearch"
164
- ></q-btn>
165
- <q-btn
166
- outline
167
- @click="onReset"
168
- dense
169
- title="full graph"
170
- icon="border_all"
171
- flat
172
- class="q-mr-sm"
173
- />
174
174
  </div>
175
175
  <div class="col-auto">
176
176
  <q-btn
@@ -179,7 +179,7 @@
179
179
  flat
180
180
  icon="help_outline"
181
181
  aria-label="Help"
182
- style="margin-right: 40px"
182
+ style="margin-right: 50px; margin-left: 20px"
183
183
  >
184
184
  <q-tooltip
185
185
  anchor="bottom middle"
@@ -272,7 +272,8 @@
272
272
  expand-separator
273
273
  :model-value="store.state.leftPanel._tag === tag.name || store.state.search.mode"
274
274
  @update:model-value="(val) => toggleTag(tag.name, val)"
275
- :header-class="store.state.leftPanel.tag === tag.name ? 'text-primary text-bold' : ''"
275
+ @click="() => toggleTag(tag.name, true)"
276
+ :header-class="store.state.leftPanel.tag === tag.name ? 'text-primary text-bold tag-bg' : 'tag-bg'"
276
277
  content-class="q-pa-none"
277
278
  >
278
279
  <template #header>
@@ -64,6 +64,7 @@ const app = createApp({
64
64
  function onSearchSchemaChange(val) {
65
65
  store.state.search.schemaName = val;
66
66
  store.state.search.mode = false;
67
+ onSearch()
67
68
  }
68
69
 
69
70
  function readQuerySelection() {
@@ -134,15 +135,18 @@ const app = createApp({
134
135
  store.state.leftPanel.tag = null;
135
136
  store.state.leftPanel._tag = null;
136
137
  store.state.leftPanel.routeId = null;
138
+ syncSelectionToUrl()
137
139
  await loadSearchedTags();
138
140
  renderBasedOnInitialPolicy()
139
141
  }
140
142
 
141
143
  async function onSearch() {
144
+ console.log('start search')
142
145
  store.state.search.mode = true;
143
146
  store.state.leftPanel.tag = null;
144
147
  store.state.leftPanel._tag = null;
145
148
  store.state.leftPanel.routeId = null;
149
+ syncSelectionToUrl()
146
150
  await loadSearchedTags();
147
151
  await onGenerate();
148
152
  }
@@ -203,9 +207,10 @@ const app = createApp({
203
207
  syncSelectionToUrl();
204
208
  onGenerate();
205
209
  return;
210
+ } else {
211
+ store.state.config.initial_page_policy = data.initial_page_policy
212
+ renderBasedOnInitialPolicy()
206
213
  }
207
- store.state.config.initial_page_policy = data.initial_page_policy
208
- renderBasedOnInitialPolicy()
209
214
 
210
215
  // default route options placeholder
211
216
  } catch (e) {
@@ -228,6 +233,7 @@ const app = createApp({
228
233
  ? store.state.leftPanel.tags[0].name
229
234
  : null;
230
235
  store.state.leftPanel._tag = store.state.leftPanel.tag;
236
+ syncSelectionToUrl()
231
237
  onGenerate();
232
238
  return;
233
239
  }
@@ -300,20 +306,11 @@ const app = createApp({
300
306
  }
301
307
 
302
308
  async function onReset() {
303
- store.state.leftPanel.tag = null;
304
- store.state.leftPanel._tag = null;
305
- store.state.leftPanel.routeId = null;
306
-
307
- store.state.graph.schemaId = null;
308
-
309
- store.state.search.mode = false;
310
- store.state.search.schemaName = null;
311
- store.state.search.fieldName = null;
312
- store.state.search.fieldOptions = [];
313
- store.state.search.schemaOptions = allSchemaOptions.value.slice();
314
-
315
- store.state.schemaDetail.schemaCodeName = "";
316
- resetSearch()
309
+ store.state.leftPanel.tag = null;
310
+ store.state.leftPanel._tag = null;
311
+ store.state.leftPanel.routeId = null;
312
+ syncSelectionToUrl()
313
+ onGenerate()
317
314
  }
318
315
 
319
316
  function toggleTag(tagName, expanded = null) {
@@ -1,12 +1,12 @@
1
1
  from fastapi_voyager import create_voyager
2
- # from tests.demo_anno import app
3
- from tests.demo import app
2
+ from tests.demo_anno import app
3
+ # from tests.demo import app
4
4
 
5
5
  app.mount(
6
6
  '/voyager',
7
7
  create_voyager(
8
8
  app,
9
- module_color={"tests.service": "purple", "tests.demo": "#00b1cc", "tests": "green"},
9
+ module_color={"tests.service": "purple"},
10
10
  module_prefix="tests.service",
11
11
  swagger_url="/docs",
12
12
  initial_page_policy='first',