orionis 0.291.0__py3-none-any.whl → 0.292.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.
- orionis/metadata/framework.py +1 -1
- orionis/test/view/index.html +435 -29
- {orionis-0.291.0.dist-info → orionis-0.292.0.dist-info}/METADATA +1 -1
- {orionis-0.291.0.dist-info → orionis-0.292.0.dist-info}/RECORD +9 -9
- tests/example/test_example.py +1 -1
- {orionis-0.291.0.dist-info → orionis-0.292.0.dist-info}/WHEEL +0 -0
- {orionis-0.291.0.dist-info → orionis-0.292.0.dist-info}/licenses/LICENCE +0 -0
- {orionis-0.291.0.dist-info → orionis-0.292.0.dist-info}/top_level.txt +0 -0
- {orionis-0.291.0.dist-info → orionis-0.292.0.dist-info}/zip-safe +0 -0
orionis/metadata/framework.py
CHANGED
orionis/test/view/index.html
CHANGED
@@ -8,8 +8,163 @@
|
|
8
8
|
<script src="https://cdn.tailwindcss.com"></script>
|
9
9
|
<link rel="icon" href="https://orionis-framework.com/svg/logo.svg" />
|
10
10
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css">
|
11
|
+
<link href="https://unpkg.com/gridjs/dist/theme/mermaid.min.css" rel="stylesheet" />
|
12
|
+
<link href="https://fonts.googleapis.com/css2?family=Fira+Mono:wght@400;500;700&display=swap" rel="stylesheet">
|
11
13
|
</head>
|
12
14
|
|
15
|
+
<style>
|
16
|
+
/* Use a monospaced font for the table */
|
17
|
+
#test-table,
|
18
|
+
#test-table .gridjs-td,
|
19
|
+
#test-table .gridjs-th {
|
20
|
+
font-family: 'Fira Mono', 'Consolas', 'Menlo', 'Monaco', 'Liberation Mono', monospace !important;
|
21
|
+
}
|
22
|
+
|
23
|
+
#test-table .gridjs-td,
|
24
|
+
#test-table .gridjs-th {
|
25
|
+
max-width: 220px;
|
26
|
+
white-space: normal;
|
27
|
+
overflow-wrap: anywhere;
|
28
|
+
text-overflow: initial;
|
29
|
+
vertical-align: middle;
|
30
|
+
font-size: 0.85rem; /* más pequeño */
|
31
|
+
line-height: 1.28;
|
32
|
+
}
|
33
|
+
|
34
|
+
#test-table .gridjs-th {
|
35
|
+
font-size: 0.82rem !important; /* aún más pequeño para los títulos */
|
36
|
+
font-weight: 600;
|
37
|
+
letter-spacing: 0.01em;
|
38
|
+
}
|
39
|
+
|
40
|
+
#test-table .gridjs-td.status-cell {
|
41
|
+
max-width: 90px;
|
42
|
+
text-align: center;
|
43
|
+
font-weight: 600;
|
44
|
+
letter-spacing: 0.02em;
|
45
|
+
white-space: nowrap;
|
46
|
+
font-size: 0.75em;
|
47
|
+
padding-top: 0.2em;
|
48
|
+
padding-bottom: 0.2em;
|
49
|
+
}
|
50
|
+
|
51
|
+
#test-table .gridjs-td.doc-cell {
|
52
|
+
max-width: 60px;
|
53
|
+
text-align: center;
|
54
|
+
white-space: nowrap;
|
55
|
+
}
|
56
|
+
|
57
|
+
#test-table {
|
58
|
+
overflow-x: auto;
|
59
|
+
}
|
60
|
+
|
61
|
+
.badge-status {
|
62
|
+
display: inline-flex;
|
63
|
+
align-items: center;
|
64
|
+
gap: 0.3em;
|
65
|
+
padding: 0.13em 0.6em;
|
66
|
+
border-radius: 9999px;
|
67
|
+
font-size: 0.78em;
|
68
|
+
font-weight: 600;
|
69
|
+
letter-spacing: 0.01em;
|
70
|
+
}
|
71
|
+
|
72
|
+
.badge-passed {
|
73
|
+
background: #d1fae5;
|
74
|
+
color: #059669;
|
75
|
+
}
|
76
|
+
|
77
|
+
.badge-failed {
|
78
|
+
background: #fee2e2;
|
79
|
+
color: #dc2626;
|
80
|
+
}
|
81
|
+
|
82
|
+
.badge-errors {
|
83
|
+
background: #fef9c3;
|
84
|
+
color: #ca8a04;
|
85
|
+
}
|
86
|
+
|
87
|
+
.badge-skipped {
|
88
|
+
background: #e0e7ff;
|
89
|
+
color: #3730a3;
|
90
|
+
}
|
91
|
+
|
92
|
+
.doc-btn {
|
93
|
+
background: #eef2ff;
|
94
|
+
color: #3730a3;
|
95
|
+
border: none;
|
96
|
+
border-radius: 0.5em;
|
97
|
+
padding: 0.2em 0.8em;
|
98
|
+
font-size: 0.92em;
|
99
|
+
font-weight: 500;
|
100
|
+
cursor: pointer;
|
101
|
+
transition: background 0.15s;
|
102
|
+
font-family: inherit;
|
103
|
+
}
|
104
|
+
|
105
|
+
.doc-btn:hover {
|
106
|
+
background: #c7d2fe;
|
107
|
+
}
|
108
|
+
|
109
|
+
/* Modal styles */
|
110
|
+
.orionis-modal {
|
111
|
+
position: fixed;
|
112
|
+
left: 0;
|
113
|
+
top: 0;
|
114
|
+
width: 100vw;
|
115
|
+
height: 100vh;
|
116
|
+
background: rgba(30, 41, 59, 0.45);
|
117
|
+
display: flex !important;
|
118
|
+
align-items: center;
|
119
|
+
justify-content: center;
|
120
|
+
z-index: 10000;
|
121
|
+
}
|
122
|
+
|
123
|
+
.orionis-modal-content {
|
124
|
+
background: white;
|
125
|
+
max-width: 70vw;
|
126
|
+
width: 70vw;
|
127
|
+
padding: 2em 1.5em 1.2em 1.5em;
|
128
|
+
border-radius: 1.2em;
|
129
|
+
box-shadow: 0 8px 32px 0 rgba(31, 41, 55, 0.18);
|
130
|
+
position: relative;
|
131
|
+
}
|
132
|
+
|
133
|
+
.orionis-modal-close {
|
134
|
+
position: absolute;
|
135
|
+
top: 0.7em;
|
136
|
+
right: 1em;
|
137
|
+
font-size: 1.3em;
|
138
|
+
color: #64748b;
|
139
|
+
background: none;
|
140
|
+
border: none;
|
141
|
+
cursor: pointer;
|
142
|
+
}
|
143
|
+
|
144
|
+
.orionis-modal-title {
|
145
|
+
font-size: 0.98em; /* reducido de 1.08em */
|
146
|
+
font-weight: 600;
|
147
|
+
margin-bottom: 0.7em;
|
148
|
+
color: #3730a3;
|
149
|
+
display: flex;
|
150
|
+
align-items: center;
|
151
|
+
gap: 0.5em;
|
152
|
+
font-family: inherit;
|
153
|
+
}
|
154
|
+
|
155
|
+
.orionis-modal-pre {
|
156
|
+
white-space: pre-wrap;
|
157
|
+
font-size: 0.92em;
|
158
|
+
color: #334155;
|
159
|
+
background: #f1f5f9;
|
160
|
+
padding: 1em;
|
161
|
+
border-radius: 0.7em;
|
162
|
+
max-height: 320px;
|
163
|
+
overflow: auto;
|
164
|
+
font-family: 'Fira Mono', 'Consolas', 'Menlo', 'Monaco', 'Liberation Mono', monospace;
|
165
|
+
}
|
166
|
+
</style>
|
167
|
+
|
13
168
|
<body class="bg-gray-100 text-gray-800 font-sans">
|
14
169
|
<div class="max-w-7xl mx-auto px-4 sm:px-6 py-8">
|
15
170
|
|
@@ -29,13 +184,12 @@
|
|
29
184
|
<div class="bg-white rounded-2xl shadow-lg p-6 border-t-4 border-indigo-500 flex flex-col sm:flex-row items-center justify-between gap-4">
|
30
185
|
<div>
|
31
186
|
<div class="text-xs font-semibold text-gray-500 uppercase">Resumen de Ejecución</div>
|
32
|
-
<div class="text-lg font-bold text-gray-800 mt-2" id="execution-summary-title">
|
33
|
-
<div class="text-sm text-gray-600 mt-1" id="execution-summary-desc">
|
187
|
+
<div class="text-lg font-bold text-gray-800 mt-2" id="execution-summary-title">Select an execution</div>
|
188
|
+
<div class="text-sm text-gray-600 mt-1" id="execution-summary-desc">Select an execution to view the summary.</div>
|
34
189
|
</div>
|
35
190
|
<div class="flex items-center gap-4">
|
36
191
|
<div class="flex items-center gap-1 text-gray-700">
|
37
|
-
<
|
38
|
-
<span id="execution-time">Duración: 00:00:00</span>
|
192
|
+
<span id="execution-time">Duration: --:--:--</span>
|
39
193
|
</div>
|
40
194
|
</div>
|
41
195
|
</div>
|
@@ -73,39 +227,32 @@
|
|
73
227
|
<div class="flex flex-wrap justify-between items-center mb-10 gap-4">
|
74
228
|
<!-- Buttons to the left -->
|
75
229
|
<div class="flex flex-wrap gap-4">
|
76
|
-
<button id="download-json"
|
77
|
-
class="flex items-center gap-2 bg-blue-600 hover:bg-blue-700 text-white px-4 py-2 rounded shadow">
|
230
|
+
<button disabled id="download-json" class="flex items-center gap-2 bg-blue-300 text-white px-4 py-2 rounded shadow cursor-not-allowed opacity-60">
|
78
231
|
<i class="bi bi-file-earmark-code-fill text-lg"></i>
|
79
232
|
<span>Download JSON</span>
|
80
233
|
</button>
|
81
|
-
<button id="download-excel"
|
82
|
-
class="flex items-center gap-2 bg-green-600 hover:bg-green-700 text-white px-4 py-2 rounded shadow">
|
83
|
-
<i class="bi bi-file-earmark-excel-fill text-lg"></i>
|
84
|
-
<span>Download Excel</span>
|
85
|
-
</button>
|
86
|
-
<button id="download-pdf"
|
87
|
-
class="flex items-center gap-2 bg-red-600 hover:bg-red-700 text-white px-4 py-2 rounded shadow">
|
88
|
-
<i class="bi bi-file-earmark-pdf-fill text-lg"></i>
|
89
|
-
<span>Download PDF</span>
|
90
|
-
</button>
|
91
234
|
</div>
|
92
235
|
<!-- Elegant Select to the right -->
|
93
236
|
<div>
|
94
|
-
<select
|
95
|
-
class="appearance-none bg-white border border-gray-300 text-gray-700 py-2 px-4 pr-10 rounded-lg shadow focus:outline-none focus:ring-2 focus:ring-blue-400 focus:border-blue-400 transition text-base font-medium">
|
96
|
-
<option selected disabled>Selecciona una opción</option>
|
97
|
-
<option>Opción 1</option>
|
98
|
-
<option>Opción 2</option>
|
99
|
-
<option>Opción 3</option>
|
237
|
+
<select class="appearance-none bg-white border border-gray-300 text-gray-700 py-2 px-4 pr-10 rounded-lg shadow focus:outline-none focus:ring-2 focus:ring-blue-400 focus:border-blue-400 transition text-base font-medium" id="test-select">
|
100
238
|
</select>
|
101
239
|
</div>
|
102
240
|
</div>
|
103
241
|
|
104
|
-
<!--
|
105
|
-
<div class="bg-white rounded-
|
106
|
-
<
|
107
|
-
|
108
|
-
class="
|
242
|
+
<!-- Table Summary View with Grid.js -->
|
243
|
+
<div class="bg-white rounded-xl shadow-md p-5 border border-indigo-100">
|
244
|
+
<div class="flex items-center gap-2 mb-3">
|
245
|
+
<i class="bi bi-table text-lg text-indigo-500"></i>
|
246
|
+
<h2 class="text-lg font-semibold text-indigo-900">Execution Details</h2>
|
247
|
+
</div>
|
248
|
+
<div class="text-gray-500 mb-4 text-sm">
|
249
|
+
See all test cases for the selected execution.<br>Click
|
250
|
+
<span class="inline-flex items-center gap-1 px-1.5 py-0.5 bg-blue-50 text-blue-700 rounded text-xs font-mono">
|
251
|
+
<i class="bi bi-journal-text"></i> View
|
252
|
+
</span>
|
253
|
+
to show the docstring.
|
254
|
+
</div>
|
255
|
+
<div id="test-table"></div>
|
109
256
|
</div>
|
110
257
|
|
111
258
|
<!-- Footer -->
|
@@ -118,9 +265,268 @@
|
|
118
265
|
<i class="bi bi-stars text-yellow-400 align-middle ml-1"></i>
|
119
266
|
</footer>
|
120
267
|
|
268
|
+
<script src="https://unpkg.com/gridjs/dist/gridjs.umd.js"></script>
|
121
269
|
<script>
|
122
|
-
|
123
|
-
|
270
|
+
|
271
|
+
const data = $data;
|
272
|
+
|
273
|
+
// Live Clock (Header Timestamp)
|
274
|
+
function updateClock() {
|
275
|
+
const now = new Date();
|
276
|
+
const formatted = now.toLocaleString('en-US', {
|
277
|
+
year: 'numeric',
|
278
|
+
month: '2-digit',
|
279
|
+
day: '2-digit',
|
280
|
+
hour: '2-digit',
|
281
|
+
minute: '2-digit',
|
282
|
+
second: '2-digit',
|
283
|
+
hour12: false
|
284
|
+
});
|
285
|
+
document.getElementById("timestamp").textContent = `Current time: ${formatted}`;
|
286
|
+
}
|
287
|
+
updateClock();
|
288
|
+
setInterval(updateClock, 1000);
|
289
|
+
|
290
|
+
// Populate Dropdown in English
|
291
|
+
let html = '<option selected disabled>Select an execution</option>';
|
292
|
+
data.forEach((item, i) => {
|
293
|
+
const date = new Date(item.timestamp);
|
294
|
+
const formattedDate = `${date.getFullYear()}-${(date.getMonth() + 1)
|
295
|
+
.toString()
|
296
|
+
.padStart(2, '0')}-${date.getDate()
|
297
|
+
.toString()
|
298
|
+
.padStart(2, '0')} ${date.getHours()
|
299
|
+
.toString()
|
300
|
+
.padStart(2, '0')}:${date.getMinutes()
|
301
|
+
.toString()
|
302
|
+
.padStart(2, '0')}:${date.getSeconds()
|
303
|
+
.toString()
|
304
|
+
.padStart(2, '0')}`;
|
305
|
+
html += `<option value="${i}">Execution ${i + 1} - ${formattedDate}</option>`;
|
306
|
+
});
|
307
|
+
document.getElementById("test-select").innerHTML = html;
|
308
|
+
|
309
|
+
// Event Listener for the dropdown
|
310
|
+
document.getElementById("test-select").addEventListener("change", function () {
|
311
|
+
const selectedIndex = this.value;
|
312
|
+
const selectedData = data[selectedIndex];
|
313
|
+
|
314
|
+
// Animate Counters
|
315
|
+
function animateValue(id, start, end, duration) {
|
316
|
+
const obj = document.getElementById(id);
|
317
|
+
let startTimestamp = null;
|
318
|
+
const step = (timestamp) => {
|
319
|
+
if (!startTimestamp) startTimestamp = timestamp;
|
320
|
+
const progress = Math.min((timestamp - startTimestamp) / duration, 1);
|
321
|
+
obj.textContent = Math.floor(progress * (end - start) + start);
|
322
|
+
if (progress < 1) {
|
323
|
+
window.requestAnimationFrame(step);
|
324
|
+
} else {
|
325
|
+
obj.textContent = end;
|
326
|
+
}
|
327
|
+
};
|
328
|
+
window.requestAnimationFrame(step);
|
329
|
+
}
|
330
|
+
animateValue("passed", Number(document.getElementById("passed").textContent), selectedData.passed, 500);
|
331
|
+
animateValue("failed", Number(document.getElementById("failed").textContent), selectedData.failed, 500);
|
332
|
+
animateValue("errors", Number(document.getElementById("errors").textContent), selectedData.errors, 500);
|
333
|
+
animateValue("skipped", Number(document.getElementById("skipped").textContent), selectedData.skipped, 500);
|
334
|
+
|
335
|
+
// Animate Progress Bar
|
336
|
+
const passedBar = document.getElementById("passed-progress");
|
337
|
+
passedBar.style.transition = "width 0.6s cubic-bezier(0.4,0,0.2,1)";
|
338
|
+
const passedPercentage = (selectedData.passed / selectedData.total_tests) * 100;
|
339
|
+
passedBar.style.width = `${passedPercentage}%`;
|
340
|
+
|
341
|
+
// Update Execution Summary
|
342
|
+
const date = new Date(selectedData.timestamp);
|
343
|
+
const formattedDate = `${date.getFullYear()}-${(date.getMonth()+1).toString().padStart(2, '0')}-${date.getDate().toString().padStart(2, '0')} ${date.getHours().toString().padStart(2, '0')}:${date.getMinutes().toString().padStart(2, '0')}:${date.getSeconds().toString().padStart(2, '0')}`;
|
344
|
+
document.getElementById("execution-summary-title").innerHTML = `<span class="inline-flex items-center gap-2"><i class="bi bi-activity text-indigo-500"></i> Execution - <span class="font-mono">${formattedDate}</span></span>`;
|
345
|
+
document.getElementById("execution-summary-desc").innerHTML =
|
346
|
+
`<span class="inline-flex gap-2 flex-wrap">
|
347
|
+
<span class="bg-green-100 text-green-800 px-2 py-1 rounded text-xs font-semibold"><i class="bi bi-check-circle-fill"></i> Passed: ${selectedData.passed}</span>
|
348
|
+
<span class="bg-red-100 text-red-800 px-2 py-1 rounded text-xs font-semibold"><i class="bi bi-x-circle-fill"></i> Failed: ${selectedData.failed}</span>
|
349
|
+
<span class="bg-yellow-100 text-yellow-800 px-2 py-1 rounded text-xs font-semibold"><i class="bi bi-exclamation-triangle-fill"></i> Errors: ${selectedData.errors}</span>
|
350
|
+
<span class="bg-blue-100 text-blue-800 px-2 py-1 rounded text-xs font-semibold"><i class="bi bi-skip-forward-fill"></i> Skipped: ${selectedData.skipped}</span>
|
351
|
+
<span class="bg-gray-100 text-gray-800 px-2 py-1 rounded text-xs font-semibold"><i class="bi bi-list-ol"></i> Total: ${selectedData.total_tests}</span>
|
352
|
+
<span class="bg-indigo-100 text-indigo-800 px-2 py-1 rounded text-xs font-semibold"><i class="bi bi-bar-chart-fill"></i> Success: ${selectedData.success_rate.toFixed(2)}%</span>
|
353
|
+
</span>`;
|
354
|
+
|
355
|
+
// Update Duration
|
356
|
+
function formatTime(seconds) {
|
357
|
+
const h = Math.floor(seconds / 3600).toString().padStart(2, '0');
|
358
|
+
const m = Math.floor((seconds % 3600) / 60).toString().padStart(2, '0');
|
359
|
+
const s = Math.floor(seconds % 60).toString().padStart(2, '0');
|
360
|
+
return `${h}:${m}:${s}`;
|
361
|
+
}
|
362
|
+
document.getElementById("execution-time").innerHTML = `<i class="bi bi-clock-history text-indigo-500"></i> Duration: <span class="font-mono">${formatTime(selectedData.total_time)}</span>`;
|
363
|
+
|
364
|
+
// Enable Download Button
|
365
|
+
document.getElementById("download-json").disabled = false;
|
366
|
+
document.getElementById("download-json").classList.remove("bg-blue-300", "cursor-not-allowed", "opacity-60");
|
367
|
+
document.getElementById("download-json").classList.add("bg-blue-600", "hover:bg-blue-700", "cursor-pointer", "opacity-100");
|
368
|
+
});
|
369
|
+
|
370
|
+
// Download JSON report with execution date and time in filename
|
371
|
+
document.getElementById("download-json").addEventListener("click", function () {
|
372
|
+
const select = document.getElementById("test-select");
|
373
|
+
const selectedIndex = select.value;
|
374
|
+
if (selectedIndex === "" || selectedIndex === null || isNaN(selectedIndex)) return;
|
375
|
+
const selectedData = data[selectedIndex];
|
376
|
+
const jsonString = JSON.stringify(selectedData, null, 2);
|
377
|
+
const date = new Date(selectedData.timestamp);
|
378
|
+
// Format: YYYYMMDD_HHMMSS
|
379
|
+
const formattedDate = `${date.getFullYear()}${(date.getMonth()+1).toString().padStart(2,'0')}${date.getDate().toString().padStart(2,'0')}_${date.getHours().toString().padStart(2,'0')}${date.getMinutes().toString().padStart(2,'0')}${date.getSeconds().toString().padStart(2,'0')}`;
|
380
|
+
const filename = `test_report_${formattedDate}.json`;
|
381
|
+
const blob = new Blob([jsonString], { type: "application/json" });
|
382
|
+
const url = URL.createObjectURL(blob);
|
383
|
+
const a = document.createElement("a");
|
384
|
+
a.href = url;
|
385
|
+
a.download = filename;
|
386
|
+
document.body.appendChild(a);
|
387
|
+
a.click();
|
388
|
+
document.body.removeChild(a);
|
389
|
+
URL.revokeObjectURL(url);
|
390
|
+
});
|
391
|
+
|
392
|
+
// Show doc string in a modal dialog (event delegation)
|
393
|
+
function showDocString(doc) {
|
394
|
+
// Remove any existing modal
|
395
|
+
const oldModal = document.querySelector('.orionis-modal');
|
396
|
+
if (oldModal) oldModal.remove();
|
397
|
+
|
398
|
+
// Create modal element
|
399
|
+
const modal = document.createElement('div');
|
400
|
+
modal.className = 'orionis-modal';
|
401
|
+
modal.style.display = 'flex'; // Ensure modal is visible
|
402
|
+
|
403
|
+
modal.innerHTML = `
|
404
|
+
<div class="orionis-modal-content">
|
405
|
+
<button class="orionis-modal-close" aria-label="Cerrar" type="button">×</button>
|
406
|
+
<div class="orionis-modal-title">
|
407
|
+
<i class="bi bi-journal-text"></i> Docstring
|
408
|
+
</div>
|
409
|
+
<pre class="orionis-modal-pre">${doc ? String(doc).replace(/</g, "<").replace(/>/g, ">") : 'No docstring.'}</pre>
|
410
|
+
</div>
|
411
|
+
`;
|
412
|
+
// Close modal when clicking outside content
|
413
|
+
modal.addEventListener('mousedown', function (e) {
|
414
|
+
if (e.target === modal) modal.remove();
|
415
|
+
});
|
416
|
+
// Close modal when clicking close button
|
417
|
+
modal.querySelector('.orionis-modal-close').onclick = () => modal.remove();
|
418
|
+
document.body.appendChild(modal);
|
419
|
+
}
|
420
|
+
|
421
|
+
function renderTestTable(testDetails) {
|
422
|
+
if (window.testGrid) {
|
423
|
+
try { window.testGrid.destroy(); } catch (e) { }
|
424
|
+
}
|
425
|
+
const tableDiv = document.getElementById("test-table");
|
426
|
+
tableDiv.innerHTML = "";
|
427
|
+
|
428
|
+
try {
|
429
|
+
window.testGrid = new gridjs.Grid({
|
430
|
+
columns: [
|
431
|
+
{ name: "ID", width: "22%" },
|
432
|
+
{ name: "Class", width: "12%" },
|
433
|
+
{ name: "Method", width: "14%" },
|
434
|
+
{ name: "Status", width: "11%" },
|
435
|
+
{ name: "Time (s)", width: "9%" },
|
436
|
+
{ name: "File", width: "22%" },
|
437
|
+
{ name: "Doc", width: "10%" }
|
438
|
+
],
|
439
|
+
data: testDetails.map((t, idx) => [
|
440
|
+
gridjs.html(`<div title="${t.id}">${t.id}</div>`),
|
441
|
+
gridjs.html(`<div title="${t.class}">${t.class}</div>`),
|
442
|
+
gridjs.html(`<div title="${t.method}">${t.method}</div>`),
|
443
|
+
gridjs.html(`
|
444
|
+
<span class="badge-status ${
|
445
|
+
t.status === 'PASSED' ? 'badge-passed' :
|
446
|
+
t.status === 'FAILED' ? 'badge-failed' :
|
447
|
+
t.status === 'ERRORS' ? 'badge-errors' : 'badge-skipped'
|
448
|
+
} status-cell">
|
449
|
+
${
|
450
|
+
t.status === 'PASSED' ? '<i class="bi bi-check-circle-fill"></i>' :
|
451
|
+
t.status === 'FAILED' ? '<i class="bi bi-x-circle-fill"></i>' :
|
452
|
+
t.status === 'ERRORS' ? '<i class="bi bi-exclamation-triangle-fill"></i>' :
|
453
|
+
'<i class="bi bi-skip-forward-fill"></i>'
|
454
|
+
}
|
455
|
+
${t.status}
|
456
|
+
</span>
|
457
|
+
`),
|
458
|
+
t.execution_time,
|
459
|
+
gridjs.html(`<div title="${t.file_path}">${t.file_path}</div>`),
|
460
|
+
gridjs.html(`<button class="doc-btn doc-cell" data-doc-idx="${idx}" type="button"><i class="bi bi-journal-text"></i> Ver</button>`)
|
461
|
+
]),
|
462
|
+
search: {
|
463
|
+
enabled: true,
|
464
|
+
placeholder: 'Buscar solo por clase...'
|
465
|
+
},
|
466
|
+
pagination: { limit: 8, summary: false },
|
467
|
+
sort: false,
|
468
|
+
resizable: true,
|
469
|
+
style: {
|
470
|
+
th: { 'text-align': 'left', 'background': '#f1f5f9', 'font-size': '1em' }
|
471
|
+
}
|
472
|
+
}).render(tableDiv);
|
473
|
+
|
474
|
+
// Delegated event for doc buttons (always works, even after pagination)
|
475
|
+
tableDiv.addEventListener('click', function (e) {
|
476
|
+
const btn = e.target.closest('.doc-btn');
|
477
|
+
if (!btn) return;
|
478
|
+
const idx = Number(btn.getAttribute('data-doc-idx'));
|
479
|
+
const t = testDetails[idx];
|
480
|
+
if (!t) return;
|
481
|
+
|
482
|
+
let html = '';
|
483
|
+
html += `<div class="orionis-modal-title"><i class="bi bi-journal-text"></i> Docstring</div>`;
|
484
|
+
html += `<pre class="orionis-modal-pre">${t.doc_string ? String(t.doc_string).replace(/</g, "<").replace(/>/g, ">") : 'No docstring.'}</pre>`;
|
485
|
+
if (t.status === 'FAILED' || t.status === 'ERRORS') {
|
486
|
+
html += `<div class="orionis-modal-title mt-4"><i class="bi bi-bug-fill"></i> Traceback</div>`;
|
487
|
+
html += `<pre class="orionis-modal-pre" style="background:#fee2e2;color:#991b1b">${t.traceback ? String(t.traceback).replace(/</g, "<").replace(/>/g, ">") : 'No traceback.'}</pre>`;
|
488
|
+
}
|
489
|
+
|
490
|
+
// Remove any existing modal
|
491
|
+
const oldModal = document.querySelector('.orionis-modal');
|
492
|
+
if (oldModal) oldModal.remove();
|
493
|
+
|
494
|
+
// Create modal element
|
495
|
+
const modal = document.createElement('div');
|
496
|
+
modal.className = 'orionis-modal';
|
497
|
+
modal.style.display = 'flex';
|
498
|
+
|
499
|
+
modal.innerHTML = `
|
500
|
+
<div class="orionis-modal-content">
|
501
|
+
<button class="orionis-modal-close" aria-label="Cerrar" type="button">×</button>
|
502
|
+
${html}
|
503
|
+
</div>
|
504
|
+
`;
|
505
|
+
|
506
|
+
// Close modal when clicking outside content
|
507
|
+
modal.addEventListener('mousedown', function (e) {
|
508
|
+
if (e.target === modal) modal.remove();
|
509
|
+
});
|
510
|
+
|
511
|
+
// Close modal when clicking close button
|
512
|
+
modal.querySelector('.orionis-modal-close').onclick = () => modal.remove();
|
513
|
+
document.body.appendChild(modal);
|
514
|
+
});
|
515
|
+
} catch (err) {
|
516
|
+
tableDiv.innerHTML = `<div class="text-red-600 font-mono text-sm py-4">Ocurrió un error al mostrar la tabla.<br>${err.message}</div>`;
|
517
|
+
}
|
518
|
+
}
|
519
|
+
|
520
|
+
document.getElementById("test-select").addEventListener("change", function () {
|
521
|
+
const selectedIndex = this.value;
|
522
|
+
if (!data[selectedIndex]) return;
|
523
|
+
renderTestTable(data[selectedIndex].test_details);
|
524
|
+
});
|
525
|
+
|
526
|
+
document.addEventListener("DOMContentLoaded", function () {
|
527
|
+
renderTestTable([]);
|
528
|
+
});
|
529
|
+
|
124
530
|
</script>
|
125
531
|
</body>
|
126
532
|
|
@@ -226,7 +226,7 @@ orionis/foundation/config/testing/entities/testing.py,sha256=m_i9jZlOXs_AzNKNNf0
|
|
226
226
|
orionis/foundation/config/testing/enums/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
227
227
|
orionis/foundation/config/testing/enums/test_mode.py,sha256=IbFpauu7J-iSAfmC8jDbmTEYl8eZr-AexL-lyOh8_74,337
|
228
228
|
orionis/metadata/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
229
|
-
orionis/metadata/framework.py,sha256=
|
229
|
+
orionis/metadata/framework.py,sha256=7Ko8j0LyRbf2F4ayJKqLau4RUwwdelswaW4ISf8MnFQ,4960
|
230
230
|
orionis/metadata/package.py,sha256=tqLfBRo-w1j_GN4xvzUNFyweWYFS-qhSgAEc-AmCH1M,5452
|
231
231
|
orionis/patterns/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
232
232
|
orionis/patterns/singleton/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -350,11 +350,11 @@ orionis/test/suites/contracts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5N
|
|
350
350
|
orionis/test/suites/contracts/test_suite.py,sha256=eluzYwkNBbKjxYStj_tHN_Fm3YDPpGQdqMu5eiluh-E,1059
|
351
351
|
orionis/test/suites/contracts/test_unit.py,sha256=l1LQllODyvcSByXMl1lGrUkoLsXbBHZZLWZI4A-mlQg,5881
|
352
352
|
orionis/test/view/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
353
|
-
orionis/test/view/index.html,sha256=
|
354
|
-
orionis-0.
|
353
|
+
orionis/test/view/index.html,sha256=1qamNWmUjyOKcMnNiVfjvYMT_CHsmz7WDhBzp0dQkV8,25731
|
354
|
+
orionis-0.292.0.dist-info/licenses/LICENCE,sha256=-_4cF2EBKuYVS_SQpy1uapq0oJPUU1vl_RUWSy2jJTo,1111
|
355
355
|
tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
356
356
|
tests/example/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
357
|
-
tests/example/test_example.py,sha256=
|
357
|
+
tests/example/test_example.py,sha256=pGj3mn6HslmqVNEc_2cbMwbIEcCjT08fLsZ47sz5bvk,601
|
358
358
|
tests/foundation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
359
359
|
tests/foundation/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
360
360
|
tests/foundation/config/app/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -455,8 +455,8 @@ tests/support/inspection/fakes/fake_reflection_instance_with_abstract.py,sha256=
|
|
455
455
|
tests/testing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
456
456
|
tests/testing/test_testing_result.py,sha256=MrGK3ZimedL0b5Ydu69Dg8Iul017AzLTm7VPxpXlpfU,4315
|
457
457
|
tests/testing/test_testing_unit.py,sha256=A6QkiOkP7GPC1Szh_GqsrV7GxjWjK8cIwFez6YfrzmM,7683
|
458
|
-
orionis-0.
|
459
|
-
orionis-0.
|
460
|
-
orionis-0.
|
461
|
-
orionis-0.
|
462
|
-
orionis-0.
|
458
|
+
orionis-0.292.0.dist-info/METADATA,sha256=4zAZQi8NiTjCdg0efqEfXRXRP_RTRfnScor13qqt_jY,4772
|
459
|
+
orionis-0.292.0.dist-info/WHEEL,sha256=Nw36Djuh_5VDukK0H78QzOX-_FQEo6V37m3nkm96gtU,91
|
460
|
+
orionis-0.292.0.dist-info/top_level.txt,sha256=2bdoHgyGZhOtLAXS6Om8OCTmL24dUMC_L1quMe_ETbk,14
|
461
|
+
orionis-0.292.0.dist-info/zip-safe,sha256=frcCV1k9oG9oKj3dpUqdJg1PxRT2RSN_XKdLCPjaYaY,2
|
462
|
+
orionis-0.292.0.dist-info/RECORD,,
|
tests/example/test_example.py
CHANGED
File without changes
|
File without changes
|
File without changes
|
File without changes
|