drf-to-mkdoc 0.2.3__py3-none-any.whl → 0.3.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.

Files changed (40) hide show
  1. drf_to_mkdoc/conf/defaults.py +1 -0
  2. drf_to_mkdoc/conf/settings.py +1 -0
  3. drf_to_mkdoc/management/commands/build_model_docs.py +10 -1
  4. drf_to_mkdoc/static/drf-to-mkdoc/javascripts/field-sections-loader.js +29 -0
  5. drf_to_mkdoc/static/drf-to-mkdoc/javascripts/query-parameters-loader.js +16 -0
  6. drf_to_mkdoc/static/drf-to-mkdoc/javascripts/try-out/field-extractor.js +200 -0
  7. drf_to_mkdoc/static/drf-to-mkdoc/javascripts/try-out/form-manager.js +307 -14
  8. drf_to_mkdoc/static/drf-to-mkdoc/javascripts/try-out/main.js +39 -11
  9. drf_to_mkdoc/static/drf-to-mkdoc/javascripts/try-out/modal.js +298 -18
  10. drf_to_mkdoc/static/drf-to-mkdoc/javascripts/try-out/query-parameters-extractor.js +94 -0
  11. drf_to_mkdoc/static/drf-to-mkdoc/javascripts/try-out/request-executor.js +278 -62
  12. drf_to_mkdoc/static/drf-to-mkdoc/javascripts/try-out/response-modal.js +173 -0
  13. drf_to_mkdoc/static/drf-to-mkdoc/javascripts/try-out/suggestions.js +59 -152
  14. drf_to_mkdoc/static/drf-to-mkdoc/javascripts/try-out/tabs.js +52 -9
  15. drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/badges.css +13 -5
  16. drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/theme-toggle.css +297 -25
  17. drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/try-out/fab.css +204 -0
  18. drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/try-out/response.css +323 -0
  19. drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/try-out/variables.css +139 -0
  20. drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/field-sections.css +136 -0
  21. drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/try-out/form.css +539 -0
  22. drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/try-out/modal.css +239 -17
  23. drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/try-out/response.css +503 -43
  24. drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/try-out/tabs.css +71 -19
  25. drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/try-out/variables.css +71 -15
  26. drf_to_mkdoc/templates/endpoints/detail/request_body.html +2 -0
  27. drf_to_mkdoc/templates/er_diagrams/app.html +26 -0
  28. drf_to_mkdoc/templates/er_diagrams/index.html +14 -0
  29. drf_to_mkdoc/templates/er_diagrams/main.html +22 -0
  30. drf_to_mkdoc/templates/try-out/fab.html +67 -3
  31. drf_to_mkdoc/templates/try-out/form.html +221 -74
  32. drf_to_mkdoc/templates/try-out/modal.html +75 -7
  33. drf_to_mkdoc/templates/try-out/response-modal.html +138 -9
  34. drf_to_mkdoc/utils/endpoint_detail_generator.py +1 -0
  35. drf_to_mkdoc/utils/er_diagram_generator.py +230 -0
  36. {drf_to_mkdoc-0.2.3.dist-info → drf_to_mkdoc-0.3.0.dist-info}/METADATA +89 -10
  37. {drf_to_mkdoc-0.2.3.dist-info → drf_to_mkdoc-0.3.0.dist-info}/RECORD +40 -27
  38. {drf_to_mkdoc-0.2.3.dist-info → drf_to_mkdoc-0.3.0.dist-info}/WHEEL +0 -0
  39. {drf_to_mkdoc-0.2.3.dist-info → drf_to_mkdoc-0.3.0.dist-info}/licenses/LICENSE +0 -0
  40. {drf_to_mkdoc-0.2.3.dist-info → drf_to_mkdoc-0.3.0.dist-info}/top_level.txt +0 -0
@@ -1,50 +1,102 @@
1
- /* Tabs */
2
- .tabs {
1
+ /* Smart Tabs */
2
+ .smart-tabs {
3
3
  display: flex;
4
- gap: 0;
4
+ gap: var(--try-out-spacing-xs);
5
+ border-bottom: 1px solid var(--try-out-border);
6
+ padding-bottom: var(--try-out-spacing-xs);
5
7
  margin-bottom: var(--try-out-spacing-lg);
6
- border: 1px solid var(--try-out-border);
7
- border-radius: var(--try-out-border-radius);
8
- overflow: hidden;
9
- background-color: var(--try-out-surface);
10
8
  }
11
9
 
12
10
  .tab {
13
- flex: 1;
14
- padding: var(--try-out-spacing) var(--try-out-spacing-lg);
15
- border: none;
11
+ display: flex;
12
+ align-items: center;
13
+ gap: var(--try-out-spacing-xs);
14
+ padding: var(--try-out-spacing-sm) var(--try-out-spacing);
15
+ border-radius: var(--try-out-border-radius);
16
16
  background: transparent;
17
+ border: none;
17
18
  color: var(--try-out-text-light);
18
19
  cursor: pointer;
20
+ transition: var(--try-out-transition);
19
21
  font-size: var(--try-out-font-base);
20
22
  font-weight: 500;
21
23
  position: relative;
22
- transition: var(--try-out-transition);
23
- border-right: 1px solid var(--try-out-border);
24
24
  }
25
25
 
26
- .tab:last-child {
27
- border-right: none;
28
- }
29
-
30
- .tab:hover {
31
- background-color: rgba(25, 118, 210, 0.05);
26
+ .tab:hover:not(.active) {
27
+ background: var(--try-out-surface);
32
28
  color: var(--try-out-text);
33
29
  }
34
30
 
35
31
  .tab.active {
36
- background-color: var(--try-out-primary);
32
+ background: var(--try-out-primary);
37
33
  color: white;
34
+ box-shadow: var(--try-out-shadow-md);
35
+ }
36
+
37
+ .tab .icon {
38
+ font-size: 0.9rem;
39
+ line-height: 1;
40
+ }
41
+
42
+ .badge {
43
+ background: rgba(255, 255, 255, 0.2);
44
+ padding: 2px 6px;
45
+ border-radius: 10px;
46
+ font-size: 0.7em;
47
+ font-weight: 600;
48
+ line-height: 1;
49
+ }
50
+
51
+ .tab.active .badge {
52
+ background: rgba(255, 255, 255, 0.25);
53
+ }
54
+
55
+ .tab:not(.active) .badge {
56
+ background: var(--try-out-primary-light);
57
+ color: var(--try-out-primary);
38
58
  }
39
59
 
40
60
  .tab-content {
41
61
  display: none;
62
+ animation: fadeIn 0.2s ease-out;
42
63
  }
43
64
 
44
65
  .tab-content.active {
45
66
  display: block;
46
67
  }
47
68
 
69
+ /* Response Tabs */
70
+ .response-tabs {
71
+ display: flex;
72
+ gap: var(--try-out-spacing-xs);
73
+ border-bottom: 1px solid var(--try-out-border);
74
+ padding-bottom: var(--try-out-spacing-xs);
75
+ margin-bottom: var(--try-out-spacing);
76
+ }
77
+
78
+ .response-tabs .tab {
79
+ padding: var(--try-out-spacing-xs) var(--try-out-spacing-sm);
80
+ font-size: var(--try-out-font-sm);
81
+ }
82
+
83
+ /* Tab Focus States */
84
+ .tab:focus-visible {
85
+ outline: 2px solid var(--try-out-primary);
86
+ outline-offset: 2px;
87
+ }
88
+
89
+ @keyframes fadeIn {
90
+ from {
91
+ opacity: 0;
92
+ transform: translateY(10px);
93
+ }
94
+ to {
95
+ opacity: 1;
96
+ transform: translateY(0);
97
+ }
98
+ }
99
+
48
100
  /* Mobile Tabs */
49
101
  @media screen and (max-width: 768px) {
50
102
  .tabs {
@@ -1,6 +1,9 @@
1
1
  :root {
2
+ /* Color Palette */
2
3
  --try-out-primary: #1976d2;
3
4
  --try-out-primary-hover: #1565c0;
5
+ --try-out-primary-rgb: 25, 118, 210;
6
+ --try-out-primary-light: rgba(25, 118, 210, 0.1);
4
7
  --try-out-success: #28a745;
5
8
  --try-out-success-hover: #218838;
6
9
  --try-out-danger: #dc3545;
@@ -8,31 +11,84 @@
8
11
  --try-out-warning: #ffc107;
9
12
  --try-out-info: #17a2b8;
10
13
 
14
+ /* Light Theme Colors */
11
15
  --try-out-bg: #ffffff;
12
16
  --try-out-surface: #f8f9fa;
17
+ --try-out-surface-raised: #ffffff;
13
18
  --try-out-border: #e1e5e9;
14
19
  --try-out-text: #333333;
15
20
  --try-out-text-light: #666666;
16
21
  --try-out-text-lighter: #999999;
17
22
  --try-out-shadow: rgba(0, 0, 0, 0.1);
18
23
  --try-out-shadow-strong: rgba(0, 0, 0, 0.2);
24
+ --try-out-shadow-md: 0 4px 12px rgba(0, 0, 0, 0.15);
25
+ --try-out-shadow-lg: 0 8px 25px rgba(0, 0, 0, 0.15);
26
+ --try-out-shadow-xl: 0 20px 40px rgba(0, 0, 0, 0.2);
19
27
 
20
- --try-out-border-radius: 4px;
21
- --try-out-border-radius-lg: 6px;
22
- --try-out-spacing-xs: 0.2rem;
23
- --try-out-spacing-sm: 0.4rem;
24
- --try-out-spacing: 0.6rem;
25
- --try-out-spacing-lg: 0.8rem;
26
- --try-out-spacing-xl: 1.2rem;
27
- --try-out-spacing-xxl: 1.6rem;
28
-
29
- --try-out-font-sm: 0.75rem;
30
- --try-out-font-base: 0.8rem;
31
- --try-out-font-lg: 0.9rem;
32
- --try-out-line-height: 1.4;
33
-
34
- --try-out-transition: all 0.2s ease;
28
+ /* Glass Effect */
29
+ --try-out-glass-bg: rgba(255, 255, 255, 0.95);
30
+ --try-out-glass-border: rgba(255, 255, 255, 0.2);
31
+ --try-out-backdrop-blur: 10px;
32
+
33
+ /* Gradients */
34
+ --try-out-gradient-primary: linear-gradient(135deg, var(--try-out-primary), var(--try-out-primary-hover));
35
+
36
+ /* Layout */
37
+ --try-out-border-radius: 6px;
38
+ --try-out-border-radius-lg: 10px;
39
+ --try-out-spacing-2xs: 0.125rem;
40
+ --try-out-spacing-xs: 0.25rem;
41
+ --try-out-spacing-sm: 0.5rem;
42
+ --try-out-spacing: 0.75rem;
43
+ --try-out-spacing-lg: 1rem;
44
+ --try-out-spacing-xl: 1.5rem;
45
+ --try-out-spacing-xxl: 2rem;
46
+
47
+ /* Typography */
48
+ --try-out-font-sm: 0.875rem;
49
+ --try-out-font-base: 0.9rem;
50
+ --try-out-font-lg: 1rem;
51
+ --try-out-line-height: 1.5;
52
+
53
+ /* Animation */
54
+ --try-out-transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
55
+ --theme-transition: background-color 0.3s ease, color 0.3s ease, border-color 0.3s ease;
56
+
57
+ /* Z-Index */
35
58
  --try-out-z-modal: 1000;
36
59
  --try-out-z-response: 1100;
37
60
  --try-out-z-fab: 100;
61
+ --try-out-z-sticky: 50;
62
+ }
63
+
64
+ /* Dark Theme Colors */
65
+ [data-md-color-scheme="slate"] {
66
+ --try-out-bg: #1a1a1a;
67
+ --try-out-surface: #2d2d2d;
68
+ --try-out-surface-raised: #3a3a3a;
69
+ --try-out-border: #404040;
70
+ --try-out-text: #e0e0e0;
71
+ --try-out-text-light: #b0b0b0;
72
+ --try-out-text-lighter: #808080;
73
+ --try-out-shadow: rgba(0, 0, 0, 0.3);
74
+ --try-out-shadow-strong: rgba(0, 0, 0, 0.5);
75
+ --try-out-shadow-md: 0 4px 12px rgba(0, 0, 0, 0.3);
76
+ --try-out-shadow-lg: 0 8px 25px rgba(0, 0, 0, 0.4);
77
+ --try-out-shadow-xl: 0 20px 40px rgba(0, 0, 0, 0.5);
78
+
79
+ /* Glass Effect for Dark Mode */
80
+ --try-out-glass-bg: rgba(45, 45, 45, 0.95);
81
+ --try-out-glass-border: rgba(255, 255, 255, 0.1);
82
+
83
+ /* Adjust primary colors for better contrast */
84
+ --try-out-primary: #42a5f5;
85
+ --try-out-primary-hover: #2196f3;
86
+ --try-out-primary-rgb: 66, 165, 245;
87
+ --try-out-primary-light: rgba(66, 165, 245, 0.15);
88
+
89
+ /* Status colors for dark mode */
90
+ --try-out-success: #4caf50;
91
+ --try-out-danger: #f44336;
92
+ --try-out-warning: #ff9800;
93
+ --try-out-info: #00bcd4;
38
94
  }
@@ -4,7 +4,9 @@
4
4
  ## Request Body
5
5
 
6
6
  {% if request_example %}
7
+ <div class="request-example" data-example='{{ request_example|format_json }}'>
7
8
  {{ request_example|format_json }}
9
+ </div>
8
10
  {% endif %}
9
11
 
10
12
  {% endif %}
@@ -0,0 +1,26 @@
1
+ # {{ app_name|title|cut:"_"|safe }} Models
2
+
3
+ ```mermaid
4
+ erDiagram
5
+ {% for entity in app_entities %}
6
+ {{ entity.model_name }} {
7
+ {% for field in entity.fields %}
8
+ {{ field.name }} {{ field.type }}{% if field.is_pk %} "PK"{% elif field.nullable %} "NULLABLE"{% endif %}
9
+ {% endfor %}
10
+ }
11
+ {% endfor %}
12
+ {% for entity in related_entities %}
13
+ {{ entity.model_name }} {
14
+ id AutoField "PK"
15
+ }
16
+ {% endfor %}
17
+ {% for relationship in relationships %}
18
+ {{ relationship.source_model }} {{ relationship.type }} {{ relationship.target_model }} : "{{ relationship.description }}"
19
+ {% endfor %}
20
+
21
+ ```
22
+
23
+ ## Models
24
+
25
+ {% for entity in app_entities %}- [{{ entity.model_name }}](../../models/{{ entity.app_name }}/{{ entity.table_name }}/)
26
+ {% endfor %}
@@ -0,0 +1,14 @@
1
+ # Entity-Relationship Diagrams
2
+
3
+ This section contains Entity-Relationship (ER) diagrams for all Django models in the system.
4
+
5
+ ## [Complete System Diagram](main.md)
6
+
7
+ View the complete ER diagram showing all models and their relationships.
8
+
9
+ ## Application Diagrams
10
+
11
+ | Application | Models
12
+ |------------|--------|
13
+ {% for app in apps %}| [{{ app.name|title|cut:"_"|safe }}]({{ app.name }}.md) | {{ app.model_count }} |
14
+ {% endfor %}
@@ -0,0 +1,22 @@
1
+ # Complete Entity-Relationship Diagram
2
+
3
+ ```mermaid
4
+ erDiagram
5
+ {% for entity in entities %}
6
+ {{ entity.model_name }} {
7
+ {% for field in entity.fields %}
8
+ {{ field.name }} {{ field.type }}{% if field.is_pk %} "PK"{% elif field.nullable %} "NULLABLE"{% endif %}
9
+ {% endfor %}
10
+ }
11
+ {% endfor %}
12
+ {% for relationship in relationships %}
13
+ {{ relationship.source_model }} {{ relationship.type }} {{ relationship.target_model }} : "{{ relationship.description }}"
14
+ {% endfor %}
15
+
16
+ ```
17
+
18
+ <div class="er-diagram-controls">
19
+ <button class="zoom-in">Zoom In</button>
20
+ <button class="zoom-out">Zoom Out</button>
21
+ <button class="reset-zoom">Reset</button>
22
+ </div>
@@ -1,4 +1,68 @@
1
1
  <!-- Try Out Floating Action Button -->
2
- <button class="try-out-fab" role="button" tabindex="0" aria-label="Open Try It Out" onclick="TryOutSidebar.openTryOut()">
3
- <span>🚀</span>
4
- </button>
2
+ <div class="try-out-fab-container">
3
+ <button
4
+ class="try-out-fab"
5
+ role="button"
6
+ tabindex="0"
7
+ aria-label="Open Try It Out"
8
+ aria-expanded="false"
9
+ onclick="TryOutSidebar.openTryOut()"
10
+ data-tooltip="Try out this endpoint"
11
+ >
12
+ <div class="fab-content">
13
+ <span class="fab-icon">🚀</span>
14
+ </div>
15
+ <div class="ripple-container"></div>
16
+ <div class="pulse-ring"></div>
17
+ </button>
18
+ </div>
19
+
20
+ <script>
21
+ document.addEventListener('DOMContentLoaded', function() {
22
+ // Ripple effect
23
+ const fab = document.querySelector('.try-out-fab');
24
+
25
+ fab.addEventListener('click', function(e) {
26
+ const ripple = document.createElement('div');
27
+ ripple.className = 'ripple';
28
+
29
+ const rect = this.getBoundingClientRect();
30
+ const size = Math.max(rect.width, rect.height);
31
+ const x = e.clientX - rect.left - size / 2;
32
+ const y = e.clientY - rect.top - size / 2;
33
+
34
+ ripple.style.width = ripple.style.height = `${size}px`;
35
+ ripple.style.left = `${x}px`;
36
+ ripple.style.top = `${y}px`;
37
+
38
+ this.querySelector('.ripple-container').appendChild(ripple);
39
+
40
+ setTimeout(() => ripple.remove(), 600);
41
+ });
42
+
43
+ // Keyboard shortcut
44
+ document.addEventListener('keydown', function(e) {
45
+ if (e.ctrlKey && e.code === 'Space') {
46
+ e.preventDefault();
47
+ TryOutSidebar.openTryOut();
48
+
49
+ // Animate the FAB
50
+ fab.classList.add('keyboard-triggered');
51
+ setTimeout(() => fab.classList.remove('keyboard-triggered'), 200);
52
+ }
53
+ });
54
+
55
+ // Show/hide shortcut hint
56
+ let hintTimeout;
57
+ fab.addEventListener('mouseenter', function() {
58
+ clearTimeout(hintTimeout);
59
+ document.querySelector('.shortcut-hint').classList.add('visible');
60
+ });
61
+
62
+ fab.addEventListener('mouseleave', function() {
63
+ hintTimeout = setTimeout(() => {
64
+ document.querySelector('.shortcut-hint').classList.remove('visible');
65
+ }, 500);
66
+ });
67
+ });
68
+ </script>