qapytest 0.3.4__tar.gz → 0.3.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.
Files changed (52) hide show
  1. {qapytest-0.3.4 → qapytest-0.3.6}/CHANGELOG.md +18 -0
  2. {qapytest-0.3.4 → qapytest-0.3.6}/PKG-INFO +1 -1
  3. {qapytest-0.3.4 → qapytest-0.3.6}/pyproject.toml +1 -1
  4. {qapytest-0.3.4 → qapytest-0.3.6}/qapytest/_assets/scripts.js +31 -20
  5. {qapytest-0.3.4 → qapytest-0.3.6}/qapytest/_assets/styles.css +7 -2
  6. {qapytest-0.3.4 → qapytest-0.3.6}/uv.lock +1 -1
  7. {qapytest-0.3.4 → qapytest-0.3.6}/.gitignore +0 -0
  8. {qapytest-0.3.4 → qapytest-0.3.6}/.pre-commit-config.yaml +0 -0
  9. {qapytest-0.3.4 → qapytest-0.3.6}/LICENSE +0 -0
  10. {qapytest-0.3.4 → qapytest-0.3.6}/NOTICE +0 -0
  11. {qapytest-0.3.4 → qapytest-0.3.6}/README.md +0 -0
  12. {qapytest-0.3.4 → qapytest-0.3.6}/THIRD_PARTY_NOTICES.txt +0 -0
  13. {qapytest-0.3.4 → qapytest-0.3.6}/demo.py +0 -0
  14. {qapytest-0.3.4 → qapytest-0.3.6}/docs/API.md +0 -0
  15. {qapytest-0.3.4 → qapytest-0.3.6}/docs/CLI.md +0 -0
  16. {qapytest-0.3.4 → qapytest-0.3.6}/licenses/faker.LICENSE +0 -0
  17. {qapytest-0.3.4 → qapytest-0.3.6}/licenses/httpx.LICENSE +0 -0
  18. {qapytest-0.3.4 → qapytest-0.3.6}/licenses/jinja2.LICENSE +0 -0
  19. {qapytest-0.3.4 → qapytest-0.3.6}/licenses/jsonschema.LICENSE +0 -0
  20. {qapytest-0.3.4 → qapytest-0.3.6}/licenses/playwright-python.LICENSE +0 -0
  21. {qapytest-0.3.4 → qapytest-0.3.6}/licenses/pytest-playwright.LICENSE +0 -0
  22. {qapytest-0.3.4 → qapytest-0.3.6}/licenses/pytest.LICENSE +0 -0
  23. {qapytest-0.3.4 → qapytest-0.3.6}/licenses/python_dotenv.LICENSE +0 -0
  24. {qapytest-0.3.4 → qapytest-0.3.6}/licenses/redis-py.LICENSE +0 -0
  25. {qapytest-0.3.4 → qapytest-0.3.6}/licenses/sqlalchemy.LICENSE +0 -0
  26. {qapytest-0.3.4 → qapytest-0.3.6}/qapytest/__init__.py +0 -0
  27. {qapytest-0.3.4 → qapytest-0.3.6}/qapytest/_assets/_log_tree.html.jinja2 +0 -0
  28. {qapytest-0.3.4 → qapytest-0.3.6}/qapytest/_assets/report.html.jinja2 +0 -0
  29. {qapytest-0.3.4 → qapytest-0.3.6}/qapytest/_attach.py +0 -0
  30. {qapytest-0.3.4 → qapytest-0.3.6}/qapytest/_client_http.py +0 -0
  31. {qapytest-0.3.4 → qapytest-0.3.6}/qapytest/_config.py +0 -0
  32. {qapytest-0.3.4 → qapytest-0.3.6}/qapytest/_config_http.py +0 -0
  33. {qapytest-0.3.4 → qapytest-0.3.6}/qapytest/_internal.py +0 -0
  34. {qapytest-0.3.4 → qapytest-0.3.6}/qapytest/_json_validation.py +0 -0
  35. {qapytest-0.3.4 → qapytest-0.3.6}/qapytest/_plugin.py +0 -0
  36. {qapytest-0.3.4 → qapytest-0.3.6}/qapytest/_redis.py +0 -0
  37. {qapytest-0.3.4 → qapytest-0.3.6}/qapytest/_report.py +0 -0
  38. {qapytest-0.3.4 → qapytest-0.3.6}/qapytest/_soft_assert.py +0 -0
  39. {qapytest-0.3.4 → qapytest-0.3.6}/qapytest/_sql.py +0 -0
  40. {qapytest-0.3.4 → qapytest-0.3.6}/qapytest/_step.py +0 -0
  41. {qapytest-0.3.4 → qapytest-0.3.6}/qapytest/py.typed +0 -0
  42. {qapytest-0.3.4 → qapytest-0.3.6}/tests/encoding.py +0 -0
  43. {qapytest-0.3.4 → qapytest-0.3.6}/tests/test_attach.py +0 -0
  44. {qapytest-0.3.4 → qapytest-0.3.6}/tests/test_graphql_client.py +0 -0
  45. {qapytest-0.3.4 → qapytest-0.3.6}/tests/test_http_client.py +0 -0
  46. {qapytest-0.3.4 → qapytest-0.3.6}/tests/test_integration.py +0 -0
  47. {qapytest-0.3.4 → qapytest-0.3.6}/tests/test_internal_functions.py +0 -0
  48. {qapytest-0.3.4 → qapytest-0.3.6}/tests/test_markers.py +0 -0
  49. {qapytest-0.3.4 → qapytest-0.3.6}/tests/test_redis_client.py +0 -0
  50. {qapytest-0.3.4 → qapytest-0.3.6}/tests/test_soft_assert.py +0 -0
  51. {qapytest-0.3.4 → qapytest-0.3.6}/tests/test_sql_client.py +0 -0
  52. {qapytest-0.3.4 → qapytest-0.3.6}/tests/test_step.py +0 -0
@@ -5,6 +5,22 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.3.6] - 2025-11-24
9
+
10
+ ### Fixed
11
+
12
+ - 📊 **HTML Report Layout** - improved the "Component" column display:
13
+ - Components are now listed on separate lines for better readability
14
+ - Long component names wrap correctly instead of overflowing
15
+ - Column width is now flexible and adapts to screen size
16
+ - 🔍 **Component Filter** - fixed the filter menu position to prevent it from going off-screen on smaller displays
17
+
18
+ ## [0.3.5] - 2025-11-23
19
+
20
+ ### Fixed
21
+
22
+ - 📋 **Report Copying** - improved the "Copy" functionality in test details to produce clean, readable text without excessive indentation or duplicated content.
23
+
8
24
  ## [0.3.4] - 2025-11-23
9
25
 
10
26
  ### Enhanced
@@ -169,6 +185,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
169
185
  - Configurable attachment size limits
170
186
  - Professional report styling with responsive design
171
187
 
188
+ [0.3.6]: https://github.com/o73k51i/qapytest/releases/tag/v0.3.6
189
+ [0.3.5]: https://github.com/o73k51i/qapytest/releases/tag/v0.3.5
172
190
  [0.3.4]: https://github.com/o73k51i/qapytest/releases/tag/v0.3.4
173
191
  [0.3.3]: https://github.com/o73k51i/qapytest/releases/tag/v0.3.3
174
192
  [0.3.2]: https://github.com/o73k51i/qapytest/releases/tag/v0.3.2
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: qapytest
3
- Version: 0.3.4
3
+ Version: 0.3.6
4
4
  Summary: A powerful testing framework based on pytest, specifically designed for QA engineers
5
5
  Project-URL: Homepage, https://github.com/o73k51i/qapytest
6
6
  Project-URL: Repository, https://github.com/o73k51i/qapytest
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "qapytest"
3
- version = "0.3.4"
3
+ version = "0.3.6"
4
4
  description = "A powerful testing framework based on pytest, specifically designed for QA engineers"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10,<3.14"
@@ -359,7 +359,11 @@
359
359
 
360
360
  if (!key || !value) continue;
361
361
 
362
- const keyText = key.textContent.trim();
362
+ const keyClone = key.cloneNode(true);
363
+ const keyButtons = keyClone.querySelectorAll('button, .details-btn, div');
364
+ keyButtons.forEach(el => el.remove());
365
+ const keyText = keyClone.textContent.trim();
366
+
363
367
  const valueElement = value;
364
368
 
365
369
  if (keyText === 'Execution Log') {
@@ -387,13 +391,9 @@
387
391
  const lines = [];
388
392
 
389
393
  function processLogItems(container, indent = '') {
390
- const items = qa('li', container);
394
+ const items = Array.from(container.children).filter(el => el.tagName === 'LI');
395
+
391
396
  items.forEach(item => {
392
- const parentUl = item.parentElement;
393
- if (parentUl && parentUl !== container && parentUl.closest('li') && parentUl.closest('li').parentElement === container) {
394
- return;
395
- }
396
-
397
397
  let text = '';
398
398
 
399
399
  if (item.classList.contains('step-passed') || item.classList.contains('step-failed')) {
@@ -404,10 +404,20 @@
404
404
  const stepText = strongElement.nextSibling.textContent?.trim() || '';
405
405
  text = `${stepIcon} ${stepText}`;
406
406
  } else {
407
- const fullText = item.textContent || '';
408
- const cleaned = fullText.replace(/^[✔︎✖︎]\s*Step:\s*/, '').replace(/\s*[✔︎✖︎].*$/, '').trim();
409
- const lines = cleaned.split('\n').filter(line => line.trim());
410
- text = `${stepIcon} ${lines[0] || ''}`;
407
+ let directText = '';
408
+ item.childNodes.forEach(node => {
409
+ if (node.nodeType === Node.TEXT_NODE) {
410
+ directText += node.textContent;
411
+ } else if (node.nodeType === Node.ELEMENT_NODE &&
412
+ !node.classList.contains('step-children') &&
413
+ !node.classList.contains('step-toggle') &&
414
+ !node.classList.contains('step-toggle-placeholder')) {
415
+ directText += node.textContent;
416
+ }
417
+ });
418
+
419
+ const cleaned = directText.replace(/^[✔︎✖︎]\s*Step:\s*/, '').replace(/\s*[✔︎✖︎].*$/, '').trim();
420
+ text = `${stepIcon} ${cleaned}`;
411
421
  }
412
422
  }
413
423
  else if (item.classList.contains('assert-passed') || item.classList.contains('assert-failed')) {
@@ -416,11 +426,11 @@
416
426
 
417
427
  if (assertLabel) {
418
428
  let labelText = '';
419
- for (const node of assertLabel.childNodes) {
429
+ assertLabel.childNodes.forEach(node => {
420
430
  if (node.nodeType === Node.TEXT_NODE) {
421
431
  labelText += node.textContent;
422
432
  }
423
- }
433
+ });
424
434
  labelText = labelText.replace(/^[✔︎✖︎\s]*/, '').trim();
425
435
  text = `${assertIcon} ${labelText}`;
426
436
 
@@ -442,13 +452,15 @@
442
452
  }
443
453
  }
444
454
  }
455
+ } else {
456
+ const attachmentBtn = item.querySelector('button');
457
+ if (attachmentBtn && attachmentBtn.textContent.includes('📎')) {
458
+ text = attachmentBtn.textContent.trim();
459
+ }
445
460
  }
446
461
 
447
462
  if (text) {
448
- const maxIndentLevel = 3;
449
- const currentIndentLevel = indent.length / 2;
450
- const actualIndent = currentIndentLevel <= maxIndentLevel ? indent : ' ';
451
- lines.push(actualIndent + text);
463
+ lines.push(indent + text);
452
464
  }
453
465
 
454
466
  let nestedUl = null;
@@ -458,13 +470,12 @@
458
470
  }
459
471
 
460
472
  if (nestedUl) {
461
- const nextIndent = indent.length < 6 ? indent + ' ' : indent;
462
- processLogItems(nestedUl, nextIndent);
473
+ processLogItems(nestedUl, indent + ' ');
463
474
  }
464
475
  });
465
476
  }
466
477
 
467
- const topLevelUl = qa('ul', logContainer)[0];
478
+ const topLevelUl = logContainer.querySelector(':scope > ul');
468
479
  if (topLevelUl) {
469
480
  processLogItems(topLevelUl);
470
481
  }
@@ -269,9 +269,13 @@ html[data-theme="dark"] .theme-toggle .theme-icon-sun {
269
269
 
270
270
  .table th:nth-child(1) { width: 50px; }
271
271
  .table th:nth-child(3) { width: 110px; }
272
- .table th:nth-child(4) { width: 180px; z-index: 11; }
272
+ .table th:nth-child(4) { width: 25%; z-index: 11; }
273
273
  .table th:nth-child(5) { width: 130px; }
274
274
 
275
+ .table td:nth-child(4) {
276
+ overflow-wrap: anywhere;
277
+ }
278
+
275
279
  .table {
276
280
  width: 100%;
277
281
  border-collapse: separate;
@@ -829,7 +833,8 @@ html[data-theme="dark"] .theme-toggle .theme-icon-sun {
829
833
  .th-filter-menu {
830
834
  position: absolute;
831
835
  top: 100%;
832
- left: 0;
836
+ right: 0;
837
+ left: auto;
833
838
  margin-top: 4px;
834
839
  background: var(--elev-bg);
835
840
  border: 1px solid var(--elev-border-strong);
@@ -575,7 +575,7 @@ wheels = [
575
575
 
576
576
  [[package]]
577
577
  name = "qapytest"
578
- version = "0.3.4"
578
+ version = "0.3.6"
579
579
  source = { editable = "." }
580
580
  dependencies = [
581
581
  { name = "faker" },
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes