fastapi-voyager 0.15.2__tar.gz → 0.15.4__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.
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/.github/workflows/publish.yml +9 -1
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/PKG-INFO +1 -1
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/docs/changelog.md +13 -2
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/server.py +4 -1
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/version.py +1 -1
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/web/graph-ui.js +38 -3
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/web/index.html +21 -9
- fastapi_voyager-0.15.4/src/fastapi_voyager/web/store.js +550 -0
- fastapi_voyager-0.15.4/src/fastapi_voyager/web/vue-main.js +333 -0
- fastapi_voyager-0.15.2/src/fastapi_voyager/web/store.js +0 -117
- fastapi_voyager-0.15.2/src/fastapi_voyager/web/vue-main.js +0 -625
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/.githooks/README.md +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/.githooks/pre-commit +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/.gitignore +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/.prettierignore +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/.prettierrc +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/.python-version +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/CONTRIBUTING.md +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/LICENSE +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/README.md +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/docs/claude/0_REFACTORING_RENDER_NOTES.md +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/docs/idea.md +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/package-lock.json +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/pyproject.toml +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/release.md +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/setup-hooks.sh +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/__init__.py +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/cli.py +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/er_diagram.py +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/filter.py +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/module.py +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/pydantic_resolve_util.py +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/render.py +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/render_style.py +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/templates/dot/cluster.j2 +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/templates/dot/cluster_container.j2 +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/templates/dot/digraph.j2 +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/templates/dot/er_diagram.j2 +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/templates/dot/link.j2 +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/templates/dot/route_node.j2 +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/templates/dot/schema_node.j2 +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/templates/dot/tag_node.j2 +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/templates/html/colored_text.j2 +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/templates/html/pydantic_meta.j2 +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/templates/html/schema_field_row.j2 +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/templates/html/schema_header.j2 +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/templates/html/schema_table.j2 +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/type.py +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/type_helper.py +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/voyager.py +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/web/component/demo.js +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/web/component/render-graph.js +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/web/component/route-code-display.js +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/web/component/schema-code-display.js +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/web/graphviz.svg.css +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/web/graphviz.svg.js +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/web/icon/android-chrome-192x192.png +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/web/icon/android-chrome-512x512.png +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/web/icon/apple-touch-icon.png +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/web/icon/favicon-16x16.png +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/web/icon/favicon-32x32.png +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/web/icon/favicon.ico +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/web/icon/site.webmanifest +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/web/quasar.min.css +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/web/quasar.min.js +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/tests/__init__.py +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/tests/demo.py +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/tests/demo_anno.py +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/tests/programatic.py +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/tests/service/__init__.py +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/tests/service/schema/__init__.py +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/tests/service/schema/base_entity.py +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/tests/service/schema/extra.py +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/tests/service/schema/schema.py +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/tests/test_analysis.py +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/tests/test_filter.py +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/tests/test_generic.py +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/tests/test_import.py +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/tests/test_module.py +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/tests/test_resolve_util_impl.py +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/tests/test_type_helper.py +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/uv.lock +0 -0
- {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/voyager.jpg +0 -0
|
@@ -11,7 +11,7 @@ jobs:
|
|
|
11
11
|
runs-on: ubuntu-latest
|
|
12
12
|
|
|
13
13
|
permissions:
|
|
14
|
-
contents:
|
|
14
|
+
contents: write
|
|
15
15
|
|
|
16
16
|
steps:
|
|
17
17
|
- name: Checkout repository
|
|
@@ -30,3 +30,11 @@ jobs:
|
|
|
30
30
|
|
|
31
31
|
- name: Publish to PyPI
|
|
32
32
|
run: uv publish --token ${{ secrets.PYPI_PUBLISHER }}
|
|
33
|
+
|
|
34
|
+
- name: Create GitHub Release
|
|
35
|
+
uses: softprops/action-gh-release@v2
|
|
36
|
+
with:
|
|
37
|
+
generate_release_notes: true
|
|
38
|
+
files: |
|
|
39
|
+
dist/*.tar.gz
|
|
40
|
+
dist/*.whl
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: fastapi-voyager
|
|
3
|
-
Version: 0.15.
|
|
3
|
+
Version: 0.15.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
|
|
@@ -164,9 +164,20 @@
|
|
|
164
164
|
- [x] fix resetSearch issue: fail to go back previous tag/router after reset.
|
|
165
165
|
- [x] left panel can be toggled.
|
|
166
166
|
- 0.15.3
|
|
167
|
-
- [
|
|
168
|
-
- [
|
|
167
|
+
- [x] refactor vue-main.js, move methods to store
|
|
168
|
+
- [x] optimize search flow
|
|
169
|
+
- 0.15.4
|
|
170
|
+
- [x] static files cache buster
|
|
171
|
+
- [x] store voyager/erd toggle value in url query string
|
|
172
|
+
- [x] set highlight style
|
|
173
|
+
|
|
174
|
+
## 0.16, enhance er diagram
|
|
175
|
+
- 0.16.0
|
|
176
|
+
- [ ] show loader name
|
|
177
|
+
- [ ] show relationship list when double click entity in er diagram
|
|
178
|
+
- [ ] highlight entity in use case
|
|
169
179
|
|
|
170
180
|
## 1.0, release
|
|
181
|
+
- [ ] add tests
|
|
171
182
|
|
|
172
183
|
|
|
@@ -19,6 +19,7 @@ WEB_DIR = Path(__file__).parent / "web"
|
|
|
19
19
|
WEB_DIR.mkdir(exist_ok=True)
|
|
20
20
|
|
|
21
21
|
GA_PLACEHOLDER = "<!-- GA_SNIPPET -->"
|
|
22
|
+
VERSION_PLACEHOLDER = "<!-- VERSION_PLACEHOLDER -->"
|
|
22
23
|
|
|
23
24
|
def _build_ga_snippet(ga_id: str | None) -> str:
|
|
24
25
|
if not ga_id:
|
|
@@ -197,7 +198,9 @@ def create_voyager(
|
|
|
197
198
|
index_file = WEB_DIR / "index.html"
|
|
198
199
|
if index_file.exists():
|
|
199
200
|
content = index_file.read_text(encoding="utf-8")
|
|
200
|
-
|
|
201
|
+
content = content.replace(GA_PLACEHOLDER, _build_ga_snippet(ga_id))
|
|
202
|
+
content = content.replace(VERSION_PLACEHOLDER, f"?v={__version__}")
|
|
203
|
+
return content
|
|
201
204
|
# fallback simple page if index.html missing
|
|
202
205
|
return """
|
|
203
206
|
<!doctype html>
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
__all__ = ["__version__"]
|
|
2
|
-
__version__ = "0.15.
|
|
2
|
+
__version__ = "0.15.4"
|
|
@@ -69,10 +69,45 @@ export class GraphUI {
|
|
|
69
69
|
}
|
|
70
70
|
|
|
71
71
|
highlightSchemaBanner(node) {
|
|
72
|
+
// Get all polygons in the node
|
|
72
73
|
const polygons = node.querySelectorAll("polygon")
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
74
|
+
|
|
75
|
+
// The first polygon is typically the outer frame of the entire node
|
|
76
|
+
const outerFrame = polygons[0]
|
|
77
|
+
// The second polygon is typically the title background
|
|
78
|
+
const titleBg = polygons[1]
|
|
79
|
+
|
|
80
|
+
if (outerFrame) {
|
|
81
|
+
// Save original attributes for potential restoration
|
|
82
|
+
if (!outerFrame.hasAttribute("data-original-stroke")) {
|
|
83
|
+
outerFrame.setAttribute("data-original-stroke", outerFrame.getAttribute("stroke") || "")
|
|
84
|
+
outerFrame.setAttribute(
|
|
85
|
+
"data-original-stroke-width",
|
|
86
|
+
outerFrame.getAttribute("stroke-width") || "1"
|
|
87
|
+
)
|
|
88
|
+
outerFrame.setAttribute("data-original-fill", outerFrame.getAttribute("fill") || "")
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Apply bold purple border to the outer frame
|
|
92
|
+
outerFrame.setAttribute("stroke", "#822dba")
|
|
93
|
+
outerFrame.setAttribute("stroke-width", "3.0")
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
if (titleBg) {
|
|
97
|
+
// Save original attributes
|
|
98
|
+
if (!titleBg.hasAttribute("data-original-stroke")) {
|
|
99
|
+
titleBg.setAttribute("data-original-stroke", titleBg.getAttribute("stroke") || "")
|
|
100
|
+
titleBg.setAttribute(
|
|
101
|
+
"data-original-stroke-width",
|
|
102
|
+
titleBg.getAttribute("stroke-width") || "1"
|
|
103
|
+
)
|
|
104
|
+
titleBg.setAttribute("data-original-fill", titleBg.getAttribute("fill") || "")
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Apply purple background to title
|
|
108
|
+
titleBg.setAttribute("fill", "#822dba")
|
|
109
|
+
// Also update the stroke to match
|
|
110
|
+
titleBg.setAttribute("stroke", "#822dba")
|
|
76
111
|
}
|
|
77
112
|
}
|
|
78
113
|
|
|
@@ -2,8 +2,14 @@
|
|
|
2
2
|
<head>
|
|
3
3
|
<title>FastAPI Voyager</title>
|
|
4
4
|
<meta name="theme-color" content="#ffffff" />
|
|
5
|
-
<link
|
|
6
|
-
|
|
5
|
+
<link
|
|
6
|
+
rel="stylesheet"
|
|
7
|
+
href="fastapi-voyager-static/graphviz.svg.css<!-- VERSION_PLACEHOLDER -->"
|
|
8
|
+
/>
|
|
9
|
+
<link
|
|
10
|
+
rel="stylesheet"
|
|
11
|
+
href="fastapi-voyager-static/quasar.min.css<!-- VERSION_PLACEHOLDER -->"
|
|
12
|
+
/>
|
|
7
13
|
<!-- App Icons / Favicons -->
|
|
8
14
|
<link
|
|
9
15
|
rel="apple-touch-icon"
|
|
@@ -111,8 +117,6 @@
|
|
|
111
117
|
border-radius: 50%;
|
|
112
118
|
background: #009485;
|
|
113
119
|
color: white;
|
|
114
|
-
border: 2px solid white;
|
|
115
|
-
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
|
|
116
120
|
cursor: pointer;
|
|
117
121
|
display: flex;
|
|
118
122
|
align-items: center;
|
|
@@ -284,10 +288,15 @@
|
|
|
284
288
|
aria-label="Help"
|
|
285
289
|
style="margin-right: 50px; margin-left: 20px"
|
|
286
290
|
>
|
|
287
|
-
<q-tooltip
|
|
291
|
+
<q-tooltip
|
|
292
|
+
anchor="bottom middle"
|
|
293
|
+
self="top middle"
|
|
294
|
+
:offset="[0,8]"
|
|
295
|
+
style="background-color: #f5f5f5; color: black; border: 1px solid #666"
|
|
296
|
+
>
|
|
288
297
|
<div
|
|
289
298
|
class="column items-start text-left"
|
|
290
|
-
style="line-height: 1.4; font-size:
|
|
299
|
+
style="line-height: 1.4; font-size: 14px"
|
|
291
300
|
>
|
|
292
301
|
<ul>
|
|
293
302
|
<li>scroll to zoom in/out</li>
|
|
@@ -571,7 +580,7 @@
|
|
|
571
580
|
</q-dialog>
|
|
572
581
|
</div>
|
|
573
582
|
<script src="https://unpkg.com/vue@3/dist/vue.global.prod.js"></script>
|
|
574
|
-
<script src="fastapi-voyager-static/quasar.min.js"></script>
|
|
583
|
+
<script src="fastapi-voyager-static/quasar.min.js<!-- VERSION_PLACEHOLDER -->"></script>
|
|
575
584
|
<script
|
|
576
585
|
src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"
|
|
577
586
|
integrity="sha512-egJ/Y+22P9NQ9aIyVCh0VCOsfydyn8eNmqBy+y2CnJG+fpRIxXMS6jbWP8tVKp0jp+NO5n8WtMUAnNnGoJKi4w=="
|
|
@@ -593,7 +602,7 @@
|
|
|
593
602
|
></script>
|
|
594
603
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-mousewheel/3.1.13/jquery.mousewheel.min.js"></script>
|
|
595
604
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-color/2.1.2/jquery.color.min.js"></script>
|
|
596
|
-
<script src="fastapi-voyager-static/graphviz.svg.js"></script>
|
|
605
|
+
<script src="fastapi-voyager-static/graphviz.svg.js<!-- VERSION_PLACEHOLDER -->"></script>
|
|
597
606
|
<!-- highlight.js minimal ES module load (python only) -->
|
|
598
607
|
<link
|
|
599
608
|
rel="stylesheet"
|
|
@@ -615,7 +624,10 @@
|
|
|
615
624
|
}
|
|
616
625
|
})
|
|
617
626
|
</script>
|
|
618
|
-
<script
|
|
627
|
+
<script
|
|
628
|
+
type="module"
|
|
629
|
+
src="fastapi-voyager-static/vue-main.js<!-- VERSION_PLACEHOLDER -->"
|
|
630
|
+
></script>
|
|
619
631
|
|
|
620
632
|
<!-- GA_SNIPPET -->
|
|
621
633
|
</body>
|