fastapi-voyager 0.15.5__py3-none-any.whl → 0.16.0a1__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.
Files changed (31) hide show
  1. fastapi_voyager/__init__.py +2 -2
  2. fastapi_voyager/adapters/__init__.py +16 -0
  3. fastapi_voyager/adapters/base.py +44 -0
  4. fastapi_voyager/adapters/common.py +260 -0
  5. fastapi_voyager/adapters/django_ninja_adapter.py +299 -0
  6. fastapi_voyager/adapters/fastapi_adapter.py +165 -0
  7. fastapi_voyager/adapters/litestar_adapter.py +188 -0
  8. fastapi_voyager/er_diagram.py +15 -14
  9. fastapi_voyager/introspectors/__init__.py +34 -0
  10. fastapi_voyager/introspectors/base.py +81 -0
  11. fastapi_voyager/introspectors/detector.py +123 -0
  12. fastapi_voyager/introspectors/django_ninja.py +114 -0
  13. fastapi_voyager/introspectors/fastapi.py +83 -0
  14. fastapi_voyager/introspectors/litestar.py +166 -0
  15. fastapi_voyager/pydantic_resolve_util.py +4 -2
  16. fastapi_voyager/render.py +2 -2
  17. fastapi_voyager/render_style.py +0 -1
  18. fastapi_voyager/server.py +174 -295
  19. fastapi_voyager/type_helper.py +2 -2
  20. fastapi_voyager/version.py +1 -1
  21. fastapi_voyager/voyager.py +75 -47
  22. fastapi_voyager/web/graph-ui.js +102 -69
  23. fastapi_voyager/web/graphviz.svg.js +79 -30
  24. fastapi_voyager/web/index.html +11 -14
  25. fastapi_voyager/web/store.js +2 -0
  26. fastapi_voyager/web/vue-main.js +4 -0
  27. {fastapi_voyager-0.15.5.dist-info → fastapi_voyager-0.16.0a1.dist-info}/METADATA +133 -7
  28. {fastapi_voyager-0.15.5.dist-info → fastapi_voyager-0.16.0a1.dist-info}/RECORD +31 -19
  29. {fastapi_voyager-0.15.5.dist-info → fastapi_voyager-0.16.0a1.dist-info}/WHEEL +0 -0
  30. {fastapi_voyager-0.15.5.dist-info → fastapi_voyager-0.16.0a1.dist-info}/entry_points.txt +0 -0
  31. {fastapi_voyager-0.15.5.dist-info → fastapi_voyager-0.16.0a1.dist-info}/licenses/LICENSE +0 -0
@@ -291,6 +291,10 @@ const app = createApp({
291
291
  onMounted(async () => {
292
292
  document.body.classList.remove("app-loading")
293
293
  await loadInitial()
294
+ // Update document title after framework_name is loaded
295
+ if (store.state.framework_name) {
296
+ document.title = `${store.state.framework_name} Voyager`
297
+ }
294
298
  // Reveal app content only after initial JS/data is ready
295
299
  })
296
300
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fastapi-voyager
3
- Version: 0.15.5
3
+ Version: 0.16.0a1
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
@@ -18,11 +18,15 @@ Classifier: Programming Language :: Python :: 3.12
18
18
  Classifier: Programming Language :: Python :: 3.13
19
19
  Classifier: Programming Language :: Python :: 3.14
20
20
  Requires-Python: >=3.10
21
- Requires-Dist: fastapi>=0.110
22
21
  Requires-Dist: jinja2>=3.0.0
23
22
  Requires-Dist: pydantic-resolve>=2.4.3
24
23
  Provides-Extra: dev
24
+ Requires-Dist: django-ninja; extra == 'dev'
25
+ Requires-Dist: fastapi>=0.110; extra == 'dev'
26
+ Requires-Dist: httpx; extra == 'dev'
27
+ Requires-Dist: litestar; extra == 'dev'
25
28
  Requires-Dist: pytest; extra == 'dev'
29
+ Requires-Dist: pytest-asyncio; extra == 'dev'
26
30
  Requires-Dist: ruff; extra == 'dev'
27
31
  Requires-Dist: uvicorn; extra == 'dev'
28
32
  Description-Content-Type: text/markdown
@@ -34,10 +38,12 @@ Description-Content-Type: text/markdown
34
38
 
35
39
  # FastAPI Voyager
36
40
 
37
- Visualize your FastAPI endpoints and explore them interactively.
41
+ Visualize your API endpoints and explore them interactively.
38
42
 
39
43
  Its vision is to make code easier to read and understand, serving as an ideal documentation tool.
40
44
 
45
+ **Now supports multiple frameworks:** FastAPI, Django Ninja, and Litestar.
46
+
41
47
  > This repo is still in early stage, it supports Pydantic v2 only.
42
48
 
43
49
  - **Live Demo**: https://www.newsyeah.fun/voyager/
@@ -49,6 +55,7 @@ Its vision is to make code easier to read and understand, serving as an ideal do
49
55
 
50
56
  - [Quick Start](#quick-start)
51
57
  - [Installation](#installation)
58
+ - [Supported Frameworks](#supported-frameworks)
52
59
  - [Features](#features)
53
60
  - [Command Line Usage](#command-line-usage)
54
61
  - [About pydantic-resolve](#about-pydantic-resolve)
@@ -58,7 +65,7 @@ Its vision is to make code easier to read and understand, serving as an ideal do
58
65
 
59
66
  ## Quick Start
60
67
 
61
- With simple configuration, fastapi-voyager can be embedded into FastAPI:
68
+ With simple configuration, fastapi-voyager can be embedded into your web application:
62
69
 
63
70
  ```python
64
71
  from fastapi import FastAPI
@@ -66,6 +73,8 @@ from fastapi_voyager import create_voyager
66
73
 
67
74
  app = FastAPI()
68
75
 
76
+ # ... define your routes ...
77
+
69
78
  app.mount('/voyager',
70
79
  create_voyager(
71
80
  app,
@@ -74,12 +83,14 @@ app.mount('/voyager',
74
83
  swagger_url="/docs",
75
84
  ga_id="G-XXXXXXXXVL",
76
85
  initial_page_policy='first',
77
- online_repo_url='https://github.com/allmonday/composition-oriented-development-pattern/blob/master',
86
+ online_repo_url='https://github.com/your-org/your-repo/blob/master',
78
87
  enable_pydantic_resolve_meta=True))
79
88
  ```
80
89
 
81
90
  Visit `http://localhost:8000/voyager` to explore your API visually.
82
91
 
92
+ For framework-specific examples (Django Ninja, Litestar), see [Supported Frameworks](#supported-frameworks).
93
+
83
94
  [View full example](https://github.com/allmonday/composition-oriented-development-pattern/blob/master/src/main.py#L48)
84
95
 
85
96
  ## Installation
@@ -110,9 +121,106 @@ voyager -m path.to.your.app.module --server --app api
110
121
 
111
122
  > **Note**: [Sub-Application mounts](https://fastapi.tiangolo.com/advanced/sub-applications/) are not supported yet, but you can specify the name of the FastAPI application with `--app`. Only a single application (default: `app`) can be selected.
112
123
 
124
+ ## Supported Frameworks
125
+
126
+ fastapi-voyager automatically detects your framework and provides the appropriate integration. Currently supported frameworks:
127
+
128
+ ### FastAPI
129
+
130
+ ```python
131
+ from fastapi import FastAPI
132
+ from fastapi_voyager import create_voyager
133
+
134
+ app = FastAPI()
135
+
136
+ @app.get("/hello")
137
+ def hello():
138
+ return {"message": "Hello World"}
139
+
140
+ # Mount voyager
141
+ app.mount("/voyager", create_voyager(app))
142
+ ```
143
+
144
+ Start with:
145
+ ```bash
146
+ uvicorn your_app:app --reload
147
+ # Visit http://localhost:8000/voyager
148
+ ```
149
+
150
+ ### Django Ninja
151
+
152
+ ```python
153
+ import os
154
+ import django
155
+ from django.core.asgi import get_asgi_application
156
+ from ninja import NinjaAPI
157
+ from fastapi_voyager import create_voyager
158
+
159
+ # Configure Django
160
+ os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myapp.settings")
161
+ django.setup()
162
+
163
+ # Create Django Ninja API
164
+ api = NinjaAPI()
165
+
166
+ @api.get("/hello")
167
+ def hello(request):
168
+ return {"message": "Hello World"}
169
+
170
+ # Create voyager ASGI app
171
+ voyager_app = create_voyager(api)
172
+
173
+ # Create ASGI application that routes between Django and voyager
174
+ async def application(scope, receive, send):
175
+ if scope["type"] == "http" and scope["path"].startswith("/voyager"):
176
+ await voyager_app(scope, receive, send)
177
+ else:
178
+ django_app = get_asgi_application()
179
+ await django_app(scope, receive, send)
180
+ ```
181
+
182
+ Start with:
183
+ ```bash
184
+ uvicorn your_app:application --reload
185
+ # Visit http://localhost:8000/voyager
186
+ ```
187
+
188
+ ### Litestar
189
+
190
+ ```python
191
+ from litestar import Litestar, get
192
+ from fastapi_voyager import create_voyager
193
+
194
+ # Create Litestar app
195
+ app = Litestar()
196
+
197
+ @get("/hello")
198
+ def hello() -> dict:
199
+ return {"message": "Hello World"}
200
+
201
+ # Create voyager app (returns a Litestar app)
202
+ voyager_app = create_voyager(app)
203
+
204
+ # Create ASGI application that routes between main app and voyager
205
+ async def asgi_app(scope, receive, send):
206
+ if scope["type"] == "http" and scope["path"].startswith("/voyager"):
207
+ # Remove /voyager prefix for voyager app
208
+ new_scope = dict(scope)
209
+ new_scope["path"] = scope["path"][8:] or "/"
210
+ await voyager_app(new_scope, receive, send)
211
+ else:
212
+ await app(scope, receive, send)
213
+ ```
214
+
215
+ Start with:
216
+ ```bash
217
+ uvicorn your_app:asgi_app --reload
218
+ # Visit http://localhost:8000/voyager
219
+ ```
220
+
113
221
  ## Features
114
222
 
115
- fastapi-voyager is designed for scenarios using FastAPI as internal API integration endpoints. It helps visualize dependencies and serves as an architecture tool to identify implementation issues such as wrong relationships, overfetching, and more.
223
+ fastapi-voyager is designed for scenarios using web frameworks with Pydantic models (FastAPI, Django Ninja, Litestar). It helps visualize dependencies and serves as an architecture tool to identify implementation issues such as wrong relationships, overfetching, and more.
116
224
 
117
225
  **Best Practice**: When building view models following the ER model pattern, fastapi-voyager can fully realize its potential - quickly identifying which APIs use specific entities and vice versa.
118
226
 
@@ -258,6 +366,21 @@ uv pip install ".[dev]"
258
366
  uvicorn tests.programatic:app --reload
259
367
  ```
260
368
 
369
+ ### Test Different Frameworks
370
+
371
+ You can test the framework-specific examples:
372
+
373
+ ```bash
374
+ # FastAPI example
375
+ uvicorn tests.fastapi.embedding:app --reload
376
+
377
+ # Django Ninja example
378
+ uvicorn tests.django_ninja.embedding:app --reload
379
+
380
+ # Litestar example
381
+ uvicorn tests.litestar.embedding:asgi_app --reload
382
+ ```
383
+
261
384
  Visit `http://localhost:8000/voyager` to see changes.
262
385
 
263
386
  ### Setup Git Hooks (Optional)
@@ -289,9 +412,12 @@ This will run Prettier automatically before each commit. See [`.githooks/README.
289
412
 
290
413
  ## Dependencies
291
414
 
292
- - [FastAPI](https://fastapi.tiangolo.com/)
293
415
  - [pydantic-resolve](https://github.com/allmonday/pydantic-resolve)
294
416
  - [Quasar Framework](https://quasar.dev/)
417
+ ### Dev dependencies
418
+ - [FastAPI](https://fastapi.tiangolo.com/)
419
+ - [Django Ninja](https://django-ninja.rest-framework.com/)
420
+ - [Litestar](https://litestar.dev/)
295
421
 
296
422
  ## Credits
297
423
 
@@ -1,16 +1,28 @@
1
- fastapi_voyager/__init__.py,sha256=kqwzThE1YhmQ_7jPKGlnWvqRGC-hFrRqq_lKhKaleYU,229
1
+ fastapi_voyager/__init__.py,sha256=1IdDy6JUMgQqQo33qUe2znX9YeI7S35pjVrbt0QLOzY,228
2
2
  fastapi_voyager/cli.py,sha256=td3yIIigEomhSdDO-Xkh-CgpEwCafwlwnpvxnT9QsBo,10488
3
- fastapi_voyager/er_diagram.py,sha256=AbaKbcNd3cgCaQBsE0aHzvljTiZza3bmRiGJI3BGhGo,7873
3
+ fastapi_voyager/er_diagram.py,sha256=4Ba5u-T7XmVmk9MltVMe-m-18mUAHMTybTdE-zNZLrU,7860
4
4
  fastapi_voyager/filter.py,sha256=AN_HIu8-DtKisIq5mFt7CnqRHtxKewedNGyyaI82hSY,11529
5
5
  fastapi_voyager/module.py,sha256=h9YR3BpS-CAcJW9WCdVkF4opqwY32w9T67g9GfdLytk,3425
6
- fastapi_voyager/pydantic_resolve_util.py,sha256=r4Rq7BtBcFOMV7O2Ab9TwLyRNL1yNDiQlGUVybf-sXs,3524
7
- fastapi_voyager/render.py,sha256=5tTuvvCCUwFCq3WJGT1rfTSW41mSDoVyJwMyQGrmhiQ,17271
8
- fastapi_voyager/render_style.py,sha256=mPOuChEl71-3agCbPwkMt2sFmax2AEKDI6dK90eFPRc,2552
9
- fastapi_voyager/server.py,sha256=E0gGU7D1pBvnV7gFLBUvnkwtiBFbU1PbxEXHHSIA1oA,9115
6
+ fastapi_voyager/pydantic_resolve_util.py,sha256=0UfAp6Yi6FNpsI1bUu89hRVWFy6keBu1KtcZl-6NYso,3526
7
+ fastapi_voyager/render.py,sha256=A1jFDraQFOfnFHguYlsvBbGIDJ527VQH0jZ-xgTjqIk,17270
8
+ fastapi_voyager/render_style.py,sha256=1y3aRhBSJSWU-JuSgjn9il_xFEqjv6mJCoUzImLQT6M,2525
9
+ fastapi_voyager/server.py,sha256=sgUUscbt736VNB6CN2J_6rJ6fpWO4vJFW7oP7FmAjvA,6739
10
10
  fastapi_voyager/type.py,sha256=zluWvh5vpnjXJ9aAmyNJTSmXZPjAHCvgRT5oQRAjHrg,2104
11
- fastapi_voyager/type_helper.py,sha256=FmfrZAI3Z4uDdh3sH_kH7UGoY6yNVPapneSN86qY_wo,10209
12
- fastapi_voyager/version.py,sha256=7F_t4pHiI_38oJ-3IRvYl5xfn2qV8LfVfFPlM9BacI0,49
13
- fastapi_voyager/voyager.py,sha256=4vonmL-xt54C5San-DRBq4mjoV8Q96eoWRy68MJ1IJw,14169
11
+ fastapi_voyager/type_helper.py,sha256=5HYUHdghTISZ44NvVsrMWlRGD5C9-xrGeNKuLYDMA6s,10209
12
+ fastapi_voyager/version.py,sha256=0KZ1gUzWpAnbQTYDMdcLc-qEsyVlYlG265SEa7S4Ij4,56
13
+ fastapi_voyager/voyager.py,sha256=S0cCMLFv_wPfEMVdp4cYqbc-Y207SjCTSmsYdqzIDHg,15307
14
+ fastapi_voyager/adapters/__init__.py,sha256=a95rBvV4QVcX_yAzjuJQKOW-EbJ79R--YjUJ3BGkC3k,517
15
+ fastapi_voyager/adapters/base.py,sha256=m-E74LlNgYCpj-gqfYsKl2mzWW5iFiaDTjiBri_5cfo,1283
16
+ fastapi_voyager/adapters/common.py,sha256=DXVLsjLn65U3RR7YyKL_ELV74mnINWmZ4hQ6zISdV0E,9684
17
+ fastapi_voyager/adapters/django_ninja_adapter.py,sha256=tl1rMcotAhOwBxT8poG8rTXm1v3wn_cpaoda79NEFxE,11424
18
+ fastapi_voyager/adapters/fastapi_adapter.py,sha256=-VvCXdMRsV_zZzEkplOGK8HjQ9ICoTyapG3ZluQ1Nvk,5870
19
+ fastapi_voyager/adapters/litestar_adapter.py,sha256=-ILD8jIb82_JKV87p4IfV9IXvhUJ6RSic6i_iHapo5w,6812
20
+ fastapi_voyager/introspectors/__init__.py,sha256=HbmoUyM-BSwd4Rg2ptd9u-qvZSD3UykKyHYVoRg03OM,917
21
+ fastapi_voyager/introspectors/base.py,sha256=hMfka9gVXr-E8MA1rKSSmYk0OppqgiFPWavfgAkPmQI,2131
22
+ fastapi_voyager/introspectors/detector.py,sha256=rmlpQARJMrFXPty6OUdjmFRTtBYErGDH4l7Tivnu_FQ,3910
23
+ fastapi_voyager/introspectors/django_ninja.py,sha256=Ytneh_kpsakTo_Njv1e4nvqfErjT1PrYelLZ-8xX5Gg,4052
24
+ fastapi_voyager/introspectors/fastapi.py,sha256=SyWGKAH8cM3CENY-Uu3YY6e8kFM5BE-jEBBZLoIF--A,2696
25
+ fastapi_voyager/introspectors/litestar.py,sha256=QXnaT0-hCa_0sByKJoUWuu0vIzRpCCKLokCBDTtv_s4,6100
14
26
  fastapi_voyager/templates/dot/cluster.j2,sha256=I2z9KkfCzmAtqXe0gXBnxnOfBXUSpdlATs3uf-O8_B8,307
15
27
  fastapi_voyager/templates/dot/cluster_container.j2,sha256=2tH1mOJvPoVKE_aHVMR3t06TfH_dYa9OeH6DBqSHt_A,204
16
28
  fastapi_voyager/templates/dot/digraph.j2,sha256=wZuiO-vvZ-AJ1FcMQG4BLevUyxk6yA-yEpUa3Us05mE,435
@@ -24,14 +36,14 @@ fastapi_voyager/templates/html/pydantic_meta.j2,sha256=_tsSqjucs_QrAlPIVRy9u6I2-
24
36
  fastapi_voyager/templates/html/schema_field_row.j2,sha256=KfKexHO_QJV-OIJS0eiY_7fqA8031fWpD2g2wTv4BuE,111
25
37
  fastapi_voyager/templates/html/schema_header.j2,sha256=9WpuHLy3Zbv5GHG08qqaj5Xf-gaR-79ErBYuANZp7iA,179
26
38
  fastapi_voyager/templates/html/schema_table.j2,sha256=rzphiGk1il7uv4Gr2p_HLPHqyLZk63vLrGAmIduTdSE,117
27
- fastapi_voyager/web/graph-ui.js,sha256=4gEkXTgbA6CouD4IDMW5yKYfJTxHN2vL9G0CAr6w4qA,7662
39
+ fastapi_voyager/web/graph-ui.js,sha256=9b2auyGWEpUcF65YV231GNojQ9Uk6FsT1SlRR3lSYnc,7664
28
40
  fastapi_voyager/web/graphviz.svg.css,sha256=K218ov_mdSe3ga4KwhiBB92ynVvm5zaAk9_D9a3d8hE,1546
29
- fastapi_voyager/web/graphviz.svg.js,sha256=deI815RgxpZ3_MpELeV-TBYy2MVuUvZtQOHfS3aeXHY,18203
30
- fastapi_voyager/web/index.html,sha256=wM9vJ_UfHR8p98F6SEMCKKjJcBEl0EyosWuPqVZYXvA,23496
41
+ fastapi_voyager/web/graphviz.svg.js,sha256=VokgCghvP4zm3SFiFVPIikdW6XzjkZJXQkBbCrEitug,19885
42
+ fastapi_voyager/web/index.html,sha256=4HGVavdd15u_BA7BwC-RJEeKal6hcYbiQaLcoOANQHI,23485
31
43
  fastapi_voyager/web/quasar.min.css,sha256=F5jQe7X2XT54VlvAaa2V3GsBFdVD-vxDZeaPLf6U9CU,203145
32
44
  fastapi_voyager/web/quasar.min.js,sha256=h0ftyPMW_CRiyzeVfQqiup0vrVt4_QWojpqmpnpn07E,502974
33
- fastapi_voyager/web/store.js,sha256=vwiqeLw7DfTOUDu9oN7b6nSBw8KG6W-5Dc-voQ1leL8,15113
34
- fastapi_voyager/web/vue-main.js,sha256=4lJi6ADrcaOzjXcQePkp7CyiCkAnvhnO-nkF3E6G3s4,10650
45
+ fastapi_voyager/web/store.js,sha256=CKQz5tZtv6W70TDVqeQiOt2gUXzD0WIc0ufCa0dB8sU,15193
46
+ fastapi_voyager/web/vue-main.js,sha256=MedNrfgy2KJCFiyv8sczC8d8M2yytZDX58PQGvjUYdM,10825
35
47
  fastapi_voyager/web/component/demo.js,sha256=sAklFGhKGmMy9-ofgOw2oPIidAoIOgHu6yvV51L_MAA,350
36
48
  fastapi_voyager/web/component/render-graph.js,sha256=9wnO70n3eyPKTpa744idgs5PSwgvzbfv4InZ68eEOKs,2454
37
49
  fastapi_voyager/web/component/route-code-display.js,sha256=a823nBz3EEjutW2pfi73rcF3hodCBmgYNmuZi94sXE4,3615
@@ -43,8 +55,8 @@ fastapi_voyager/web/icon/favicon-16x16.png,sha256=JC07jEzfIYxBIoQn_FHXvyHuxESdhW
43
55
  fastapi_voyager/web/icon/favicon-32x32.png,sha256=C7v1h58cfWOsiLp9yOIZtlx-dLasBcq3NqpHVGRmpt4,1859
44
56
  fastapi_voyager/web/icon/favicon.ico,sha256=tZolYIXkkBcFiYl1A8ksaXN2VjGamzcSdes838dLvNc,15406
45
57
  fastapi_voyager/web/icon/site.webmanifest,sha256=GRozZ5suTykYcPMap1QhjrAB8PLW0mbT_phhzw_utvQ,316
46
- fastapi_voyager-0.15.5.dist-info/METADATA,sha256=nvrvye9JChzW2WQLNq2S3wzPrDU67ZEFoOMYkNcXtuA,9870
47
- fastapi_voyager-0.15.5.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
48
- fastapi_voyager-0.15.5.dist-info/entry_points.txt,sha256=pEIKoUnIDXEtdMBq8EmXm70m16vELIu1VPz9-TBUFWM,53
49
- fastapi_voyager-0.15.5.dist-info/licenses/LICENSE,sha256=lNVRR3y_bFVoFKuK2JM8N4sFaj3m-7j29kvL3olFi5Y,1067
50
- fastapi_voyager-0.15.5.dist-info/RECORD,,
58
+ fastapi_voyager-0.16.0a1.dist-info/METADATA,sha256=pGOq7n96lV1BKAXvCKPXUU8BvXN89HzgAMI90dmnH_Y,12943
59
+ fastapi_voyager-0.16.0a1.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
60
+ fastapi_voyager-0.16.0a1.dist-info/entry_points.txt,sha256=pEIKoUnIDXEtdMBq8EmXm70m16vELIu1VPz9-TBUFWM,53
61
+ fastapi_voyager-0.16.0a1.dist-info/licenses/LICENSE,sha256=lNVRR3y_bFVoFKuK2JM8N4sFaj3m-7j29kvL3olFi5Y,1067
62
+ fastapi_voyager-0.16.0a1.dist-info/RECORD,,