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.
- drf_to_mkdoc/conf/defaults.py +1 -0
- drf_to_mkdoc/conf/settings.py +1 -0
- drf_to_mkdoc/management/commands/build_model_docs.py +10 -1
- drf_to_mkdoc/static/drf-to-mkdoc/javascripts/field-sections-loader.js +29 -0
- drf_to_mkdoc/static/drf-to-mkdoc/javascripts/query-parameters-loader.js +16 -0
- drf_to_mkdoc/static/drf-to-mkdoc/javascripts/try-out/field-extractor.js +200 -0
- drf_to_mkdoc/static/drf-to-mkdoc/javascripts/try-out/form-manager.js +307 -14
- drf_to_mkdoc/static/drf-to-mkdoc/javascripts/try-out/main.js +39 -11
- drf_to_mkdoc/static/drf-to-mkdoc/javascripts/try-out/modal.js +298 -18
- drf_to_mkdoc/static/drf-to-mkdoc/javascripts/try-out/query-parameters-extractor.js +94 -0
- drf_to_mkdoc/static/drf-to-mkdoc/javascripts/try-out/request-executor.js +278 -62
- drf_to_mkdoc/static/drf-to-mkdoc/javascripts/try-out/response-modal.js +173 -0
- drf_to_mkdoc/static/drf-to-mkdoc/javascripts/try-out/suggestions.js +59 -152
- drf_to_mkdoc/static/drf-to-mkdoc/javascripts/try-out/tabs.js +52 -9
- drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/badges.css +13 -5
- drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/theme-toggle.css +297 -25
- drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/try-out/fab.css +204 -0
- drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/try-out/response.css +323 -0
- drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/try-out/variables.css +139 -0
- drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/field-sections.css +136 -0
- drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/try-out/form.css +539 -0
- drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/try-out/modal.css +239 -17
- drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/try-out/response.css +503 -43
- drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/try-out/tabs.css +71 -19
- drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/try-out/variables.css +71 -15
- drf_to_mkdoc/templates/endpoints/detail/request_body.html +2 -0
- drf_to_mkdoc/templates/er_diagrams/app.html +26 -0
- drf_to_mkdoc/templates/er_diagrams/index.html +14 -0
- drf_to_mkdoc/templates/er_diagrams/main.html +22 -0
- drf_to_mkdoc/templates/try-out/fab.html +67 -3
- drf_to_mkdoc/templates/try-out/form.html +221 -74
- drf_to_mkdoc/templates/try-out/modal.html +75 -7
- drf_to_mkdoc/templates/try-out/response-modal.html +138 -9
- drf_to_mkdoc/utils/endpoint_detail_generator.py +1 -0
- drf_to_mkdoc/utils/er_diagram_generator.py +230 -0
- {drf_to_mkdoc-0.2.3.dist-info → drf_to_mkdoc-0.3.0.dist-info}/METADATA +89 -10
- {drf_to_mkdoc-0.2.3.dist-info → drf_to_mkdoc-0.3.0.dist-info}/RECORD +40 -27
- {drf_to_mkdoc-0.2.3.dist-info → drf_to_mkdoc-0.3.0.dist-info}/WHEEL +0 -0
- {drf_to_mkdoc-0.2.3.dist-info → drf_to_mkdoc-0.3.0.dist-info}/licenses/LICENSE +0 -0
- {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:
|
|
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
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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:
|
|
27
|
-
|
|
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
|
|
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
|
-
|
|
21
|
-
--try-out-
|
|
22
|
-
--try-out-
|
|
23
|
-
--try-out-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
--try-out-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
--try-out-
|
|
30
|
-
--try-out-
|
|
31
|
-
--try-out-
|
|
32
|
-
--try-out-
|
|
33
|
-
|
|
34
|
-
--try-out-
|
|
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
|
}
|
|
@@ -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
|
-
<
|
|
3
|
-
<
|
|
4
|
-
|
|
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>
|