fastapi-voyager 0.16.0a1__tar.gz → 0.16.0a2__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 (113) hide show
  1. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/PKG-INFO +23 -5
  2. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/docs/changelog.md +2 -0
  3. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/pyproject.toml +28 -3
  4. fastapi_voyager-0.16.0a2/setup-django-ninja.sh +48 -0
  5. fastapi_voyager-0.16.0a2/setup-fastapi.sh +48 -0
  6. fastapi_voyager-0.16.0a2/setup-litestar.sh +48 -0
  7. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/src/fastapi_voyager/adapters/fastapi_adapter.py +7 -5
  8. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/src/fastapi_voyager/adapters/litestar_adapter.py +4 -4
  9. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/src/fastapi_voyager/cli.py +11 -5
  10. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/src/fastapi_voyager/introspectors/fastapi.py +15 -4
  11. fastapi_voyager-0.16.0a2/src/fastapi_voyager/version.py +2 -0
  12. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/uv.lock +92 -10
  13. fastapi_voyager-0.16.0a1/src/fastapi_voyager/version.py +0 -2
  14. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/.githooks/README.md +0 -0
  15. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/.githooks/pre-commit +0 -0
  16. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  17. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  18. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/.github/workflows/publish.yml +0 -0
  19. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/.gitignore +0 -0
  20. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/.prettierignore +0 -0
  21. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/.prettierrc +0 -0
  22. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/.python-version +0 -0
  23. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/CONTRIBUTING.md +0 -0
  24. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/LICENSE +0 -0
  25. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/README.md +0 -0
  26. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/docs/claude/0_REFACTORING_RENDER_NOTES.md +0 -0
  27. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/docs/idea.md +0 -0
  28. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/package-lock.json +0 -0
  29. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/release.md +0 -0
  30. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/setup-hooks.sh +0 -0
  31. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/src/fastapi_voyager/__init__.py +0 -0
  32. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/src/fastapi_voyager/adapters/__init__.py +0 -0
  33. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/src/fastapi_voyager/adapters/base.py +0 -0
  34. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/src/fastapi_voyager/adapters/common.py +0 -0
  35. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/src/fastapi_voyager/adapters/django_ninja_adapter.py +0 -0
  36. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/src/fastapi_voyager/er_diagram.py +0 -0
  37. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/src/fastapi_voyager/filter.py +0 -0
  38. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/src/fastapi_voyager/introspectors/__init__.py +0 -0
  39. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/src/fastapi_voyager/introspectors/base.py +0 -0
  40. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/src/fastapi_voyager/introspectors/detector.py +0 -0
  41. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/src/fastapi_voyager/introspectors/django_ninja.py +0 -0
  42. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/src/fastapi_voyager/introspectors/litestar.py +0 -0
  43. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/src/fastapi_voyager/module.py +0 -0
  44. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/src/fastapi_voyager/pydantic_resolve_util.py +0 -0
  45. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/src/fastapi_voyager/render.py +0 -0
  46. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/src/fastapi_voyager/render_style.py +0 -0
  47. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/src/fastapi_voyager/server.py +0 -0
  48. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/src/fastapi_voyager/templates/dot/cluster.j2 +0 -0
  49. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/src/fastapi_voyager/templates/dot/cluster_container.j2 +0 -0
  50. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/src/fastapi_voyager/templates/dot/digraph.j2 +0 -0
  51. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/src/fastapi_voyager/templates/dot/er_diagram.j2 +0 -0
  52. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/src/fastapi_voyager/templates/dot/link.j2 +0 -0
  53. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/src/fastapi_voyager/templates/dot/route_node.j2 +0 -0
  54. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/src/fastapi_voyager/templates/dot/schema_node.j2 +0 -0
  55. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/src/fastapi_voyager/templates/dot/tag_node.j2 +0 -0
  56. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/src/fastapi_voyager/templates/html/colored_text.j2 +0 -0
  57. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/src/fastapi_voyager/templates/html/pydantic_meta.j2 +0 -0
  58. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/src/fastapi_voyager/templates/html/schema_field_row.j2 +0 -0
  59. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/src/fastapi_voyager/templates/html/schema_header.j2 +0 -0
  60. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/src/fastapi_voyager/templates/html/schema_table.j2 +0 -0
  61. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/src/fastapi_voyager/type.py +0 -0
  62. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/src/fastapi_voyager/type_helper.py +0 -0
  63. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/src/fastapi_voyager/voyager.py +0 -0
  64. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/src/fastapi_voyager/web/component/demo.js +0 -0
  65. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/src/fastapi_voyager/web/component/render-graph.js +0 -0
  66. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/src/fastapi_voyager/web/component/route-code-display.js +0 -0
  67. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/src/fastapi_voyager/web/component/schema-code-display.js +0 -0
  68. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/src/fastapi_voyager/web/graph-ui.js +0 -0
  69. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/src/fastapi_voyager/web/graphviz.svg.css +0 -0
  70. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/src/fastapi_voyager/web/graphviz.svg.js +0 -0
  71. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/src/fastapi_voyager/web/icon/android-chrome-192x192.png +0 -0
  72. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/src/fastapi_voyager/web/icon/android-chrome-512x512.png +0 -0
  73. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/src/fastapi_voyager/web/icon/apple-touch-icon.png +0 -0
  74. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/src/fastapi_voyager/web/icon/favicon-16x16.png +0 -0
  75. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/src/fastapi_voyager/web/icon/favicon-32x32.png +0 -0
  76. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/src/fastapi_voyager/web/icon/favicon.ico +0 -0
  77. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/src/fastapi_voyager/web/icon/site.webmanifest +0 -0
  78. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/src/fastapi_voyager/web/index.html +0 -0
  79. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/src/fastapi_voyager/web/quasar.min.css +0 -0
  80. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/src/fastapi_voyager/web/quasar.min.js +0 -0
  81. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/src/fastapi_voyager/web/store.js +0 -0
  82. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/src/fastapi_voyager/web/vue-main.js +0 -0
  83. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/tests/README.md +0 -0
  84. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/tests/__init__.py +0 -0
  85. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/tests/django_ninja/__init__.py +0 -0
  86. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/tests/django_ninja/demo.py +0 -0
  87. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/tests/django_ninja/embedding.py +0 -0
  88. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/tests/django_ninja/settings.py +0 -0
  89. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/tests/django_ninja/urls.py +0 -0
  90. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/tests/embedding_test_utils.py +0 -0
  91. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/tests/fastapi/__init__.py +0 -0
  92. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/tests/fastapi/demo.py +0 -0
  93. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/tests/fastapi/demo_anno.py +0 -0
  94. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/tests/fastapi/embedding.py +0 -0
  95. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/tests/litestar/__init__.py +0 -0
  96. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/tests/litestar/demo.py +0 -0
  97. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/tests/litestar/embedding.py +0 -0
  98. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/tests/service/__init__.py +0 -0
  99. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/tests/service/schema/__init__.py +0 -0
  100. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/tests/service/schema/base_entity.py +0 -0
  101. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/tests/service/schema/extra.py +0 -0
  102. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/tests/service/schema/schema.py +0 -0
  103. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/tests/test_analysis.py +0 -0
  104. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/tests/test_embedding_django_ninja.py +0 -0
  105. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/tests/test_embedding_fastapi.py +0 -0
  106. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/tests/test_embedding_litestar.py +0 -0
  107. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/tests/test_filter.py +0 -0
  108. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/tests/test_generic.py +0 -0
  109. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/tests/test_import.py +0 -0
  110. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/tests/test_module.py +0 -0
  111. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/tests/test_resolve_util_impl.py +0 -0
  112. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/tests/test_type_helper.py +0 -0
  113. {fastapi_voyager-0.16.0a1 → fastapi_voyager-0.16.0a2}/voyager.jpg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fastapi-voyager
3
- Version: 0.16.0a1
3
+ Version: 0.16.0a2
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
@@ -20,15 +20,33 @@ Classifier: Programming Language :: Python :: 3.14
20
20
  Requires-Python: >=3.10
21
21
  Requires-Dist: jinja2>=3.0.0
22
22
  Requires-Dist: pydantic-resolve>=2.4.3
23
+ Provides-Extra: all
24
+ Requires-Dist: django-ninja>=1.5.3; extra == 'all'
25
+ Requires-Dist: django>=4.2; extra == 'all'
26
+ Requires-Dist: fastapi>=0.110; extra == 'all'
27
+ Requires-Dist: httpx; extra == 'all'
28
+ Requires-Dist: litestar>=2.19.0; extra == 'all'
29
+ Requires-Dist: pydantic>=2.0; extra == 'all'
30
+ Requires-Dist: pytest; extra == 'all'
31
+ Requires-Dist: pytest-asyncio; extra == 'all'
32
+ Requires-Dist: ruff; extra == 'all'
33
+ Requires-Dist: uvicorn; extra == 'all'
23
34
  Provides-Extra: dev
24
- Requires-Dist: django-ninja; extra == 'dev'
25
- Requires-Dist: fastapi>=0.110; extra == 'dev'
26
35
  Requires-Dist: httpx; extra == 'dev'
27
- Requires-Dist: litestar; extra == 'dev'
28
36
  Requires-Dist: pytest; extra == 'dev'
29
37
  Requires-Dist: pytest-asyncio; extra == 'dev'
30
38
  Requires-Dist: ruff; extra == 'dev'
31
- Requires-Dist: uvicorn; extra == 'dev'
39
+ Provides-Extra: django-ninja
40
+ Requires-Dist: django-ninja>=1.5.3; extra == 'django-ninja'
41
+ Requires-Dist: django>=4.2; extra == 'django-ninja'
42
+ Requires-Dist: uvicorn; extra == 'django-ninja'
43
+ Provides-Extra: fastapi
44
+ Requires-Dist: fastapi>=0.110; extra == 'fastapi'
45
+ Requires-Dist: uvicorn; extra == 'fastapi'
46
+ Provides-Extra: litestar
47
+ Requires-Dist: litestar>=2.19.0; extra == 'litestar'
48
+ Requires-Dist: pydantic>=2.0; extra == 'litestar'
49
+ Requires-Dist: uvicorn; extra == 'litestar'
32
50
  Description-Content-Type: text/markdown
33
51
 
34
52
  [![pypi](https://img.shields.io/pypi/v/fastapi-voyager.svg)](https://pypi.python.org/pypi/fastapi-voyager)
@@ -179,6 +179,8 @@
179
179
  ## 0.16
180
180
  - 0.16.0alpha-1
181
181
  - [x] support django ninja and litestar
182
+ - 0.16.0alpha-2
183
+ - [x] fix import error
182
184
 
183
185
  ## 0.17, enhance er diagram
184
186
  - 0.17.0
@@ -31,7 +31,11 @@ Homepage = "https://github.com/allmonday/fastapi-voyager"
31
31
  Source = "https://github.com/allmonday/fastapi-voyager"
32
32
 
33
33
  [project.optional-dependencies]
34
- dev = ["uvicorn", "ruff", "pytest", "pytest-asyncio", "httpx", "fastapi>=0.110", "django-ninja", "litestar"]
34
+ dev = ["ruff", "pytest", "pytest-asyncio", "httpx"]
35
+ fastapi = ["fastapi>=0.110", "uvicorn"]
36
+ django-ninja = ["django>=4.2", "django-ninja>=1.5.3", "uvicorn"]
37
+ litestar = ["litestar>=2.19.0", "pydantic>=2.0", "uvicorn"]
38
+ all = ["fastapi-voyager[dev,fastapi,django-ninja,litestar]"]
35
39
 
36
40
  [build-system]
37
41
  requires = ["hatchling"]
@@ -54,9 +58,30 @@ select = ["E", "F", "I", "UP", "B"]
54
58
 
55
59
  [dependency-groups]
56
60
  dev = [
61
+ "httpx>=0.28.1",
62
+ "pytest-asyncio>=1.3.0",
63
+ "pytest>=8.0.0",
64
+ "ruff>=0.9.0",
65
+ ]
66
+ fastapi = [
67
+ "fastapi>=0.116.1",
68
+ "uvicorn>=0.34.0",
69
+ ]
70
+ django-ninja = [
71
+ "django>=4.2",
72
+ "django-ninja>=1.5.3",
73
+ "uvicorn>=0.34.0",
74
+ ]
75
+ litestar = [
76
+ "litestar>=2.19.0",
77
+ "pydantic>=2.0",
78
+ "uvicorn>=0.34.0",
79
+ ]
80
+ all = [
81
+ "django>=4.2",
57
82
  "django-ninja>=1.5.3",
58
83
  "fastapi>=0.116.1",
59
- "httpx>=0.28.1",
60
84
  "litestar>=2.19.0",
61
- "pytest-asyncio>=1.3.0",
85
+ "pydantic>=2.0",
86
+ "uvicorn>=0.34.0",
62
87
  ]
@@ -0,0 +1,48 @@
1
+ #!/bin/bash
2
+ # Django Ninja Development Setup Script
3
+ # Usage: ./setup-django-ninja.sh [--no-sync]
4
+
5
+ set -e
6
+
7
+ echo "🚀 Setting up Django Ninja development environment..."
8
+ echo ""
9
+
10
+ # Parse arguments
11
+ SYNC=true
12
+ for arg in "$@"; do
13
+ case $arg in
14
+ --no-sync)
15
+ SYNC=false
16
+ shift
17
+ ;;
18
+ esac
19
+ done
20
+
21
+ # Sync dependencies
22
+ if [ "$SYNC" = true ]; then
23
+ echo "📦 Syncing dependencies..."
24
+ uv sync --group dev --group django-ninja
25
+ echo "✅ Dependencies synced"
26
+ echo ""
27
+ fi
28
+
29
+ # Check if uvicorn is installed
30
+ echo "🔍 Checking uvicorn installation..."
31
+ if uv run which uvicorn > /dev/null 2>&1; then
32
+ UVICORN_PATH=$(uv run which uvicorn)
33
+ echo "✅ Uvicorn found at: $UVICORN_PATH"
34
+ else
35
+ echo "❌ Uvicorn not found in project environment"
36
+ exit 1
37
+ fi
38
+ echo ""
39
+
40
+ # Start Django Ninja server
41
+ echo "🌟 Starting Django Ninja Voyager server..."
42
+ echo " App: tests.django_ninja.embedding:application"
43
+ echo " URL: http://127.0.0.1:8000"
44
+ echo ""
45
+ echo "Press Ctrl+C to stop the server"
46
+ echo ""
47
+
48
+ uv run uvicorn tests.django_ninja.embedding:application --reload --host 127.0.0.1 --port 8000
@@ -0,0 +1,48 @@
1
+ #!/bin/bash
2
+ # FastAPI Development Setup Script
3
+ # Usage: ./setup-fastapi.sh [--no-sync]
4
+
5
+ set -e
6
+
7
+ echo "🚀 Setting up FastAPI development environment..."
8
+ echo ""
9
+
10
+ # Parse arguments
11
+ SYNC=true
12
+ for arg in "$@"; do
13
+ case $arg in
14
+ --no-sync)
15
+ SYNC=false
16
+ shift
17
+ ;;
18
+ esac
19
+ done
20
+
21
+ # Sync dependencies
22
+ if [ "$SYNC" = true ]; then
23
+ echo "📦 Syncing dependencies..."
24
+ uv sync --group dev --group fastapi
25
+ echo "✅ Dependencies synced"
26
+ echo ""
27
+ fi
28
+
29
+ # Check if uvicorn is installed
30
+ echo "🔍 Checking uvicorn installation..."
31
+ if uv run which uvicorn > /dev/null 2>&1; then
32
+ UVICORN_PATH=$(uv run which uvicorn)
33
+ echo "✅ Uvicorn found at: $UVICORN_PATH"
34
+ else
35
+ echo "❌ Uvicorn not found in project environment"
36
+ exit 1
37
+ fi
38
+ echo ""
39
+
40
+ # Start FastAPI server
41
+ echo "🌟 Starting FastAPI Voyager server..."
42
+ echo " App: tests.fastapi.embedding:app"
43
+ echo " URL: http://127.0.0.1:8000"
44
+ echo ""
45
+ echo "Press Ctrl+C to stop the server"
46
+ echo ""
47
+
48
+ uv run uvicorn tests.fastapi.embedding:app --reload --host 127.0.0.1 --port 8000
@@ -0,0 +1,48 @@
1
+ #!/bin/bash
2
+ # Litestar Development Setup Script
3
+ # Usage: ./setup-litestar.sh [--no-sync]
4
+
5
+ set -e
6
+
7
+ echo "🚀 Setting up Litestar development environment..."
8
+ echo ""
9
+
10
+ # Parse arguments
11
+ SYNC=true
12
+ for arg in "$@"; do
13
+ case $arg in
14
+ --no-sync)
15
+ SYNC=false
16
+ shift
17
+ ;;
18
+ esac
19
+ done
20
+
21
+ # Sync dependencies
22
+ if [ "$SYNC" = true ]; then
23
+ echo "📦 Syncing dependencies..."
24
+ uv sync --group dev --group litestar
25
+ echo "✅ Dependencies synced"
26
+ echo ""
27
+ fi
28
+
29
+ # Check if uvicorn is installed
30
+ echo "🔍 Checking uvicorn installation..."
31
+ if uv run which uvicorn > /dev/null 2>&1; then
32
+ UVICORN_PATH=$(uv run which uvicorn)
33
+ echo "✅ Uvicorn found at: $UVICORN_PATH"
34
+ else
35
+ echo "❌ Uvicorn not found in project environment"
36
+ exit 1
37
+ fi
38
+ echo ""
39
+
40
+ # Start Litestar server
41
+ echo "🌟 Starting Litestar Voyager server..."
42
+ echo " App: tests.litestar.embedding:asgi_app"
43
+ echo " URL: http://127.0.0.1:8000"
44
+ echo ""
45
+ echo "Press Ctrl+C to stop the server"
46
+ echo ""
47
+
48
+ uv run uvicorn tests.litestar.embedding:asgi_app --reload --host 127.0.0.1 --port 8000
@@ -5,11 +5,7 @@ This module provides the FastAPI-specific implementation of the voyager server.
5
5
  """
6
6
  from typing import Any, Literal
7
7
 
8
- from fastapi import APIRouter, FastAPI
9
- from fastapi.responses import HTMLResponse, JSONResponse, PlainTextResponse
10
- from fastapi.staticfiles import StaticFiles
11
8
  from pydantic import BaseModel
12
- from starlette.middleware.gzip import GZipMiddleware
13
9
 
14
10
  from fastapi_voyager.adapters.base import VoyagerAdapter
15
11
  from fastapi_voyager.adapters.common import STATIC_FILES_PATH, VoyagerContext
@@ -98,8 +94,14 @@ class FastAPIAdapter(VoyagerAdapter):
98
94
  )
99
95
  self.gzip_minimum_size = gzip_minimum_size
100
96
 
101
- def create_app(self) -> FastAPI:
97
+ def create_app(self) -> Any:
102
98
  """Create and return a FastAPI application with voyager endpoints."""
99
+ # Lazy import FastAPI to avoid import errors when framework is not installed
100
+ from fastapi import APIRouter, FastAPI
101
+ from fastapi.responses import HTMLResponse, JSONResponse, PlainTextResponse
102
+ from fastapi.staticfiles import StaticFiles
103
+ from starlette.middleware.gzip import GZipMiddleware
104
+
103
105
  router = APIRouter(tags=["fastapi-voyager"])
104
106
 
105
107
  @router.post("/er-diagram", response_class=PlainTextResponse)
@@ -5,9 +5,6 @@ This module provides the Litestar-specific implementation of the voyager server.
5
5
  """
6
6
  from typing import Any
7
7
 
8
- from litestar import Litestar, MediaType, Request, Response, get, post
9
- from litestar.static_files import create_static_files_router
10
-
11
8
  from fastapi_voyager.adapters.base import VoyagerAdapter
12
9
  from fastapi_voyager.adapters.common import STATIC_FILES_PATH, WEB_DIR, VoyagerContext
13
10
  from fastapi_voyager.type import CoreData, SchemaNode, Tag
@@ -47,8 +44,11 @@ class LitestarAdapter(VoyagerAdapter):
47
44
  )
48
45
  self.gzip_minimum_size = gzip_minimum_size
49
46
 
50
- def create_app(self) -> Litestar:
47
+ def create_app(self) -> Any:
51
48
  """Create and return a Litestar application with voyager endpoints."""
49
+ # Lazy import Litestar to avoid import errors when framework is not installed
50
+ from litestar import Litestar, MediaType, Request, Response, get, post
51
+ from litestar.static_files import create_static_files_router
52
52
 
53
53
  @get("/er-diagram")
54
54
  async def get_er_diagram(request: Request) -> str:
@@ -5,17 +5,19 @@ import importlib.util
5
5
  import logging
6
6
  import os
7
7
  import sys
8
-
9
- from fastapi import FastAPI
8
+ from typing import TYPE_CHECKING
10
9
 
11
10
  from fastapi_voyager import server as viz_server
12
11
  from fastapi_voyager.version import __version__
13
12
  from fastapi_voyager.voyager import Voyager
14
13
 
14
+ if TYPE_CHECKING:
15
+ from fastapi import FastAPI
16
+
15
17
  logger = logging.getLogger(__name__)
16
18
 
17
19
 
18
- def load_fastapi_app_from_file(module_path: str, app_name: str = "app") -> FastAPI | None:
20
+ def load_fastapi_app_from_file(module_path: str, app_name: str = "app") -> "FastAPI | None":
19
21
  """Load FastAPI app from a Python module file."""
20
22
  try:
21
23
  # Convert relative path to absolute path
@@ -35,6 +37,8 @@ def load_fastapi_app_from_file(module_path: str, app_name: str = "app") -> FastA
35
37
  # Get the FastAPI app instance
36
38
  if hasattr(module, app_name):
37
39
  app = getattr(module, app_name)
40
+ # Lazy import to avoid import errors when FastAPI is not installed
41
+ from fastapi import FastAPI
38
42
  if isinstance(app, FastAPI):
39
43
  return app
40
44
  logger.error(f"'{app_name}' is not a FastAPI instance")
@@ -47,7 +51,7 @@ def load_fastapi_app_from_file(module_path: str, app_name: str = "app") -> FastA
47
51
  return None
48
52
 
49
53
 
50
- def load_fastapi_app_from_module(module_name: str, app_name: str = "app") -> FastAPI | None:
54
+ def load_fastapi_app_from_module(module_name: str, app_name: str = "app") -> "FastAPI | None":
51
55
  """Load FastAPI app from a Python module name."""
52
56
  try:
53
57
  # Temporarily add the current working directory to sys.path
@@ -65,6 +69,8 @@ def load_fastapi_app_from_module(module_name: str, app_name: str = "app") -> Fas
65
69
  # Get the FastAPI app instance
66
70
  if hasattr(module, app_name):
67
71
  app = getattr(module, app_name)
72
+ # Lazy import to avoid import errors when FastAPI is not installed
73
+ from fastapi import FastAPI
68
74
  if isinstance(app, FastAPI):
69
75
  return app
70
76
  logger.error(f"'{app_name}' is not a FastAPI instance")
@@ -85,7 +91,7 @@ def load_fastapi_app_from_module(module_name: str, app_name: str = "app") -> Fas
85
91
 
86
92
 
87
93
  def generate_visualization(
88
- app: FastAPI,
94
+ app: "FastAPI",
89
95
  output_file: str = "router_viz.dot", tags: list[str] | None = None,
90
96
  schema: str | None = None,
91
97
  show_fields: bool = False,
@@ -4,11 +4,13 @@ FastAPI implementation of the AppIntrospector interface.
4
4
  This module provides the adapter that allows fastapi-voyager to work with FastAPI applications.
5
5
  """
6
6
  from collections.abc import Iterator
7
-
8
- from fastapi import FastAPI, routing
7
+ from typing import TYPE_CHECKING, Any
9
8
 
10
9
  from fastapi_voyager.introspectors.base import AppIntrospector, RouteInfo
11
10
 
11
+ if TYPE_CHECKING:
12
+ from fastapi import FastAPI
13
+
12
14
 
13
15
  class FastAPIIntrospector(AppIntrospector):
14
16
  """
@@ -18,7 +20,7 @@ class FastAPIIntrospector(AppIntrospector):
18
20
  and converts it to the framework-agnostic RouteInfo format.
19
21
  """
20
22
 
21
- def __init__(self, app: FastAPI, swagger_url: str | None = None):
23
+ def __init__(self, app: "FastAPI", swagger_url: str | None = None):
22
24
  """
23
25
  Initialize the FastAPI introspector.
24
26
 
@@ -26,6 +28,12 @@ class FastAPIIntrospector(AppIntrospector):
26
28
  app: The FastAPI application instance
27
29
  swagger_url: Optional custom URL to Swagger documentation
28
30
  """
31
+ # Lazy import to avoid import errors when FastAPI is not installed
32
+ from fastapi import FastAPI
33
+
34
+ if not isinstance(app, FastAPI):
35
+ raise TypeError(f"Expected FastAPI instance, got {type(app)}")
36
+
29
37
  self.app = app
30
38
  self.swagger_url = swagger_url or "/docs"
31
39
 
@@ -36,6 +44,9 @@ class FastAPIIntrospector(AppIntrospector):
36
44
  Yields:
37
45
  RouteInfo: Standardized route information for each API route
38
46
  """
47
+ # Lazy import routing to avoid import errors when FastAPI is not installed
48
+ from fastapi import routing
49
+
39
50
  for route in self.app.routes:
40
51
  # Only process APIRoute instances (not static files, etc.)
41
52
  if isinstance(route, routing.APIRoute):
@@ -66,7 +77,7 @@ class FastAPIIntrospector(AppIntrospector):
66
77
  """
67
78
  return self.swagger_url
68
79
 
69
- def _get_route_id(self, route: routing.APIRoute) -> str:
80
+ def _get_route_id(self, route: Any) -> str:
70
81
  """
71
82
  Generate a unique identifier for the route.
72
83
 
@@ -0,0 +1,2 @@
1
+ __all__ = ["__version__"]
2
+ __version__ = "0.16.0alpha-2"
@@ -188,48 +188,130 @@ dependencies = [
188
188
  ]
189
189
 
190
190
  [package.optional-dependencies]
191
- dev = [
191
+ all = [
192
+ { name = "django", version = "5.2.10", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" },
193
+ { name = "django", version = "6.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" },
192
194
  { name = "django-ninja" },
193
195
  { name = "fastapi" },
194
196
  { name = "httpx" },
195
197
  { name = "litestar" },
198
+ { name = "pydantic" },
199
+ { name = "pytest" },
200
+ { name = "pytest-asyncio" },
201
+ { name = "ruff" },
202
+ { name = "uvicorn" },
203
+ ]
204
+ dev = [
205
+ { name = "httpx" },
196
206
  { name = "pytest" },
197
207
  { name = "pytest-asyncio" },
198
208
  { name = "ruff" },
209
+ ]
210
+ django-ninja = [
211
+ { name = "django", version = "5.2.10", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" },
212
+ { name = "django", version = "6.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" },
213
+ { name = "django-ninja" },
214
+ { name = "uvicorn" },
215
+ ]
216
+ fastapi = [
217
+ { name = "fastapi" },
218
+ { name = "uvicorn" },
219
+ ]
220
+ litestar = [
221
+ { name = "litestar" },
222
+ { name = "pydantic" },
199
223
  { name = "uvicorn" },
200
224
  ]
201
225
 
202
226
  [package.dev-dependencies]
203
- dev = [
227
+ all = [
228
+ { name = "django", version = "5.2.10", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" },
229
+ { name = "django", version = "6.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" },
204
230
  { name = "django-ninja" },
205
231
  { name = "fastapi" },
206
- { name = "httpx" },
207
232
  { name = "litestar" },
233
+ { name = "pydantic" },
234
+ { name = "uvicorn" },
235
+ ]
236
+ dev = [
237
+ { name = "httpx" },
238
+ { name = "pytest" },
208
239
  { name = "pytest-asyncio" },
240
+ { name = "ruff" },
241
+ ]
242
+ django-ninja = [
243
+ { name = "django", version = "5.2.10", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" },
244
+ { name = "django", version = "6.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" },
245
+ { name = "django-ninja" },
246
+ { name = "uvicorn" },
247
+ ]
248
+ fastapi = [
249
+ { name = "fastapi" },
250
+ { name = "uvicorn" },
251
+ ]
252
+ litestar = [
253
+ { name = "litestar" },
254
+ { name = "pydantic" },
255
+ { name = "uvicorn" },
209
256
  ]
210
257
 
211
258
  [package.metadata]
212
259
  requires-dist = [
213
- { name = "django-ninja", marker = "extra == 'dev'" },
214
- { name = "fastapi", marker = "extra == 'dev'", specifier = ">=0.110" },
260
+ { name = "django", marker = "extra == 'all'", specifier = ">=4.2" },
261
+ { name = "django", marker = "extra == 'django-ninja'", specifier = ">=4.2" },
262
+ { name = "django-ninja", marker = "extra == 'all'", specifier = ">=1.5.3" },
263
+ { name = "django-ninja", marker = "extra == 'django-ninja'", specifier = ">=1.5.3" },
264
+ { name = "fastapi", marker = "extra == 'all'", specifier = ">=0.110" },
265
+ { name = "fastapi", marker = "extra == 'fastapi'", specifier = ">=0.110" },
266
+ { name = "httpx", marker = "extra == 'all'" },
215
267
  { name = "httpx", marker = "extra == 'dev'" },
216
268
  { name = "jinja2", specifier = ">=3.0.0" },
217
- { name = "litestar", marker = "extra == 'dev'" },
269
+ { name = "litestar", marker = "extra == 'all'", specifier = ">=2.19.0" },
270
+ { name = "litestar", marker = "extra == 'litestar'", specifier = ">=2.19.0" },
271
+ { name = "pydantic", marker = "extra == 'all'", specifier = ">=2.0" },
272
+ { name = "pydantic", marker = "extra == 'litestar'", specifier = ">=2.0" },
218
273
  { name = "pydantic-resolve", specifier = ">=2.4.3" },
274
+ { name = "pytest", marker = "extra == 'all'" },
219
275
  { name = "pytest", marker = "extra == 'dev'" },
276
+ { name = "pytest-asyncio", marker = "extra == 'all'" },
220
277
  { name = "pytest-asyncio", marker = "extra == 'dev'" },
278
+ { name = "ruff", marker = "extra == 'all'" },
221
279
  { name = "ruff", marker = "extra == 'dev'" },
222
- { name = "uvicorn", marker = "extra == 'dev'" },
280
+ { name = "uvicorn", marker = "extra == 'all'" },
281
+ { name = "uvicorn", marker = "extra == 'django-ninja'" },
282
+ { name = "uvicorn", marker = "extra == 'fastapi'" },
283
+ { name = "uvicorn", marker = "extra == 'litestar'" },
223
284
  ]
224
- provides-extras = ["dev"]
285
+ provides-extras = ["all", "dev", "django-ninja", "fastapi", "litestar"]
225
286
 
226
287
  [package.metadata.requires-dev]
227
- dev = [
288
+ all = [
289
+ { name = "django", specifier = ">=4.2" },
228
290
  { name = "django-ninja", specifier = ">=1.5.3" },
229
291
  { name = "fastapi", specifier = ">=0.116.1" },
230
- { name = "httpx", specifier = ">=0.28.1" },
231
292
  { name = "litestar", specifier = ">=2.19.0" },
293
+ { name = "pydantic", specifier = ">=2.0" },
294
+ { name = "uvicorn", specifier = ">=0.34.0" },
295
+ ]
296
+ dev = [
297
+ { name = "httpx", specifier = ">=0.28.1" },
298
+ { name = "pytest", specifier = ">=8.0.0" },
232
299
  { name = "pytest-asyncio", specifier = ">=1.3.0" },
300
+ { name = "ruff", specifier = ">=0.9.0" },
301
+ ]
302
+ django-ninja = [
303
+ { name = "django", specifier = ">=4.2" },
304
+ { name = "django-ninja", specifier = ">=1.5.3" },
305
+ { name = "uvicorn", specifier = ">=0.34.0" },
306
+ ]
307
+ fastapi = [
308
+ { name = "fastapi", specifier = ">=0.116.1" },
309
+ { name = "uvicorn", specifier = ">=0.34.0" },
310
+ ]
311
+ litestar = [
312
+ { name = "litestar", specifier = ">=2.19.0" },
313
+ { name = "pydantic", specifier = ">=2.0" },
314
+ { name = "uvicorn", specifier = ">=0.34.0" },
233
315
  ]
234
316
 
235
317
  [[package]]
@@ -1,2 +0,0 @@
1
- __all__ = ["__version__"]
2
- __version__ = "0.16.0alpha-1"