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.
@@ -5,7 +5,7 @@
5
5
  NAME = "orionis"
6
6
 
7
7
  # Current version of the framework
8
- VERSION = "0.291.0"
8
+ VERSION = "0.292.0"
9
9
 
10
10
  # Full name of the author or maintainer of the project
11
11
  AUTHOR = "Raul Mauricio Uñate Castro"
@@ -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">Ejecución Completa</div>
33
- <div class="text-sm text-gray-600 mt-1" id="execution-summary-desc">Todos los tests han sido ejecutados correctamente.</div>
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
- <i class="bi bi-clock-history text-xl text-indigo-500"></i>
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
- <!-- JSON Viewer Panel -->
105
- <div class="bg-white rounded-2xl shadow-xl p-6">
106
- <h2 class="text-xl font-semibold mb-4">Test Report JSON</h2>
107
- <pre id="json-data"
108
- class="whitespace-pre-wrap text-sm text-gray-800 bg-gray-100 p-4 rounded-xl overflow-x-auto"></pre>
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
- // Placeholder JS logic
123
- document.getElementById("timestamp").textContent = new Date().toLocaleString();
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">&times;</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, "&lt;").replace(/>/g, "&gt;") : '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, "&lt;").replace(/>/g, "&gt;") : '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, "&lt;").replace(/>/g, "&gt;") : '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">&times;</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
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: orionis
3
- Version: 0.291.0
3
+ Version: 0.292.0
4
4
  Summary: Orionis Framework – Elegant, Fast, and Powerful.
5
5
  Home-page: https://github.com/orionis-framework/framework
6
6
  Author: Raul Mauricio Uñate Castro
@@ -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=gFGa1P4sgpUA5AUIlQeePV9NZLz4zPtOpg5N1Z_7yI8,4960
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=U4XYO4hA-mAJCK1gcVRgIysmISK3g3Vgi2ntLofFAhE,6592
354
- orionis-0.291.0.dist-info/licenses/LICENCE,sha256=-_4cF2EBKuYVS_SQpy1uapq0oJPUU1vl_RUWSy2jJTo,1111
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=byd_lI6tVDgGPEIrr7PLZbBu0UoZOymmdmyA_4u-QUw,601
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.291.0.dist-info/METADATA,sha256=dKe4TtuURAwVqliKd4odPuHJFE2TplRgxVek6i-jd9A,4772
459
- orionis-0.291.0.dist-info/WHEEL,sha256=Nw36Djuh_5VDukK0H78QzOX-_FQEo6V37m3nkm96gtU,91
460
- orionis-0.291.0.dist-info/top_level.txt,sha256=2bdoHgyGZhOtLAXS6Om8OCTmL24dUMC_L1quMe_ETbk,14
461
- orionis-0.291.0.dist-info/zip-safe,sha256=frcCV1k9oG9oKj3dpUqdJg1PxRT2RSN_XKdLCPjaYaY,2
462
- orionis-0.291.0.dist-info/RECORD,,
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,,
@@ -17,7 +17,7 @@ class TestExample(TestCase):
17
17
  Ensures that the integer 2 is equal to itself.
18
18
  """
19
19
  # Check if 1 equals 1
20
- self.assertEqual(1, 1)
20
+ self.assertEqual(1, 2)
21
21
 
22
22
  # Check if 2 equals 2
23
23
  self.assertEqual(2, 2)