fastapi-voyager 0.11.2__py3-none-any.whl → 0.11.4__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/server.py +9 -2
- fastapi_voyager/type_helper.py +6 -2
- fastapi_voyager/version.py +1 -1
- fastapi_voyager/web/component/schema-code-display.js +39 -13
- {fastapi_voyager-0.11.2.dist-info → fastapi_voyager-0.11.4.dist-info}/METADATA +5 -2
- {fastapi_voyager-0.11.2.dist-info → fastapi_voyager-0.11.4.dist-info}/RECORD +9 -9
- {fastapi_voyager-0.11.2.dist-info → fastapi_voyager-0.11.4.dist-info}/WHEEL +0 -0
- {fastapi_voyager-0.11.2.dist-info → fastapi_voyager-0.11.4.dist-info}/entry_points.txt +0 -0
- {fastapi_voyager-0.11.2.dist-info → fastapi_voyager-0.11.4.dist-info}/licenses/LICENSE +0 -0
fastapi_voyager/server.py
CHANGED
|
@@ -41,6 +41,7 @@ def create_route(
|
|
|
41
41
|
module_color: dict[str, str] | None = None,
|
|
42
42
|
swagger_url: Optional[str] = None,
|
|
43
43
|
module_prefix: Optional[str] = None,
|
|
44
|
+
online_repo_url: Optional[str] = None,
|
|
44
45
|
):
|
|
45
46
|
"""
|
|
46
47
|
module_color: dict mapping module name to color string, e.g. {'models': 'lightblue'}
|
|
@@ -183,7 +184,7 @@ def create_route(
|
|
|
183
184
|
|
|
184
185
|
mod = __import__(module_name, fromlist=[class_name])
|
|
185
186
|
obj = getattr(mod, class_name)
|
|
186
|
-
link = get_vscode_link(obj)
|
|
187
|
+
link = get_vscode_link(obj, online_repo_url=online_repo_url)
|
|
187
188
|
|
|
188
189
|
return JSONResponse(content={"link": link})
|
|
189
190
|
except ImportError as e:
|
|
@@ -211,8 +212,14 @@ def create_voyager(
|
|
|
211
212
|
gzip_minimum_size: int | None = 500,
|
|
212
213
|
module_prefix: Optional[str] = None,
|
|
213
214
|
swagger_url: Optional[str] = None,
|
|
215
|
+
online_repo_url: Optional[str] = None,
|
|
214
216
|
) -> FastAPI:
|
|
215
|
-
router = create_route(
|
|
217
|
+
router = create_route(
|
|
218
|
+
target_app,
|
|
219
|
+
module_color=module_color,
|
|
220
|
+
module_prefix=module_prefix,
|
|
221
|
+
swagger_url=swagger_url,
|
|
222
|
+
online_repo_url=online_repo_url)
|
|
216
223
|
|
|
217
224
|
app = FastAPI(title="fastapi-voyager demo server")
|
|
218
225
|
if gzip_minimum_size is not None and gzip_minimum_size >= 0:
|
fastapi_voyager/type_helper.py
CHANGED
|
@@ -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, Generic
|
|
4
|
+
from typing import get_origin, get_args, Union, Annotated, Any, Type, Generic, Optional
|
|
5
5
|
from fastapi_voyager.type import FieldInfo
|
|
6
6
|
from types import UnionType
|
|
7
7
|
import pydantic_resolve.constant as const
|
|
@@ -182,7 +182,7 @@ def get_pydantic_fields(schema: type[BaseModel], bases_fields: set[str]) -> list
|
|
|
182
182
|
return fields
|
|
183
183
|
|
|
184
184
|
|
|
185
|
-
def get_vscode_link(kls):
|
|
185
|
+
def get_vscode_link(kls, online_repo_url: Optional[str] = None) -> str:
|
|
186
186
|
"""Build a VSCode deep link to the class definition.
|
|
187
187
|
|
|
188
188
|
Priority:
|
|
@@ -197,6 +197,10 @@ def get_vscode_link(kls):
|
|
|
197
197
|
_lines, start_line = inspect.getsourcelines(kls)
|
|
198
198
|
|
|
199
199
|
distro = os.environ.get("WSL_DISTRO_NAME")
|
|
200
|
+
if online_repo_url:
|
|
201
|
+
cwd = os.getcwd()
|
|
202
|
+
relative_path = os.path.relpath(source_file, cwd)
|
|
203
|
+
return f"{online_repo_url}/{relative_path}#L{start_line}"
|
|
200
204
|
if distro:
|
|
201
205
|
# Ensure absolute path (it should already be under /) and build remote link
|
|
202
206
|
return f"vscode://vscode-remote/wsl+{distro}{source_file}:{start_line}"
|
fastapi_voyager/version.py
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
__all__ = ["__version__"]
|
|
2
|
-
__version__ = "0.11.
|
|
2
|
+
__version__ = "0.11.4"
|
|
@@ -14,6 +14,8 @@ export default defineComponent({
|
|
|
14
14
|
props: {
|
|
15
15
|
schemaName: { type: String, required: true },
|
|
16
16
|
schemas: { type: Object, default: () => ({}) },
|
|
17
|
+
// visibility from parent (e.g., dialog v-model)
|
|
18
|
+
modelValue: { type: Boolean, default: true },
|
|
17
19
|
},
|
|
18
20
|
setup(props, { emit }) {
|
|
19
21
|
const code = ref("");
|
|
@@ -21,6 +23,7 @@ export default defineComponent({
|
|
|
21
23
|
const error = ref("");
|
|
22
24
|
const fields = ref([]); // schema fields list
|
|
23
25
|
const tab = ref("fields");
|
|
26
|
+
const loading = ref(false);
|
|
24
27
|
|
|
25
28
|
|
|
26
29
|
async function highlightLater() {
|
|
@@ -45,12 +48,22 @@ export default defineComponent({
|
|
|
45
48
|
});
|
|
46
49
|
}
|
|
47
50
|
|
|
51
|
+
function resetState() {
|
|
52
|
+
code.value = "";
|
|
53
|
+
link.value = "";
|
|
54
|
+
error.value = null;
|
|
55
|
+
fields.value = [];
|
|
56
|
+
// tab.value = "fields";
|
|
57
|
+
loading.value = true;
|
|
58
|
+
}
|
|
59
|
+
|
|
48
60
|
async function loadSource() {
|
|
49
61
|
if (!props.schemaName) return;
|
|
50
62
|
|
|
51
63
|
error.value = null;
|
|
52
64
|
code.value = "";
|
|
53
65
|
link.value = "";
|
|
66
|
+
loading.value = true;
|
|
54
67
|
|
|
55
68
|
// try to fetch from server: /source/{schema_name}
|
|
56
69
|
const payload = { schema_name: props.schemaName };
|
|
@@ -71,13 +84,8 @@ export default defineComponent({
|
|
|
71
84
|
} else {
|
|
72
85
|
error.value = (data && data.error) || "Failed to load source";
|
|
73
86
|
}
|
|
74
|
-
} catch (e) {
|
|
75
|
-
error.value = "Failed to load source";
|
|
76
|
-
} finally {
|
|
77
|
-
}
|
|
78
87
|
|
|
79
|
-
|
|
80
|
-
const resp = await fetch(`vscode-link`, {
|
|
88
|
+
const resp2 = await fetch(`vscode-link`, {
|
|
81
89
|
method: "POST",
|
|
82
90
|
headers: {
|
|
83
91
|
Accept: "application/json",
|
|
@@ -85,16 +93,16 @@ export default defineComponent({
|
|
|
85
93
|
},
|
|
86
94
|
body: JSON.stringify(payload),
|
|
87
95
|
});
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
link.value = data.link || "// no vscode link available";
|
|
96
|
+
const data2 = await resp2.json().catch(() => ({}));
|
|
97
|
+
if (resp2.ok) {
|
|
98
|
+
link.value = data2.link || "// no vscode link available";
|
|
92
99
|
} else {
|
|
93
|
-
error.value
|
|
100
|
+
error.value = (error.value || "") + ((data2 && data2.error) || "Failed to load source");
|
|
94
101
|
}
|
|
95
102
|
} catch (e) {
|
|
96
103
|
error.value = "Failed to load source";
|
|
97
104
|
} finally {
|
|
105
|
+
loading.value = false;
|
|
98
106
|
}
|
|
99
107
|
|
|
100
108
|
const schema = props.schemas && props.schemas[props.schemaName];
|
|
@@ -118,18 +126,36 @@ export default defineComponent({
|
|
|
118
126
|
watch(
|
|
119
127
|
() => props.schemaName,
|
|
120
128
|
() => {
|
|
129
|
+
resetState();
|
|
121
130
|
loadSource();
|
|
122
131
|
},
|
|
123
132
|
);
|
|
124
133
|
|
|
134
|
+
// respond to visibility changes: when shown, clear old data and reload
|
|
135
|
+
watch(
|
|
136
|
+
() => props.modelValue,
|
|
137
|
+
(val) => {
|
|
138
|
+
if (val) {
|
|
139
|
+
resetState();
|
|
140
|
+
loadSource();
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
);
|
|
144
|
+
|
|
125
145
|
onMounted(() => {
|
|
126
|
-
|
|
146
|
+
if (props.modelValue) {
|
|
147
|
+
resetState();
|
|
148
|
+
loadSource();
|
|
149
|
+
}
|
|
127
150
|
});
|
|
128
151
|
|
|
129
|
-
return { link, code, error, fields, tab };
|
|
152
|
+
return { link, code, error, fields, tab, loading };
|
|
130
153
|
},
|
|
131
154
|
template: `
|
|
132
155
|
<div class="frv-code-display" style="border: 1px solid #ccc; border-left: none; position:relative; height:100%; background:#fff;">
|
|
156
|
+
<div v-show="loading" style="position:absolute; top:0; left:0; right:0; z-index:10;">
|
|
157
|
+
<q-linear-progress indeterminate color="primary" size="2px"/>
|
|
158
|
+
</div>
|
|
133
159
|
<div class="q-ml-lg q-mt-md">
|
|
134
160
|
<a :href="link" target="_blank" rel="noopener" style="font-size:12px; color:#3b82f6;">
|
|
135
161
|
Open in VSCode
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: fastapi-voyager
|
|
3
|
-
Version: 0.11.
|
|
3
|
+
Version: 0.11.4
|
|
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
|
|
@@ -270,7 +270,10 @@ or you can open router_viz.dot with vscode extension `graphviz interactive previ
|
|
|
270
270
|
- 0.11.2
|
|
271
271
|
- [x] enable/disable module cluster (to save space)
|
|
272
272
|
- 0.11.3
|
|
273
|
-
- [
|
|
273
|
+
- [x] support online repo url
|
|
274
|
+
- 0.11.4
|
|
275
|
+
- [x] add loading for field detail panel
|
|
276
|
+
- 0.11.5
|
|
274
277
|
- [ ] logging information
|
|
275
278
|
- [ ] sort field name
|
|
276
279
|
- [ ] set max limit for fields
|
|
@@ -3,10 +3,10 @@ fastapi_voyager/cli.py,sha256=kQb4g6JEGZR99e5r8LyFFEeb_-uT-n_gp_sDoYG3R7k,11118
|
|
|
3
3
|
fastapi_voyager/filter.py,sha256=GY2J9Vfsf_wbFwC-0t74-Lf-OlO77PnhEXD_rmgkfSw,11574
|
|
4
4
|
fastapi_voyager/module.py,sha256=Z2QHNmiLk6ZAJlm2nSmO875Q33TweSg8UxZSzIpU9zY,3499
|
|
5
5
|
fastapi_voyager/render.py,sha256=vdwqIync2wsP8gMPY0v_XjRhdPBtbKyRT8yTBa_Ep3Y,8744
|
|
6
|
-
fastapi_voyager/server.py,sha256=
|
|
6
|
+
fastapi_voyager/server.py,sha256=cRTUQik4rvrdZgfkFabCs6LBZnC1FVU4z3lwd1r8GNk,6839
|
|
7
7
|
fastapi_voyager/type.py,sha256=VmcTB1G-LOT70EWCzi4LU_FUkSGWUIBJX15T_J5HnOo,1764
|
|
8
|
-
fastapi_voyager/type_helper.py,sha256=
|
|
9
|
-
fastapi_voyager/version.py,sha256=
|
|
8
|
+
fastapi_voyager/type_helper.py,sha256=QqP4c642vEkoWTZAtl_Vvt-kys3MkVDp4BNkLrw5mHQ,9477
|
|
9
|
+
fastapi_voyager/version.py,sha256=lobCg9xkZcHdx90ArKw3qvuqtqO2TtEs2LNIn1dQpHg,49
|
|
10
10
|
fastapi_voyager/voyager.py,sha256=hNal25S5Hi_ZRe-gnmdUKt8tnRd-BRCrzaybAEJ_1HI,13498
|
|
11
11
|
fastapi_voyager/web/graph-ui.js,sha256=DTedkpZNbtufexONVkJ8mOwF_-VnvxoReYHtox6IKR4,5842
|
|
12
12
|
fastapi_voyager/web/graphviz.svg.css,sha256=zDCjjpT0Idufu5YOiZI76PL70-avP3vTyzGPh9M85Do,1563
|
|
@@ -17,7 +17,7 @@ fastapi_voyager/web/quasar.min.js,sha256=h0ftyPMW_CRiyzeVfQqiup0vrVt4_QWojpqmpnp
|
|
|
17
17
|
fastapi_voyager/web/vue-main.js,sha256=sUjLmn06jYy1guwxAcouHwkcjxGD2UgZgkiiIEDbk04,10663
|
|
18
18
|
fastapi_voyager/web/component/render-graph.js,sha256=e8Xgh2Kl-nYU0P1gstEmAepCgFnk2J6UdxW8TlMafGs,2322
|
|
19
19
|
fastapi_voyager/web/component/route-code-display.js,sha256=8NJPPjNRUC21gjpY8XYEQs4RBbhX1pCiqEhJp39ku6k,3678
|
|
20
|
-
fastapi_voyager/web/component/schema-code-display.js,sha256=
|
|
20
|
+
fastapi_voyager/web/component/schema-code-display.js,sha256=FjoD3CLl967VMfbZNQMdbiEnS0z-doLJDJIeDCmKGew,6983
|
|
21
21
|
fastapi_voyager/web/component/schema-field-filter.js,sha256=c--XiXJrhIS7sYo1x8ZwMoqak0k9xLkNYTWoli-zd38,6253
|
|
22
22
|
fastapi_voyager/web/icon/android-chrome-192x192.png,sha256=35sBy6jmUFJCcquStaafHH1qClZIbd-X3PIKSeLkrNo,37285
|
|
23
23
|
fastapi_voyager/web/icon/android-chrome-512x512.png,sha256=eb2eDjCwIruc05029_0L9hcrkVkv8KceLn1DJMYU0zY,210789
|
|
@@ -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.11.
|
|
30
|
-
fastapi_voyager-0.11.
|
|
31
|
-
fastapi_voyager-0.11.
|
|
32
|
-
fastapi_voyager-0.11.
|
|
33
|
-
fastapi_voyager-0.11.
|
|
29
|
+
fastapi_voyager-0.11.4.dist-info/METADATA,sha256=OjV-VKj6FgPn3tg_nykssxznKqACjxwN7c_nx4BZKqE,9969
|
|
30
|
+
fastapi_voyager-0.11.4.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
31
|
+
fastapi_voyager-0.11.4.dist-info/entry_points.txt,sha256=pEIKoUnIDXEtdMBq8EmXm70m16vELIu1VPz9-TBUFWM,53
|
|
32
|
+
fastapi_voyager-0.11.4.dist-info/licenses/LICENSE,sha256=lNVRR3y_bFVoFKuK2JM8N4sFaj3m-7j29kvL3olFi5Y,1067
|
|
33
|
+
fastapi_voyager-0.11.4.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|