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.
Files changed (85) hide show
  1. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/.github/workflows/publish.yml +9 -1
  2. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/PKG-INFO +1 -1
  3. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/docs/changelog.md +13 -2
  4. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/server.py +4 -1
  5. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/version.py +1 -1
  6. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/web/graph-ui.js +38 -3
  7. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/web/index.html +21 -9
  8. fastapi_voyager-0.15.4/src/fastapi_voyager/web/store.js +550 -0
  9. fastapi_voyager-0.15.4/src/fastapi_voyager/web/vue-main.js +333 -0
  10. fastapi_voyager-0.15.2/src/fastapi_voyager/web/store.js +0 -117
  11. fastapi_voyager-0.15.2/src/fastapi_voyager/web/vue-main.js +0 -625
  12. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/.githooks/README.md +0 -0
  13. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/.githooks/pre-commit +0 -0
  14. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  15. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  16. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/.gitignore +0 -0
  17. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/.prettierignore +0 -0
  18. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/.prettierrc +0 -0
  19. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/.python-version +0 -0
  20. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/CONTRIBUTING.md +0 -0
  21. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/LICENSE +0 -0
  22. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/README.md +0 -0
  23. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/docs/claude/0_REFACTORING_RENDER_NOTES.md +0 -0
  24. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/docs/idea.md +0 -0
  25. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/package-lock.json +0 -0
  26. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/pyproject.toml +0 -0
  27. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/release.md +0 -0
  28. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/setup-hooks.sh +0 -0
  29. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/__init__.py +0 -0
  30. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/cli.py +0 -0
  31. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/er_diagram.py +0 -0
  32. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/filter.py +0 -0
  33. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/module.py +0 -0
  34. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/pydantic_resolve_util.py +0 -0
  35. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/render.py +0 -0
  36. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/render_style.py +0 -0
  37. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/templates/dot/cluster.j2 +0 -0
  38. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/templates/dot/cluster_container.j2 +0 -0
  39. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/templates/dot/digraph.j2 +0 -0
  40. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/templates/dot/er_diagram.j2 +0 -0
  41. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/templates/dot/link.j2 +0 -0
  42. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/templates/dot/route_node.j2 +0 -0
  43. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/templates/dot/schema_node.j2 +0 -0
  44. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/templates/dot/tag_node.j2 +0 -0
  45. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/templates/html/colored_text.j2 +0 -0
  46. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/templates/html/pydantic_meta.j2 +0 -0
  47. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/templates/html/schema_field_row.j2 +0 -0
  48. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/templates/html/schema_header.j2 +0 -0
  49. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/templates/html/schema_table.j2 +0 -0
  50. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/type.py +0 -0
  51. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/type_helper.py +0 -0
  52. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/voyager.py +0 -0
  53. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/web/component/demo.js +0 -0
  54. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/web/component/render-graph.js +0 -0
  55. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/web/component/route-code-display.js +0 -0
  56. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/web/component/schema-code-display.js +0 -0
  57. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/web/graphviz.svg.css +0 -0
  58. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/web/graphviz.svg.js +0 -0
  59. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/web/icon/android-chrome-192x192.png +0 -0
  60. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/web/icon/android-chrome-512x512.png +0 -0
  61. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/web/icon/apple-touch-icon.png +0 -0
  62. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/web/icon/favicon-16x16.png +0 -0
  63. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/web/icon/favicon-32x32.png +0 -0
  64. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/web/icon/favicon.ico +0 -0
  65. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/web/icon/site.webmanifest +0 -0
  66. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/web/quasar.min.css +0 -0
  67. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/src/fastapi_voyager/web/quasar.min.js +0 -0
  68. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/tests/__init__.py +0 -0
  69. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/tests/demo.py +0 -0
  70. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/tests/demo_anno.py +0 -0
  71. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/tests/programatic.py +0 -0
  72. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/tests/service/__init__.py +0 -0
  73. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/tests/service/schema/__init__.py +0 -0
  74. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/tests/service/schema/base_entity.py +0 -0
  75. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/tests/service/schema/extra.py +0 -0
  76. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/tests/service/schema/schema.py +0 -0
  77. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/tests/test_analysis.py +0 -0
  78. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/tests/test_filter.py +0 -0
  79. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/tests/test_generic.py +0 -0
  80. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/tests/test_import.py +0 -0
  81. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/tests/test_module.py +0 -0
  82. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/tests/test_resolve_util_impl.py +0 -0
  83. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/tests/test_type_helper.py +0 -0
  84. {fastapi_voyager-0.15.2 → fastapi_voyager-0.15.4}/uv.lock +0 -0
  85. {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: read
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.2
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
- - [ ] refactor vue-main.js, move methods to store
168
- - [ ] add tests
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
- return content.replace(GA_PLACEHOLDER, _build_ga_snippet(ga_id))
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"
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
- const ele = polygons[2] // select the second polygon
74
- if (ele) {
75
- ele.setAttribute("stroke-width", "3.5")
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 rel="stylesheet" href="fastapi-voyager-static/graphviz.svg.css" />
6
- <link rel="stylesheet" href="fastapi-voyager-static/quasar.min.css" />
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 anchor="bottom middle" self="top middle" :offset="[0,8]">
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: 12px"
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 type="module" src="fastapi-voyager-static/vue-main.js"></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>