fastapi-voyager 0.14.1__tar.gz → 0.15.0__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 (77) hide show
  1. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/PKG-INFO +3 -2
  2. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/docs/changelog.md +3 -2
  3. fastapi_voyager-0.15.0/docs/claude/0_REFACTORING_RENDER_NOTES.md +194 -0
  4. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/pyproject.toml +2 -1
  5. fastapi_voyager-0.15.0/src/fastapi_voyager/render.py +503 -0
  6. fastapi_voyager-0.15.0/src/fastapi_voyager/render_style.py +105 -0
  7. fastapi_voyager-0.15.0/src/fastapi_voyager/templates/dot/cluster.j2 +10 -0
  8. fastapi_voyager-0.15.0/src/fastapi_voyager/templates/dot/cluster_container.j2 +9 -0
  9. fastapi_voyager-0.15.0/src/fastapi_voyager/templates/dot/digraph.j2 +25 -0
  10. fastapi_voyager-0.15.0/src/fastapi_voyager/templates/dot/link.j2 +1 -0
  11. fastapi_voyager-0.15.0/src/fastapi_voyager/templates/dot/route_node.j2 +5 -0
  12. fastapi_voyager-0.15.0/src/fastapi_voyager/templates/dot/schema_node.j2 +5 -0
  13. fastapi_voyager-0.15.0/src/fastapi_voyager/templates/dot/tag_node.j2 +5 -0
  14. fastapi_voyager-0.15.0/src/fastapi_voyager/templates/html/colored_text.j2 +1 -0
  15. fastapi_voyager-0.15.0/src/fastapi_voyager/templates/html/pydantic_meta.j2 +1 -0
  16. fastapi_voyager-0.15.0/src/fastapi_voyager/templates/html/schema_field_row.j2 +1 -0
  17. fastapi_voyager-0.15.0/src/fastapi_voyager/templates/html/schema_header.j2 +2 -0
  18. fastapi_voyager-0.15.0/src/fastapi_voyager/templates/html/schema_table.j2 +4 -0
  19. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/src/fastapi_voyager/version.py +1 -1
  20. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/uv.lock +103 -4
  21. fastapi_voyager-0.14.1/src/fastapi_voyager/render.py +0 -283
  22. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  23. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  24. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/.github/workflows/publish.yml +0 -0
  25. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/.gitignore +0 -0
  26. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/.python-version +0 -0
  27. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/CONTRIBUTING.md +0 -0
  28. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/LICENSE +0 -0
  29. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/README.md +0 -0
  30. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/docs/idea.md +0 -0
  31. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/release.md +0 -0
  32. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/src/fastapi_voyager/__init__.py +0 -0
  33. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/src/fastapi_voyager/cli.py +0 -0
  34. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/src/fastapi_voyager/er_diagram.py +0 -0
  35. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/src/fastapi_voyager/filter.py +0 -0
  36. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/src/fastapi_voyager/module.py +0 -0
  37. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/src/fastapi_voyager/pydantic_resolve_util.py +0 -0
  38. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/src/fastapi_voyager/server.py +0 -0
  39. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/src/fastapi_voyager/type.py +0 -0
  40. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/src/fastapi_voyager/type_helper.py +0 -0
  41. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/src/fastapi_voyager/voyager.py +0 -0
  42. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/src/fastapi_voyager/web/component/demo.js +0 -0
  43. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/src/fastapi_voyager/web/component/render-graph.js +0 -0
  44. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/src/fastapi_voyager/web/component/route-code-display.js +0 -0
  45. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/src/fastapi_voyager/web/component/schema-code-display.js +0 -0
  46. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/src/fastapi_voyager/web/graph-ui.js +0 -0
  47. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/src/fastapi_voyager/web/graphviz.svg.css +0 -0
  48. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/src/fastapi_voyager/web/graphviz.svg.js +0 -0
  49. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/src/fastapi_voyager/web/icon/android-chrome-192x192.png +0 -0
  50. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/src/fastapi_voyager/web/icon/android-chrome-512x512.png +0 -0
  51. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/src/fastapi_voyager/web/icon/apple-touch-icon.png +0 -0
  52. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/src/fastapi_voyager/web/icon/favicon-16x16.png +0 -0
  53. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/src/fastapi_voyager/web/icon/favicon-32x32.png +0 -0
  54. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/src/fastapi_voyager/web/icon/favicon.ico +0 -0
  55. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/src/fastapi_voyager/web/icon/site.webmanifest +0 -0
  56. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/src/fastapi_voyager/web/index.html +0 -0
  57. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/src/fastapi_voyager/web/quasar.min.css +0 -0
  58. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/src/fastapi_voyager/web/quasar.min.js +0 -0
  59. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/src/fastapi_voyager/web/store.js +0 -0
  60. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/src/fastapi_voyager/web/vue-main.js +0 -0
  61. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/tests/__init__.py +0 -0
  62. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/tests/demo.py +0 -0
  63. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/tests/demo_anno.py +0 -0
  64. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/tests/programatic.py +0 -0
  65. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/tests/service/__init__.py +0 -0
  66. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/tests/service/schema/__init__.py +0 -0
  67. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/tests/service/schema/base_entity.py +0 -0
  68. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/tests/service/schema/extra.py +0 -0
  69. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/tests/service/schema/schema.py +0 -0
  70. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/tests/test_analysis.py +0 -0
  71. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/tests/test_filter.py +0 -0
  72. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/tests/test_generic.py +0 -0
  73. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/tests/test_import.py +0 -0
  74. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/tests/test_module.py +0 -0
  75. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/tests/test_resolve_util_impl.py +0 -0
  76. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/tests/test_type_helper.py +0 -0
  77. {fastapi_voyager-0.14.1 → fastapi_voyager-0.15.0}/voyager.jpg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fastapi-voyager
3
- Version: 0.14.1
3
+ Version: 0.15.0
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
@@ -19,7 +19,8 @@ Classifier: Programming Language :: Python :: 3.13
19
19
  Classifier: Programming Language :: Python :: 3.14
20
20
  Requires-Python: >=3.10
21
21
  Requires-Dist: fastapi>=0.110
22
- Requires-Dist: pydantic-resolve>=2.3.1
22
+ Requires-Dist: jinja2>=3.0.0
23
+ Requires-Dist: pydantic-resolve>=2.4.3
23
24
  Provides-Extra: dev
24
25
  Requires-Dist: pytest; extra == 'dev'
25
26
  Requires-Dist: ruff; extra == 'dev'
@@ -154,10 +154,11 @@
154
154
 
155
155
  ## 0.15, internal refactor
156
156
  - 0.15.0
157
+ - [x] refactor render.py
158
+ - 0.15.1
159
+ - [ ] add tests
157
160
  - [ ] left panel can be toggled.
158
161
  - [ ] refactor vue-main.js, move methods to store
159
- - [ ] refactor render.py
160
- - [ ] add tests
161
162
 
162
163
  ## 1.0, release
163
164
 
@@ -0,0 +1,194 @@
1
+ # Jinja2 模板引擎重构说明
2
+
3
+ ## 概述
4
+
5
+ 已成功将 `render.py` 从硬编码的模板字符串重构为使用 Jinja2 模板引擎的架构。
6
+
7
+ ## 变更内容
8
+
9
+ ### 1. 新增文件
10
+
11
+ #### `src/fastapi_voyager/render_style.py`
12
+ - **ColorScheme**: 颜色配置类(节点、链接、文本颜色)
13
+ - **GraphvizStyle**: Graphviz 样式配置类(字体、布局、链接样式)
14
+ - **RenderConfig**: 完整的渲染配置类
15
+
16
+ #### 模板文件
17
+ ```
18
+ templates/
19
+ ├── dot/ # DOT 格式模板
20
+ │ ├── digraph.j2 # 主图模板
21
+ │ ├── tag_node.j2 # 标签节点
22
+ │ ├── schema_node.j2 # Schema 节点
23
+ │ ├── route_node.j2 # 路由节点
24
+ │ ├── cluster.j2 # 集群模板
25
+ │ ├── cluster_container.j2 # 容器集群
26
+ │ └── link.j2 # 链接模板
27
+ └── html/ # HTML 格式模板
28
+ ├── schema_table.j2 # Schema 表格
29
+ ├── schema_header.j2 # 表格头部
30
+ ├── schema_field_row.j2 # 字段行
31
+ ├── pydantic_meta.j2 # Pydantic 元数据
32
+ └── colored_text.j2 # 彩色文本
33
+ ```
34
+
35
+ ### 2. 重构文件
36
+
37
+ #### `src/fastapi_voyager/render.py`
38
+ - **新增 TemplateRenderer 类**: Jinja2 环境管理和模板渲染
39
+ - **重构 Renderer 类**:
40
+ - 使用模板渲染替代字符串拼接
41
+ - 分离关注点(格式化、渲染、配置)
42
+ - 保持公共 API 不变,向后兼容
43
+
44
+ ### 3. 依赖更新
45
+
46
+ #### `pyproject.toml`
47
+ ```toml
48
+ dependencies = [
49
+ "fastapi>=0.110",
50
+ "pydantic-resolve>=2.4.3",
51
+ "jinja2>=3.0.0" # 新增
52
+ ]
53
+ ```
54
+
55
+ ## 架构优势
56
+
57
+ ### 1. **关注点分离**
58
+ - **逻辑层**: Renderer 类处理业务逻辑
59
+ - **视图层**: Jinja2 模板处理格式化
60
+ - **配置层**: render_style.py 管理样式常量
61
+
62
+ ### 2. **可维护性提升**
63
+ - ✅ 模板集中管理,易于查找和修改
64
+ - ✅ 样式常量集中定义
65
+ - ✅ 代码结构更清晰
66
+
67
+ ### 3. **可扩展性**
68
+ - ✅ 支持主题切换(修改 ColorScheme)
69
+ - ✅ 支持自定义配置(注入 RenderConfig)
70
+ - ✅ 易于添加新的节点类型或样式
71
+
72
+ ### 4. **可测试性**
73
+ - ✅ 模板可独立测试
74
+ - ✅ 样式配置可单独验证
75
+ - ✅ 渲染逻辑更清晰
76
+
77
+ ## 向后兼容性
78
+
79
+ ✅ **完全兼容**: Renderer 类的公共接口保持不变:
80
+ - `__init__()` 参数未变(新增可选的 `config` 参数)
81
+ - `render_dot()` 方法签名未变
82
+ - 所有渲染方法保持原有行为
83
+
84
+ ## 使用示例
85
+
86
+ ### 基础使用(无变化)
87
+ ```python
88
+ from fastapi_voyager.render import Renderer
89
+
90
+ renderer = Renderer(
91
+ show_fields='all',
92
+ module_color={'myapp.services': 'tomato'}
93
+ )
94
+ dot_output = renderer.render_dot(tags, routes, nodes, links)
95
+ ```
96
+
97
+ ### 高级使用(新功能)
98
+ ```python
99
+ from fastapi_voyager.render import Renderer
100
+ from fastapi_voyager.render_style import RenderConfig, ColorScheme, GraphvizStyle
101
+
102
+ # 自定义颜色主题
103
+ custom_colors = ColorScheme(
104
+ primary='#ff6b6b',
105
+ highlight='#ffd93d'
106
+ )
107
+
108
+ # 自定义样式
109
+ custom_style = GraphvizStyle(
110
+ font='Arial',
111
+ node_fontsize='14'
112
+ )
113
+
114
+ # 使用自定义配置
115
+ config = RenderConfig(colors=custom_colors, style=custom_style)
116
+
117
+ renderer = Renderer(config=config)
118
+ dot_output = renderer.render_dot(tags, routes, nodes, links)
119
+ ```
120
+
121
+ ## 测试验证
122
+
123
+ ✅ 所有现有测试通过 (18/18)
124
+ ✅ 模板渲染正确
125
+ ✅ 向后兼容性验证通过
126
+ ✅ 实际应用场景测试通过
127
+
128
+ ## 未来改进建议
129
+
130
+ 1. **模板继承**: 使用 Jinja2 模板继承减少重复
131
+ 2. **主题系统**: 预定义多个主题(深色、浅色、高对比度)
132
+ 3. **自定义模板**: 支持用户覆盖默认模板
133
+ 4. **模板验证**: 添加模板语法检查
134
+ 5. **性能优化**: 缓存编译后的模板
135
+
136
+ ## 迁移指南
137
+
138
+ ### 对于项目维护者
139
+
140
+ 无需修改现有代码,但可选地:
141
+
142
+ 1. **自定义样式**:
143
+ ```python
144
+ from fastapi_voyager.render_style import RenderConfig, ColorScheme
145
+
146
+ config = RenderConfig(
147
+ colors=ColorScheme(primary='#custom-color')
148
+ )
149
+ renderer = Renderer(config=config)
150
+ ```
151
+
152
+ 2. **修改模板**:
153
+ 编辑 `templates/dot/*.j2` 或 `templates/html/*.j2` 文件
154
+
155
+ 3. **添加新样式**:
156
+ 在 `render_style.py` 中扩展配置类
157
+
158
+ ## 技术细节
159
+
160
+ ### Jinja2 环境配置
161
+ ```python
162
+ Environment(
163
+ loader=FileSystemLoader(template_dir),
164
+ autoescape=select_autoescape(),
165
+ trim_blocks=True, # 移除尾随换行符
166
+ lstrip_blocks=True # 移除前导空白
167
+ )
168
+ ```
169
+
170
+ ### 模板路径解析
171
+ ```python
172
+ TEMPLATE_DIR = Path(__file__).parent / "templates"
173
+ ```
174
+ 自动定位到 `src/fastapi_voyager/templates/`
175
+
176
+ ## 常见问题
177
+
178
+ **Q: 为什么要引入 Jinja2?**
179
+ A: 将视图模板从业务逻辑中分离,提高代码的可维护性和可扩展性。
180
+
181
+ **Q: 会影响性能吗?**
182
+ A: Jinja2 会编译并缓存模板,性能影响可忽略不计。
183
+
184
+ **Q: 如何自定义样式?**
185
+ A: 使用 RenderConfig 注入自定义配置,或直接修改 render_style.py。
186
+
187
+ **Q: 模板语法错误如何调试?**
188
+ A: Jinja2 会提供详细的错误信息,包括行号和上下文。
189
+
190
+ ## 总结
191
+
192
+ 此次重构成功地将散乱的模板字符串集中管理到 Jinja2 模板文件中,并提取了样式配置到专门的模块。这不仅提高了代码的可维护性,也为未来的功能扩展(如主题系统、自定义模板等)奠定了基础。
193
+
194
+ ✅ **任务完成**: 所有计划任务已完成,测试通过,代码已准备就绪。
@@ -9,7 +9,8 @@ requires-python = ">=3.10"
9
9
  keywords = ["fastapi", "visualization", "routing", "openapi"]
10
10
  dependencies = [
11
11
  "fastapi>=0.110",
12
- "pydantic-resolve>=2.3.1"
12
+ "pydantic-resolve>=2.4.3",
13
+ "jinja2>=3.0.0"
13
14
  ]
14
15
  classifiers = [
15
16
  "Programming Language :: Python :: 3",