drf-to-mkdoc 0.1.5__tar.gz → 0.1.6__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.

Potentially problematic release.


This version of drf-to-mkdoc might be problematic. Click here for more details.

Files changed (57) hide show
  1. {drf_to_mkdoc-0.1.5 → drf_to_mkdoc-0.1.6}/PKG-INFO +1 -1
  2. {drf_to_mkdoc-0.1.5 → drf_to_mkdoc-0.1.6}/conf/defaults.py +1 -0
  3. {drf_to_mkdoc-0.1.5 → drf_to_mkdoc-0.1.6}/drf_to_mkdoc/management/commands/generate_model_docs.py +36 -7
  4. {drf_to_mkdoc-0.1.5 → drf_to_mkdoc-0.1.6}/drf_to_mkdoc/utils/common.py +4 -4
  5. {drf_to_mkdoc-0.1.5 → drf_to_mkdoc-0.1.6}/drf_to_mkdoc/utils/extractors/query_parameter_extractors.py +4 -0
  6. {drf_to_mkdoc-0.1.5 → drf_to_mkdoc-0.1.6}/drf_to_mkdoc.egg-info/PKG-INFO +1 -1
  7. drf_to_mkdoc-0.1.6/drf_to_mkdoc.egg-info/SOURCES.txt +54 -0
  8. drf_to_mkdoc-0.1.5/drf_to_mkdoc.egg-info/SOURCES.txt +0 -54
  9. {drf_to_mkdoc-0.1.5 → drf_to_mkdoc-0.1.6}/.github/workflows/publish.yaml +0 -0
  10. {drf_to_mkdoc-0.1.5 → drf_to_mkdoc-0.1.6}/CONTRIBUTING.md +0 -0
  11. {drf_to_mkdoc-0.1.5 → drf_to_mkdoc-0.1.6}/LICENSE +0 -0
  12. {drf_to_mkdoc-0.1.5 → drf_to_mkdoc-0.1.6}/MANIFEST.in +0 -0
  13. {drf_to_mkdoc-0.1.5 → drf_to_mkdoc-0.1.6}/README.md +0 -0
  14. {drf_to_mkdoc-0.1.5 → drf_to_mkdoc-0.1.6}/conf/__init__.py +0 -0
  15. {drf_to_mkdoc-0.1.5 → drf_to_mkdoc-0.1.6}/conf/settings.py +0 -0
  16. {drf_to_mkdoc-0.1.5 → drf_to_mkdoc-0.1.6}/docs/customizing_endpoints.md +0 -0
  17. {drf_to_mkdoc-0.1.5 → drf_to_mkdoc-0.1.6}/docs/serving_mkdocs_with_django.md +0 -0
  18. {drf_to_mkdoc-0.1.5 → drf_to_mkdoc-0.1.6}/drf_to_mkdoc/__init__.py +0 -0
  19. {drf_to_mkdoc-0.1.5 → drf_to_mkdoc-0.1.6}/drf_to_mkdoc/apps.py +0 -0
  20. {drf_to_mkdoc-0.1.5 → drf_to_mkdoc-0.1.6}/drf_to_mkdoc/conf/__init__.py +0 -0
  21. {drf_to_mkdoc-0.1.5 → drf_to_mkdoc-0.1.6}/drf_to_mkdoc/conf/defaults.py +0 -0
  22. {drf_to_mkdoc-0.1.5 → drf_to_mkdoc-0.1.6}/drf_to_mkdoc/conf/settings.py +0 -0
  23. {drf_to_mkdoc-0.1.5 → drf_to_mkdoc-0.1.6}/drf_to_mkdoc/management/__init__.py +0 -0
  24. {drf_to_mkdoc-0.1.5 → drf_to_mkdoc-0.1.6}/drf_to_mkdoc/management/commands/__init__.py +0 -0
  25. {drf_to_mkdoc-0.1.5 → drf_to_mkdoc-0.1.6}/drf_to_mkdoc/management/commands/build_docs.py +0 -0
  26. {drf_to_mkdoc-0.1.5 → drf_to_mkdoc-0.1.6}/drf_to_mkdoc/management/commands/generate_doc_json.py +0 -0
  27. {drf_to_mkdoc-0.1.5 → drf_to_mkdoc-0.1.6}/drf_to_mkdoc/management/commands/generate_docs.py +0 -0
  28. {drf_to_mkdoc-0.1.5 → drf_to_mkdoc-0.1.6}/drf_to_mkdoc/management/commands/update_doc_schema.py +0 -0
  29. {drf_to_mkdoc-0.1.5/static → drf_to_mkdoc-0.1.6/drf_to_mkdoc/static/drf-to-mkdoc}/javascripts/endpoints-filter.js +0 -0
  30. {drf_to_mkdoc-0.1.5/static → drf_to_mkdoc-0.1.6/drf_to_mkdoc/static/drf-to-mkdoc}/stylesheets/endpoints/accessibility.css +0 -0
  31. {drf_to_mkdoc-0.1.5/static → drf_to_mkdoc-0.1.6/drf_to_mkdoc/static/drf-to-mkdoc}/stylesheets/endpoints/animations.css +0 -0
  32. {drf_to_mkdoc-0.1.5/static → drf_to_mkdoc-0.1.6/drf_to_mkdoc/static/drf-to-mkdoc}/stylesheets/endpoints/badges.css +0 -0
  33. {drf_to_mkdoc-0.1.5/static → drf_to_mkdoc-0.1.6/drf_to_mkdoc/static/drf-to-mkdoc}/stylesheets/endpoints/base.css +0 -0
  34. {drf_to_mkdoc-0.1.5/static → drf_to_mkdoc-0.1.6/drf_to_mkdoc/static/drf-to-mkdoc}/stylesheets/endpoints/endpoint-content.css +0 -0
  35. {drf_to_mkdoc-0.1.5/static → drf_to_mkdoc-0.1.6/drf_to_mkdoc/static/drf-to-mkdoc}/stylesheets/endpoints/endpoints-grid.css +0 -0
  36. {drf_to_mkdoc-0.1.5/static → drf_to_mkdoc-0.1.6/drf_to_mkdoc/static/drf-to-mkdoc}/stylesheets/endpoints/filter-section.css +0 -0
  37. {drf_to_mkdoc-0.1.5/static → drf_to_mkdoc-0.1.6/drf_to_mkdoc/static/drf-to-mkdoc}/stylesheets/endpoints/fixes.css +0 -0
  38. {drf_to_mkdoc-0.1.5/static → drf_to_mkdoc-0.1.6/drf_to_mkdoc/static/drf-to-mkdoc}/stylesheets/endpoints/layout.css +0 -0
  39. {drf_to_mkdoc-0.1.5/static → drf_to_mkdoc-0.1.6/drf_to_mkdoc/static/drf-to-mkdoc}/stylesheets/endpoints/loading.css +0 -0
  40. {drf_to_mkdoc-0.1.5/static → drf_to_mkdoc-0.1.6/drf_to_mkdoc/static/drf-to-mkdoc}/stylesheets/endpoints/responsive.css +0 -0
  41. {drf_to_mkdoc-0.1.5/static → drf_to_mkdoc-0.1.6/drf_to_mkdoc/static/drf-to-mkdoc}/stylesheets/endpoints/sections.css +0 -0
  42. {drf_to_mkdoc-0.1.5/static → drf_to_mkdoc-0.1.6/drf_to_mkdoc/static/drf-to-mkdoc}/stylesheets/endpoints/stats.css +0 -0
  43. {drf_to_mkdoc-0.1.5/static → drf_to_mkdoc-0.1.6/drf_to_mkdoc/static/drf-to-mkdoc}/stylesheets/endpoints/tags.css +0 -0
  44. {drf_to_mkdoc-0.1.5/static → drf_to_mkdoc-0.1.6/drf_to_mkdoc/static/drf-to-mkdoc}/stylesheets/endpoints/theme-toggle.css +0 -0
  45. {drf_to_mkdoc-0.1.5/static → drf_to_mkdoc-0.1.6/drf_to_mkdoc/static/drf-to-mkdoc}/stylesheets/endpoints/variables.css +0 -0
  46. {drf_to_mkdoc-0.1.5/static → drf_to_mkdoc-0.1.6/drf_to_mkdoc/static/drf-to-mkdoc}/stylesheets/extra.css +0 -0
  47. {drf_to_mkdoc-0.1.5 → drf_to_mkdoc-0.1.6}/drf_to_mkdoc/utils/__init__.py +0 -0
  48. {drf_to_mkdoc-0.1.5 → drf_to_mkdoc-0.1.6}/drf_to_mkdoc/utils/endpoint_generator.py +0 -0
  49. {drf_to_mkdoc-0.1.5 → drf_to_mkdoc-0.1.6}/drf_to_mkdoc/utils/extractors/__init__.py +0 -0
  50. {drf_to_mkdoc-0.1.5 → drf_to_mkdoc-0.1.6}/drf_to_mkdoc/utils/md_generators/__init__.py +0 -0
  51. {drf_to_mkdoc-0.1.5 → drf_to_mkdoc-0.1.6}/drf_to_mkdoc/utils/md_generators/query_parameters_generators.py +0 -0
  52. {drf_to_mkdoc-0.1.5 → drf_to_mkdoc-0.1.6}/drf_to_mkdoc/utils/model_generator.py +0 -0
  53. {drf_to_mkdoc-0.1.5 → drf_to_mkdoc-0.1.6}/drf_to_mkdoc.egg-info/dependency_links.txt +0 -0
  54. {drf_to_mkdoc-0.1.5 → drf_to_mkdoc-0.1.6}/drf_to_mkdoc.egg-info/requires.txt +0 -0
  55. {drf_to_mkdoc-0.1.5 → drf_to_mkdoc-0.1.6}/drf_to_mkdoc.egg-info/top_level.txt +0 -0
  56. {drf_to_mkdoc-0.1.5 → drf_to_mkdoc-0.1.6}/pyproject.toml +0 -0
  57. {drf_to_mkdoc-0.1.5 → drf_to_mkdoc-0.1.6}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: drf-to-mkdoc
3
- Version: 0.1.5
3
+ Version: 0.1.6
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>
@@ -7,4 +7,5 @@ DEFAULTS = {
7
7
  },
8
8
  "INDEX_TEMPLATE": "index.md",
9
9
  "AUTH_TEMPLATE": "auth.md",
10
+ "PATH_PARAM_SUBSTITUTOR": None,
10
11
  }
@@ -139,21 +139,50 @@ class Command(BaseCommand):
139
139
 
140
140
  def introspect_relationship(self, field):
141
141
  """Introspect relationship fields"""
142
- return {
142
+ # Safely resolve related model label; can be None for generic relations
143
+ related_model_label = None
144
+ try:
145
+ if getattr(field, "related_model", None) is not None:
146
+ related_model_label = (
147
+ f"{field.related_model._meta.app_label}.{field.related_model.__name__}"
148
+ )
149
+ except Exception:
150
+ related_model_label = None
151
+
152
+ relationship_data = {
143
153
  "name": field.name,
144
154
  "type": field.__class__.__name__,
145
- "related_model": f"{field.related_model._meta.app_label}."
146
- f"{field.related_model.__name__}",
155
+ "related_model": related_model_label,
147
156
  "related_name": getattr(field, "related_name", None),
148
157
  "on_delete": self.get_on_delete_name(field),
149
158
  "null": getattr(field, "null", False),
150
159
  "blank": getattr(field, "blank", False),
151
- "many_to_many": field.many_to_many,
152
- "one_to_many": field.one_to_many,
153
- "many_to_one": field.many_to_one,
154
- "one_to_one": field.one_to_one,
160
+ "many_to_many": getattr(field, "many_to_many", False),
161
+ "one_to_many": getattr(field, "one_to_many", False),
162
+ "many_to_one": getattr(field, "many_to_one", False),
163
+ "one_to_one": getattr(field, "one_to_one", False),
155
164
  }
156
165
 
166
+ # Handle Django generic relations where related_model can be None
167
+ field_class_name = field.__class__.__name__
168
+ if field_class_name in ("GenericForeignKey", "GenericRelation"):
169
+ relationship_data["is_generic"] = True
170
+ # Capture common generic relation details when available
171
+ for attr_name in (
172
+ "ct_field",
173
+ "fk_field",
174
+ "object_id_field",
175
+ "content_type_field",
176
+ "for_concrete_model",
177
+ "related_query_name",
178
+ ):
179
+ if hasattr(field, attr_name):
180
+ relationship_data[attr_name] = getattr(field, attr_name)
181
+ else:
182
+ relationship_data["is_generic"] = False
183
+
184
+ return relationship_data
185
+
157
186
  def get_on_delete_name(self, field):
158
187
  """Get readable name for on_delete option"""
159
188
  if not hasattr(field, "on_delete") or field.on_delete is None:
@@ -170,16 +170,16 @@ def get_custom_schema():
170
170
  def convert_to_django_path(path: str, parameters: list[dict[str, Any]]) -> str:
171
171
  """
172
172
  Convert a path with {param} to a Django-style path with <type:param>.
173
- If DRF_TO_MKDOC_PATH_PARAM_SUBSTITUTOR is set, use that function instead.
173
+ If PATH_PARAM_SUBSTITUTOR is set, use that function instead.
174
174
  """
175
175
  function = None
176
- func_path = getattr(drf_to_mkdoc_settings, "DRF_TO_MKDOC_PATH_PARAM_SUBSTITUTOR", None)
176
+ func_path = getattr(drf_to_mkdoc_settings, "PATH_PARAM_SUBSTITUTOR", None)
177
177
 
178
178
  if func_path:
179
179
  try:
180
180
  function = import_string(func_path)
181
181
  except ImportError:
182
- logger.warning("DRF_TO_MKDOC_PATH_PARAM_SUBSTITUTOR is not a valid import path")
182
+ logger.warning("PATH_PARAM_SUBSTITUTOR is not a valid import path")
183
183
 
184
184
  # If custom function exists and returns a valid value, use it
185
185
  if callable(function):
@@ -292,7 +292,7 @@ def extract_viewset_from_operation_id(operation_id: str):
292
292
  return view_func
293
293
 
294
294
  except Exception as e:
295
- raise RuntimeError(f"Failed to resolve path {django_path}: {e}") from e
295
+ logger.error(f"Failed to resolve path {path}")
296
296
 
297
297
 
298
298
  def extract_viewset_name_from_operation_id(operation_id: str):
@@ -186,6 +186,10 @@ def _extract_filterset_fields_from_internal_attrs(filterset_class: Any) -> list[
186
186
 
187
187
 
188
188
  def _extract_filterset_fields_from_get_fields(filterset_class: Any) -> list[str]:
189
+ if not hasattr(filterset_class, "_meta"):
190
+ # If the Meta class is not defined in the Filter class,
191
+ # the get_fields function is raise error
192
+ return []
189
193
  fields = []
190
194
 
191
195
  # Try get_fields() method if available (for dynamic filters)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: drf-to-mkdoc
3
- Version: 0.1.5
3
+ Version: 0.1.6
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>
@@ -0,0 +1,54 @@
1
+ CONTRIBUTING.md
2
+ LICENSE
3
+ MANIFEST.in
4
+ README.md
5
+ pyproject.toml
6
+ .github/workflows/publish.yaml
7
+ conf/__init__.py
8
+ conf/defaults.py
9
+ conf/settings.py
10
+ docs/customizing_endpoints.md
11
+ docs/serving_mkdocs_with_django.md
12
+ drf_to_mkdoc/__init__.py
13
+ drf_to_mkdoc/apps.py
14
+ drf_to_mkdoc.egg-info/PKG-INFO
15
+ drf_to_mkdoc.egg-info/SOURCES.txt
16
+ drf_to_mkdoc.egg-info/dependency_links.txt
17
+ drf_to_mkdoc.egg-info/requires.txt
18
+ drf_to_mkdoc.egg-info/top_level.txt
19
+ drf_to_mkdoc/conf/__init__.py
20
+ drf_to_mkdoc/conf/defaults.py
21
+ drf_to_mkdoc/conf/settings.py
22
+ drf_to_mkdoc/management/__init__.py
23
+ drf_to_mkdoc/management/commands/__init__.py
24
+ drf_to_mkdoc/management/commands/build_docs.py
25
+ drf_to_mkdoc/management/commands/generate_doc_json.py
26
+ drf_to_mkdoc/management/commands/generate_docs.py
27
+ drf_to_mkdoc/management/commands/generate_model_docs.py
28
+ drf_to_mkdoc/management/commands/update_doc_schema.py
29
+ drf_to_mkdoc/static/drf-to-mkdoc/javascripts/endpoints-filter.js
30
+ drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/extra.css
31
+ drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/accessibility.css
32
+ drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/animations.css
33
+ drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/badges.css
34
+ drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/base.css
35
+ drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/endpoint-content.css
36
+ drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/endpoints-grid.css
37
+ drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/filter-section.css
38
+ drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/fixes.css
39
+ drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/layout.css
40
+ drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/loading.css
41
+ drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/responsive.css
42
+ drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/sections.css
43
+ drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/stats.css
44
+ drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/tags.css
45
+ drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/theme-toggle.css
46
+ drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/variables.css
47
+ drf_to_mkdoc/utils/__init__.py
48
+ drf_to_mkdoc/utils/common.py
49
+ drf_to_mkdoc/utils/endpoint_generator.py
50
+ drf_to_mkdoc/utils/model_generator.py
51
+ drf_to_mkdoc/utils/extractors/__init__.py
52
+ drf_to_mkdoc/utils/extractors/query_parameter_extractors.py
53
+ drf_to_mkdoc/utils/md_generators/__init__.py
54
+ drf_to_mkdoc/utils/md_generators/query_parameters_generators.py
@@ -1,54 +0,0 @@
1
- CONTRIBUTING.md
2
- LICENSE
3
- MANIFEST.in
4
- README.md
5
- pyproject.toml
6
- .github/workflows/publish.yaml
7
- conf/__init__.py
8
- conf/defaults.py
9
- conf/settings.py
10
- docs/customizing_endpoints.md
11
- docs/serving_mkdocs_with_django.md
12
- drf_to_mkdoc/__init__.py
13
- drf_to_mkdoc/apps.py
14
- drf_to_mkdoc.egg-info/PKG-INFO
15
- drf_to_mkdoc.egg-info/SOURCES.txt
16
- drf_to_mkdoc.egg-info/dependency_links.txt
17
- drf_to_mkdoc.egg-info/requires.txt
18
- drf_to_mkdoc.egg-info/top_level.txt
19
- drf_to_mkdoc/conf/__init__.py
20
- drf_to_mkdoc/conf/defaults.py
21
- drf_to_mkdoc/conf/settings.py
22
- drf_to_mkdoc/management/__init__.py
23
- drf_to_mkdoc/management/commands/__init__.py
24
- drf_to_mkdoc/management/commands/build_docs.py
25
- drf_to_mkdoc/management/commands/generate_doc_json.py
26
- drf_to_mkdoc/management/commands/generate_docs.py
27
- drf_to_mkdoc/management/commands/generate_model_docs.py
28
- drf_to_mkdoc/management/commands/update_doc_schema.py
29
- drf_to_mkdoc/utils/__init__.py
30
- drf_to_mkdoc/utils/common.py
31
- drf_to_mkdoc/utils/endpoint_generator.py
32
- drf_to_mkdoc/utils/model_generator.py
33
- drf_to_mkdoc/utils/extractors/__init__.py
34
- drf_to_mkdoc/utils/extractors/query_parameter_extractors.py
35
- drf_to_mkdoc/utils/md_generators/__init__.py
36
- drf_to_mkdoc/utils/md_generators/query_parameters_generators.py
37
- static/javascripts/endpoints-filter.js
38
- static/stylesheets/extra.css
39
- static/stylesheets/endpoints/accessibility.css
40
- static/stylesheets/endpoints/animations.css
41
- static/stylesheets/endpoints/badges.css
42
- static/stylesheets/endpoints/base.css
43
- static/stylesheets/endpoints/endpoint-content.css
44
- static/stylesheets/endpoints/endpoints-grid.css
45
- static/stylesheets/endpoints/filter-section.css
46
- static/stylesheets/endpoints/fixes.css
47
- static/stylesheets/endpoints/layout.css
48
- static/stylesheets/endpoints/loading.css
49
- static/stylesheets/endpoints/responsive.css
50
- static/stylesheets/endpoints/sections.css
51
- static/stylesheets/endpoints/stats.css
52
- static/stylesheets/endpoints/tags.css
53
- static/stylesheets/endpoints/theme-toggle.css
54
- static/stylesheets/endpoints/variables.css
File without changes
File without changes
File without changes
File without changes