drf-to-mkdoc 0.1.8__py3-none-any.whl → 0.2.0__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.
Potentially problematic release.
This version of drf-to-mkdoc might be problematic. Click here for more details.
- drf_to_mkdoc/conf/defaults.py +2 -0
- drf_to_mkdoc/management/commands/generate_docs.py +46 -71
- drf_to_mkdoc/management/commands/generate_model_docs.py +4 -5
- drf_to_mkdoc/static/drf-to-mkdoc/javascripts/try-out-sidebar.js +879 -0
- drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/try-out-sidebar.css +728 -0
- drf_to_mkdoc/utils/common.py +20 -15
- drf_to_mkdoc/utils/endpoint_detail_generator.py +9 -1
- drf_to_mkdoc/utils/model_detail_generator.py +23 -25
- {drf_to_mkdoc-0.1.8.dist-info → drf_to_mkdoc-0.2.0.dist-info}/METADATA +1 -1
- {drf_to_mkdoc-0.1.8.dist-info → drf_to_mkdoc-0.2.0.dist-info}/RECORD +13 -11
- {drf_to_mkdoc-0.1.8.dist-info → drf_to_mkdoc-0.2.0.dist-info}/WHEEL +0 -0
- {drf_to_mkdoc-0.1.8.dist-info → drf_to_mkdoc-0.2.0.dist-info}/licenses/LICENSE +0 -0
- {drf_to_mkdoc-0.1.8.dist-info → drf_to_mkdoc-0.2.0.dist-info}/top_level.txt +0 -0
drf_to_mkdoc/utils/common.py
CHANGED
|
@@ -174,39 +174,44 @@ def get_custom_schema():
|
|
|
174
174
|
def convert_to_django_path(path: str, parameters: list[dict[str, Any]]) -> str:
|
|
175
175
|
"""
|
|
176
176
|
Convert a path with {param} to a Django-style path with <type:param>.
|
|
177
|
-
If
|
|
177
|
+
If PATH_PARAM_SUBSTITUTE_FUNCTION is set, use that function instead.
|
|
178
178
|
"""
|
|
179
179
|
function = None
|
|
180
|
-
func_path =
|
|
180
|
+
func_path = drf_to_mkdoc_settings.PATH_PARAM_SUBSTITUTE_FUNCTION
|
|
181
181
|
|
|
182
182
|
if func_path:
|
|
183
183
|
try:
|
|
184
184
|
function = import_string(func_path)
|
|
185
185
|
except ImportError:
|
|
186
|
-
logger.warning("
|
|
186
|
+
logger.warning("PATH_PARAM_SUBSTITUTE_FUNCTION is not a valid import path")
|
|
187
187
|
|
|
188
188
|
# If custom function exists and returns a valid value, use it
|
|
189
|
+
PATH_PARAM_SUBSTITUTE_MAPPING = drf_to_mkdoc_settings.PATH_PARAM_SUBSTITUTE_MAPPING
|
|
189
190
|
if callable(function):
|
|
190
191
|
try:
|
|
191
|
-
|
|
192
|
-
if isinstance(
|
|
193
|
-
|
|
192
|
+
result = function(path, parameters)
|
|
193
|
+
if result and isinstance(result, dict):
|
|
194
|
+
PATH_PARAM_SUBSTITUTE_MAPPING.update(result)
|
|
194
195
|
except Exception as e:
|
|
195
196
|
logger.exception("Error in custom path substitutor: %s", e)
|
|
196
197
|
|
|
197
198
|
# Default Django path conversion
|
|
198
199
|
def replacement(match):
|
|
199
200
|
param_name = match.group(1)
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
if param_type == "integer":
|
|
205
|
-
converter = "int"
|
|
206
|
-
elif param_type == "string" and param_format == "uuid":
|
|
207
|
-
converter = "uuid"
|
|
201
|
+
custom_param_type = PATH_PARAM_SUBSTITUTE_MAPPING.get(param_name)
|
|
202
|
+
if custom_param_type and custom_param_type in ("int", "uuid", "str"):
|
|
203
|
+
converter = custom_param_type
|
|
208
204
|
else:
|
|
209
|
-
|
|
205
|
+
param_info = next((p for p in parameters if p.get("name") == param_name), {})
|
|
206
|
+
param_type = param_info.get("schema", {}).get("type")
|
|
207
|
+
param_format = param_info.get("schema", {}).get("format")
|
|
208
|
+
|
|
209
|
+
if param_type == "integer":
|
|
210
|
+
converter = "int"
|
|
211
|
+
elif param_type == "string" and param_format == "uuid":
|
|
212
|
+
converter = "uuid"
|
|
213
|
+
else:
|
|
214
|
+
converter = "str"
|
|
210
215
|
|
|
211
216
|
return f"<{converter}:{param_name}>"
|
|
212
217
|
|
|
@@ -572,14 +572,22 @@ def _create_endpoint_header(
|
|
|
572
572
|
"stylesheets/endpoints/animations.css",
|
|
573
573
|
"stylesheets/endpoints/accessibility.css",
|
|
574
574
|
"stylesheets/endpoints/loading.css",
|
|
575
|
+
"stylesheets/endpoints/try-out-sidebar.css",
|
|
576
|
+
]
|
|
577
|
+
scripts = [
|
|
578
|
+
"javascripts/try-out-sidebar.js",
|
|
575
579
|
]
|
|
576
580
|
prefix_path = f"{drf_to_mkdoc_settings.PROJECT_NAME}/"
|
|
577
581
|
css_links = "\n".join(
|
|
578
582
|
f'<link rel="stylesheet" href="{static(prefix_path + path)}">' for path in stylesheets
|
|
579
583
|
)
|
|
584
|
+
js_scripts = "\n".join(
|
|
585
|
+
f'<script src="{static(prefix_path + path)}" defer></script>' for path in scripts
|
|
586
|
+
)
|
|
580
587
|
content = f"""
|
|
581
|
-
<!-- inject CSS directly -->
|
|
588
|
+
<!-- inject CSS and JS directly -->
|
|
582
589
|
{css_links}
|
|
590
|
+
{js_scripts}
|
|
583
591
|
"""
|
|
584
592
|
content += f"# {method.upper()} {path}\n\n"
|
|
585
593
|
content += f"{format_method_badge(method)} `{path}`\n\n"
|
|
@@ -20,7 +20,7 @@ def generate_model_docs(models_data: dict[str, Any]) -> None:
|
|
|
20
20
|
write_file(file_path, content)
|
|
21
21
|
|
|
22
22
|
|
|
23
|
-
def
|
|
23
|
+
def render_column_fields_table(fields: dict[str, Any]) -> str:
|
|
24
24
|
"""Render the fields table for a model."""
|
|
25
25
|
content = "## Fields\n\n"
|
|
26
26
|
content += "| Field | Type | Description | Extra |\n"
|
|
@@ -31,6 +31,10 @@ def render_fields_table(fields: dict[str, Any]) -> str:
|
|
|
31
31
|
verbose_name = field_info.get("verbose_name", field_name)
|
|
32
32
|
help_text = field_info.get("help_text", "")
|
|
33
33
|
|
|
34
|
+
display_name = field_name
|
|
35
|
+
if field_type in ["ForeignKey", "OneToOneField"]:
|
|
36
|
+
display_name = f"{field_name}_id"
|
|
37
|
+
|
|
34
38
|
extra_info = []
|
|
35
39
|
if field_info.get("null"):
|
|
36
40
|
extra_info.append("null=True")
|
|
@@ -51,7 +55,7 @@ def render_fields_table(fields: dict[str, Any]) -> str:
|
|
|
51
55
|
extra_str = ", ".join(extra_info) if extra_info else ""
|
|
52
56
|
description_str = help_text or verbose_name
|
|
53
57
|
|
|
54
|
-
content += f"| `{
|
|
58
|
+
content += f"| `{display_name}` | {field_type} | {description_str} | {extra_str} |\n"
|
|
55
59
|
|
|
56
60
|
return content
|
|
57
61
|
|
|
@@ -121,35 +125,29 @@ def _create_model_header(name: str, app_label: str, table_name: str, description
|
|
|
121
125
|
|
|
122
126
|
def _add_fields_section(model_info: dict[str, Any]) -> str:
|
|
123
127
|
"""Add the fields section to the model documentation."""
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
name: info
|
|
127
|
-
for name, info in fields.items()
|
|
128
|
-
if info.get("type", "") not in ["ForeignKey", "OneToOneField", "ManyToManyField"]
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
if not non_relationship_fields:
|
|
128
|
+
column_fields = model_info.get("column_fields", {})
|
|
129
|
+
if not column_fields:
|
|
132
130
|
return ""
|
|
133
131
|
|
|
134
|
-
content =
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
132
|
+
content = ""
|
|
133
|
+
|
|
134
|
+
column_fields_content = render_column_fields_table(column_fields)
|
|
135
|
+
if column_fields_content:
|
|
136
|
+
content += column_fields_content
|
|
137
|
+
content += "\n"
|
|
138
|
+
|
|
139
|
+
choices_content = render_choices_tables(column_fields)
|
|
140
|
+
if choices_content:
|
|
141
|
+
content += choices_content
|
|
142
|
+
content += "\n"
|
|
143
|
+
|
|
138
144
|
return content
|
|
139
145
|
|
|
140
146
|
|
|
141
147
|
def _add_relationships_section(model_info: dict[str, Any]) -> str:
|
|
142
148
|
"""Add the relationships section to the model documentation."""
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
relationship_fields = {
|
|
147
|
-
name: info
|
|
148
|
-
for name, info in fields.items()
|
|
149
|
-
if info.get("type", "") in ["ForeignKey", "OneToOneField", "ManyToManyField"]
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
if not (relationships or relationship_fields):
|
|
149
|
+
relationship_fields = model_info.get("relationships", {})
|
|
150
|
+
if not relationship_fields:
|
|
153
151
|
return ""
|
|
154
152
|
|
|
155
153
|
content = "## Relationships\n\n"
|
|
@@ -157,7 +155,7 @@ def _add_relationships_section(model_info: dict[str, Any]) -> str:
|
|
|
157
155
|
content += "|-------|------|---------------|\n"
|
|
158
156
|
|
|
159
157
|
content += _render_relationship_fields(relationship_fields)
|
|
160
|
-
content += _render_relationships_from_section(
|
|
158
|
+
content += _render_relationships_from_section(relationship_fields)
|
|
161
159
|
content += "\n"
|
|
162
160
|
|
|
163
161
|
return content
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: drf-to-mkdoc
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.2.0
|
|
4
4
|
Summary: Generate Markdown API docs from Django/DRF OpenAPI schema for MkDocs
|
|
5
5
|
Author-email: Hossein Shayesteh <shayestehhs1@gmail.com>
|
|
6
6
|
Maintainer-email: Hossein Shayesteh <shayestehhs1@gmail.com>
|
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
drf_to_mkdoc/__init__.py,sha256=IbTW5uKQvJRG9ncHRuk_AGKHPn4ruxs5LqDpUFgUhws,180
|
|
2
2
|
drf_to_mkdoc/apps.py,sha256=-NrC_dRr6GmLmNQhkNh819B7V1SS4DYDv5JOR0TtuJM,560
|
|
3
3
|
drf_to_mkdoc/conf/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
4
|
-
drf_to_mkdoc/conf/defaults.py,sha256=
|
|
4
|
+
drf_to_mkdoc/conf/defaults.py,sha256=DZiATgfjkyU_J1RgR_zAzPdOVp-F2o3LVwjb3hP6j0U,660
|
|
5
5
|
drf_to_mkdoc/conf/settings.py,sha256=OOna4jWNTEfROBprpKnEHVl5RcAYExmOf0gBMA0E_FY,1664
|
|
6
6
|
drf_to_mkdoc/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
7
7
|
drf_to_mkdoc/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
8
8
|
drf_to_mkdoc/management/commands/build_docs.py,sha256=71dDDbb-qjRZr0kugviHtf3W_MSPFVjxkJ0tlLn97zM,4037
|
|
9
9
|
drf_to_mkdoc/management/commands/generate_doc_json.py,sha256=mWdYgMbSeLP4iQZeUm2DxwYQmdGy8w05XTEfbT_nOJo,19833
|
|
10
|
-
drf_to_mkdoc/management/commands/generate_docs.py,sha256=
|
|
11
|
-
drf_to_mkdoc/management/commands/generate_model_docs.py,sha256=
|
|
10
|
+
drf_to_mkdoc/management/commands/generate_docs.py,sha256=yxCuU5gXqpHEyL-U-li-s7X1Hae86Cb-Q2z3xlonw0k,4346
|
|
11
|
+
drf_to_mkdoc/management/commands/generate_model_docs.py,sha256=_A-C7gIZhCzFN4g9D8uwrd2yQW-HzgibCu4z_vx0QLM,13477
|
|
12
12
|
drf_to_mkdoc/management/commands/update_doc_schema.py,sha256=TtHVQxnVpB_VELRkVcdsDXDU5zXdguFleB1mXCDMAbg,2009
|
|
13
13
|
drf_to_mkdoc/static/drf-to-mkdoc/javascripts/endpoints-filter.js,sha256=KtfWroqsXg-wwmk36hpoH--M9WIW85EFNGeswMjFu4g,6138
|
|
14
|
+
drf_to_mkdoc/static/drf-to-mkdoc/javascripts/try-out-sidebar.js,sha256=zvEIm5rxTdMdmzElmmAqniIrI4ms2vsqGOMI0VFb_RQ,38953
|
|
14
15
|
drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/accessibility.css,sha256=DwCGPoaxaUvyifryrKqmkFDH06XBNf65kYsflMTbi0M,494
|
|
15
16
|
drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/animations.css,sha256=61m9SLAbatVUNuFeTUTxktoMu9SskYcwFjTsHYbsCRo,393
|
|
16
17
|
drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/badges.css,sha256=kUlUcf72uRw6x6Gn7cUq_aTuSGBbhumZ4Us-eBDM7DM,1251
|
|
@@ -26,6 +27,7 @@ drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/sections.css,sha256=xdrO6
|
|
|
26
27
|
drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/stats.css,sha256=0cDD8s63r6zQid_O1schNvfIwys1Y526xO6-B6s4Lxc,667
|
|
27
28
|
drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/tags.css,sha256=dOw13qsvVjx9cibzgzXlOutXVosNp6LzFfEFKvumG8w,1785
|
|
28
29
|
drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/theme-toggle.css,sha256=j1P5xDQDfos8jeVYz5s1jjEeujMlZtLi39OC6VeuMcA,1034
|
|
30
|
+
drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/try-out-sidebar.css,sha256=tkfQRpX0HTe09dqdjA4GxG5lOCLpw3Mp7VuxkFQtCvI,15829
|
|
29
31
|
drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/variables.css,sha256=Sg2vcQOHdpmEFDn43OeZcMIKxtr5EOEI_wISkCmtcSU,1895
|
|
30
32
|
drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/models/animations.css,sha256=IrqN9vJKgaHAWk2PBRKKmFHgH-lQlw5YZvEOGDqYk_g,656
|
|
31
33
|
drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/models/base.css,sha256=qdXDVScWoEvFbSRfjDlnxvQZBy2JFX9yXPngMWNSZ7o,1849
|
|
@@ -34,17 +36,17 @@ drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/models/model-tables.css,sha256=8CSy
|
|
|
34
36
|
drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/models/responsive.css,sha256=ygqyUtpiWchTBBIQil1C6mN0AC5xinLoP7whSKfBmwg,944
|
|
35
37
|
drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/models/variables.css,sha256=2HvyjnJrygSzdzpE-FYpo6FGhrYhmZ7NwDFAkADXQNg,1094
|
|
36
38
|
drf_to_mkdoc/utils/__init__.py,sha256=6dFTb07S6yIf-INMy0Mlgf5purNir687ZU9WZtITh4k,68
|
|
37
|
-
drf_to_mkdoc/utils/common.py,sha256=
|
|
38
|
-
drf_to_mkdoc/utils/endpoint_detail_generator.py,sha256=
|
|
39
|
+
drf_to_mkdoc/utils/common.py,sha256=SxjGe9MtyxTyroXP7QdUiW9QqZ1N7xPjHHaAI-hqYxc,12077
|
|
40
|
+
drf_to_mkdoc/utils/endpoint_detail_generator.py,sha256=vAGQz_DV5wS47hfZNWgI_1oKarLdV5TJ6nwv47uMWw0,27911
|
|
39
41
|
drf_to_mkdoc/utils/endpoint_list_generator.py,sha256=P7pEHscHNHpjDuTXmAUPYV3_t8uGSdaYOgiDGGoCwYc,9705
|
|
40
|
-
drf_to_mkdoc/utils/model_detail_generator.py,sha256=
|
|
42
|
+
drf_to_mkdoc/utils/model_detail_generator.py,sha256=IHxgEW87Z-kxcFVVWqwdc7k7PsZAwXwixddt-tCvLKg,7961
|
|
41
43
|
drf_to_mkdoc/utils/model_list_generator.py,sha256=7gTPwxOxlvvCfDgVPTbGPsLi1gnI47UjMqKc57qRmks,2409
|
|
42
44
|
drf_to_mkdoc/utils/extractors/__init__.py,sha256=BvC8gKOPVI9gU1Piw0jRhKQ2ER5s1moAxgq7ZYkJWNI,86
|
|
43
45
|
drf_to_mkdoc/utils/extractors/query_parameter_extractors.py,sha256=gnDlvF-bxkTp2NcEQf0EZZAfmdQzUpedhZ7N1LAYQzU,8432
|
|
44
46
|
drf_to_mkdoc/utils/md_generators/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
45
47
|
drf_to_mkdoc/utils/md_generators/query_parameters_generators.py,sha256=N-XqZ_FUODSR5V4xM9oEA3aaIiNGNmNwpvrWbQTx6RI,2566
|
|
46
|
-
drf_to_mkdoc-0.
|
|
47
|
-
drf_to_mkdoc-0.
|
|
48
|
-
drf_to_mkdoc-0.
|
|
49
|
-
drf_to_mkdoc-0.
|
|
50
|
-
drf_to_mkdoc-0.
|
|
48
|
+
drf_to_mkdoc-0.2.0.dist-info/licenses/LICENSE,sha256=3n9_ckIREsH8ogCxWW6dFsw_WfGcluG2mHcgl9i_UU0,1068
|
|
49
|
+
drf_to_mkdoc-0.2.0.dist-info/METADATA,sha256=UL7fU0BVLOoteGIHaJJxpNj2rHw9KXG1-l1xtKXJRno,7037
|
|
50
|
+
drf_to_mkdoc-0.2.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
51
|
+
drf_to_mkdoc-0.2.0.dist-info/top_level.txt,sha256=ZzJecR6j_tvLZiubUBEgawHflozC4DQy9ooNf1yDJ3Q,13
|
|
52
|
+
drf_to_mkdoc-0.2.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|