hardpy 0.19.0__tar.gz → 0.19.1__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 (87) hide show
  1. {hardpy-0.19.0 → hardpy-0.19.1}/PKG-INFO +2 -1
  2. {hardpy-0.19.0 → hardpy-0.19.1}/README.md +1 -0
  3. hardpy-0.19.1/hardpy/hardpy_panel/frontend/dist/locales/cs/translation.json +85 -0
  4. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/pytest_hardpy/plugin.py +24 -0
  5. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/pytest_hardpy/pytest_wrapper.py +6 -1
  6. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/pytest_hardpy/reporter/hook_reporter.py +18 -0
  7. {hardpy-0.19.0 → hardpy-0.19.1}/pyproject.toml +1 -1
  8. {hardpy-0.19.0 → hardpy-0.19.1}/.gitignore +0 -0
  9. {hardpy-0.19.0 → hardpy-0.19.1}/LICENSE +0 -0
  10. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/__init__.py +0 -0
  11. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/cli/__init__.py +0 -0
  12. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/cli/cli.py +0 -0
  13. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/cli/template.py +0 -0
  14. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/common/__init__.py +0 -0
  15. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/common/config.py +0 -0
  16. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/common/singleton.py +0 -0
  17. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/common/stand_cloud/__init__.py +0 -0
  18. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/common/stand_cloud/connector.py +0 -0
  19. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/common/stand_cloud/exception.py +0 -0
  20. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/common/stand_cloud/oauth2.py +0 -0
  21. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/common/stand_cloud/registration.py +0 -0
  22. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/common/stand_cloud/token_manager.py +0 -0
  23. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/common/stand_cloud/utils.py +0 -0
  24. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/hardpy_panel/__init__.py +0 -0
  25. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/hardpy_panel/api.py +0 -0
  26. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/hardpy_panel/frontend/dist/assets/allPaths-C_-7WXHD.js +0 -0
  27. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/hardpy_panel/frontend/dist/assets/allPathsLoader-DgH0Xily.js +0 -0
  28. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/hardpy_panel/frontend/dist/assets/blueprint-icons-16-B2twAPZE.ttf +0 -0
  29. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/hardpy_panel/frontend/dist/assets/blueprint-icons-16-C0Unyq1d.eot +0 -0
  30. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/hardpy_panel/frontend/dist/assets/blueprint-icons-16-CVy9qFng.svg +0 -0
  31. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/hardpy_panel/frontend/dist/assets/blueprint-icons-16-Ck1ifK4A.woff +0 -0
  32. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/hardpy_panel/frontend/dist/assets/blueprint-icons-16-DwWyHYRo.woff2 +0 -0
  33. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/hardpy_panel/frontend/dist/assets/blueprint-icons-20-9zitLjlL.woff2 +0 -0
  34. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/hardpy_panel/frontend/dist/assets/blueprint-icons-20-CjKGIKxE.woff +0 -0
  35. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/hardpy_panel/frontend/dist/assets/blueprint-icons-20-DQ09GSQq.svg +0 -0
  36. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/hardpy_panel/frontend/dist/assets/blueprint-icons-20-DmR755bS.ttf +0 -0
  37. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/hardpy_panel/frontend/dist/assets/blueprint-icons-20-p9MhBXD8.eot +0 -0
  38. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/hardpy_panel/frontend/dist/assets/browser-ponyfill-BbOvdqIF.js +0 -0
  39. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/hardpy_panel/frontend/dist/assets/index-B-fsa5Ru.js +0 -0
  40. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/hardpy_panel/frontend/dist/assets/index-B7T9xvaW.css +0 -0
  41. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/hardpy_panel/frontend/dist/assets/index-DEJb2W0B.js +0 -0
  42. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/hardpy_panel/frontend/dist/assets/index-DLOviMB1.js +0 -0
  43. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/hardpy_panel/frontend/dist/assets/logo_smol-CK3jE85c.png +0 -0
  44. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/hardpy_panel/frontend/dist/assets/splitPathsBySizeLoader-o5HCcdVL.js +0 -0
  45. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/hardpy_panel/frontend/dist/favicon.ico +0 -0
  46. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/hardpy_panel/frontend/dist/index.html +0 -0
  47. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/hardpy_panel/frontend/dist/locales/de/translation.json +0 -0
  48. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/hardpy_panel/frontend/dist/locales/en/translation.json +0 -0
  49. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/hardpy_panel/frontend/dist/locales/es/translation.json +0 -0
  50. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/hardpy_panel/frontend/dist/locales/fr/translation.json +0 -0
  51. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/hardpy_panel/frontend/dist/locales/ja/translation.json +0 -0
  52. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/hardpy_panel/frontend/dist/locales/ru/translation.json +0 -0
  53. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/hardpy_panel/frontend/dist/locales/zh/translation.json +0 -0
  54. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/hardpy_panel/frontend/dist/logo192.png +0 -0
  55. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/hardpy_panel/frontend/dist/logo512.png +0 -0
  56. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/hardpy_panel/frontend/dist/manifest.json +0 -0
  57. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/pytest_hardpy/__init__.py +0 -0
  58. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/pytest_hardpy/db/__init__.py +0 -0
  59. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/pytest_hardpy/db/base_store.py +0 -0
  60. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/pytest_hardpy/db/const.py +0 -0
  61. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/pytest_hardpy/db/runstore.py +0 -0
  62. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/pytest_hardpy/db/schema/__init__.py +0 -0
  63. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/pytest_hardpy/db/schema/v1.py +0 -0
  64. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/pytest_hardpy/db/stand_type.py +0 -0
  65. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/pytest_hardpy/db/statestore.py +0 -0
  66. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/pytest_hardpy/db/tempstore.py +0 -0
  67. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/pytest_hardpy/pytest_call.py +0 -0
  68. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/pytest_hardpy/reporter/__init__.py +0 -0
  69. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/pytest_hardpy/reporter/base.py +0 -0
  70. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/pytest_hardpy/reporter/runner_reporter.py +0 -0
  71. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/pytest_hardpy/result/__init__.py +0 -0
  72. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/pytest_hardpy/result/couchdb_config.py +0 -0
  73. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/pytest_hardpy/result/report_loader/__init__.py +0 -0
  74. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/pytest_hardpy/result/report_loader/couchdb_loader.py +0 -0
  75. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/pytest_hardpy/result/report_loader/stand_cloud_loader.py +0 -0
  76. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/pytest_hardpy/result/report_reader/__init__.py +0 -0
  77. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/pytest_hardpy/result/report_reader/couchdb_reader.py +0 -0
  78. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/pytest_hardpy/result/report_reader/stand_cloud_reader.py +0 -0
  79. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/pytest_hardpy/result/report_synchronizer/__init__.py +0 -0
  80. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/pytest_hardpy/result/report_synchronizer/synchronizer.py +0 -0
  81. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/pytest_hardpy/utils/__init__.py +0 -0
  82. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/pytest_hardpy/utils/const.py +0 -0
  83. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/pytest_hardpy/utils/dialog_box.py +0 -0
  84. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/pytest_hardpy/utils/exception.py +0 -0
  85. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/pytest_hardpy/utils/machineid.py +0 -0
  86. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/pytest_hardpy/utils/node_info.py +0 -0
  87. {hardpy-0.19.0 → hardpy-0.19.1}/hardpy/pytest_hardpy/utils/progress_calculator.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hardpy
3
- Version: 0.19.0
3
+ Version: 0.19.1
4
4
  Summary: HardPy library for device testing
5
5
  Project-URL: Homepage, https://github.com/everypinio/hardpy/
6
6
  Project-URL: Documentation, https://everypinio.github.io/hardpy/
@@ -69,6 +69,7 @@ HardPy is a python library for creating a test bench for devices.
69
69
  [![pytest versions](https://img.shields.io/badge/pytest-%3E%3D7.0-blue)](https://docs.pytest.org/en/latest/)
70
70
  [![Documentation](https://img.shields.io/badge/Documentation%20-Overview%20-%20%23007ec6)](https://everypinio.github.io/hardpy/)
71
71
  [![Reddit](https://img.shields.io/badge/-Reddit-FF4500?style=flat&logo=reddit&logoColor=white)](https://www.reddit.com/r/HardPy)
72
+ [![Discord](https://img.shields.io/discord/1304494076799877172?color=7389D8&label&logo=discord&logoColor=ffffff)]()
72
73
  [![Telegram](https://img.shields.io/badge/-Telegram-2CA5E0?style=flat&logo=telegram&logoColor=white)](https://t.me/everypin)
73
74
 
74
75
  </div>
@@ -13,6 +13,7 @@ HardPy is a python library for creating a test bench for devices.
13
13
  [![pytest versions](https://img.shields.io/badge/pytest-%3E%3D7.0-blue)](https://docs.pytest.org/en/latest/)
14
14
  [![Documentation](https://img.shields.io/badge/Documentation%20-Overview%20-%20%23007ec6)](https://everypinio.github.io/hardpy/)
15
15
  [![Reddit](https://img.shields.io/badge/-Reddit-FF4500?style=flat&logo=reddit&logoColor=white)](https://www.reddit.com/r/HardPy)
16
+ [![Discord](https://img.shields.io/discord/1304494076799877172?color=7389D8&label&logo=discord&logoColor=ffffff)]()
16
17
  [![Telegram](https://img.shields.io/badge/-Telegram-2CA5E0?style=flat&logo=telegram&logoColor=white)](https://t.me/everypin)
17
18
 
18
19
  </div>
@@ -0,0 +1,85 @@
1
+ {
2
+ "app": {
3
+ "title": "HardPy Panel operátora",
4
+ "lastLaunch": "Poslední běh:",
5
+ "duration": "Doba trvání",
6
+ "seconds": "s",
7
+ "soundOn": "Zapnout zvuk",
8
+ "soundOff": "Vypnout zvuk",
9
+ "debugOn": "Zapnout režim ladění",
10
+ "debugOff": "Vypnout režim ladění",
11
+ "connection": "Navazuji spojení... 🧐🔎",
12
+ "dbError": "Chyba připojení k databázi. 🙅🏽‍♀️🚫",
13
+ "noEntries": "Žádné záznamy v databázi 🙅🏽‍♀️🚫",
14
+ "stoppedTestCase": "Zastavený test",
15
+ "failedTestCases": "Testy selhaly",
16
+ "modalResultDismissHint": "Klikněte kamkoliv nebo stiskněte libovolnou klávesu pro zavření",
17
+ "modalResultAutoDismissHint": "Automaticky zmizí za {{seconds}} sekund...",
18
+ "manualCollectOn": "Zapnout manuální výběr testů",
19
+ "manualCollectOff": "Vypnout manuální výběr testů",
20
+ "testConfigurationSelector": "Vyberte testovací konfiguraci",
21
+ "status": {
22
+ "ready": "Připraveno",
23
+ "run": "Běží",
24
+ "passed": "Uspěl",
25
+ "failed": "Neuspěl",
26
+ "stopped": "Zastaveno",
27
+ "unknown": "Neznámý"
28
+ }
29
+ },
30
+ "button": {
31
+ "start": "Začít",
32
+ "stop": "Zastavit",
33
+ "confirm": "Potvrdit",
34
+ "pass": "OK",
35
+ "fail": "Zrušit"
36
+ },
37
+ "error": {
38
+ "dbConnectionTitle": "Chyba připojení k databázi",
39
+ "dbConnectionMessage": "Nepodařilo se navázat spojení s databází"
40
+ },
41
+ "chart": {
42
+ "dataChart": "Grafy",
43
+ "xAxis": "Osa X",
44
+ "yAxis": "Osa Y",
45
+ "chart": "Graf",
46
+ "showChart": "Zobrazit graf {{title}}",
47
+ "fullscreenButton": "Otevřít graf na celé obrazovce",
48
+ "series": "Řada {{number}}"
49
+ },
50
+ "operatorDialog": {
51
+ "defaultTitle": "Zpráva",
52
+ "imageAlt": "Obrázek pro operátora",
53
+ "htmlCodeTitle": "HTML kód",
54
+ "htmlLinkTitle": "HTML odkaz",
55
+ "enterAnswer": "Zadejte odpověď",
56
+ "fieldNotEmpty": "Pole nesmí být prázdné",
57
+ "notificationTitle": "Oznámení",
58
+ "notificationDesc": "Okno bylo uzavřeno. Testy byly zastaveny.",
59
+ "numericInputError": "Zadejte prosím číslo",
60
+ "radioButtonError": "Vyberte prosím jednu možnost",
61
+ "checkboxError": "Vyberte prosím alespoň jednu možnost"
62
+ },
63
+ "suiteList": {
64
+ "loadingTests": "Načítání testů... 🤔",
65
+ "refreshHint": "Zkuste aktualizovat stránku.",
66
+ "standName": "Název stanoviště",
67
+ "status": "Stav",
68
+ "startTime": "Čas zahájení",
69
+ "finishTime": "Čas dokončení",
70
+ "alert": "Upozornění"
71
+ },
72
+ "testSuite": {
73
+ "nameColumn": "Název",
74
+ "dataColumn": "Údaje",
75
+ "loading": "Načítám...",
76
+ "stubName": "Sada testů",
77
+ "runSelectedTests": "Spustit {{count}} vybrané testy",
78
+ "noTestsSelected": "Nebyly vybrány žádné testy",
79
+ "testsStarted": "Zahájené testy {{count}}",
80
+ "startError": "Chyba při spouštění testů",
81
+ "connectionError": "Chyba připojení",
82
+ "selectionColumn": "Vybrat",
83
+ "skipped": "Přeskočeno"
84
+ }
85
+ }
@@ -205,6 +205,7 @@ class HardpyPlugin:
205
205
  status = self._get_run_status(exitstatus)
206
206
  if status == TestStatus.STOPPED:
207
207
  self._stop_tests()
208
+ self._validate_stop_time()
208
209
  self._reporter.finish(status)
209
210
  self._reporter.update_db_by_doc()
210
211
  self._reporter.compact_all()
@@ -483,6 +484,29 @@ class HardpyPlugin:
483
484
  case _:
484
485
  return TestStatus.FAILED
485
486
 
487
+ def _validate_stop_time(self) -> None:
488
+ """Update module and case stop times if they are not set.
489
+
490
+ If module start time is set but module stop time is not set,
491
+ set module stop time to module start time.
492
+ If case start time is set but case stop time is not set, set
493
+ case stop time to case start time.
494
+ """
495
+ for module_id, module_data in self._results.items():
496
+ module_start_time = self._reporter.get_module_start_time(module_id)
497
+ module_stop_time = self._reporter.get_module_stop_time(module_id)
498
+ if module_start_time and not module_stop_time:
499
+ self._reporter.set_module_stop_time(module_start_time)
500
+ for module_data_key in module_data:
501
+ # skip module status
502
+ if module_data_key == "module_status":
503
+ continue
504
+ case_id = module_data_key
505
+ case_start_time = self._reporter.get_case_start_time(module_id, case_id)
506
+ case_stop_time = self._reporter.get_case_stop_time(module_id, case_id)
507
+ if case_start_time and not case_stop_time:
508
+ self._reporter.set_case_stop_time(case_start_time)
509
+
486
510
  def _stop_tests(self) -> None:
487
511
  """Update module and case statuses to stopped and skipped."""
488
512
  is_module_stopped = False
@@ -208,11 +208,16 @@ class PyTestWrapper:
208
208
  return config_manager.config.model_dump()
209
209
 
210
210
  def _tests_name(self) -> str:
211
- return (
211
+ manual_str = ""
212
+ if self.config.frontend.manual_collect:
213
+ manual_str = " Manual mode"
214
+
215
+ tests_name = (
212
216
  self.config.tests_name + f" {self.config.current_test_config}"
213
217
  if self.config.current_test_config
214
218
  else self.config.tests_name
215
219
  )
220
+ return tests_name + manual_str
216
221
 
217
222
  def _add_config_file(self, cmd: list) -> None:
218
223
  """Add test configuration file if specified."""
@@ -231,6 +231,15 @@ class HookReporter(BaseReporter):
231
231
  key = self.generate_key(DF.MODULES, module_id, DF.START_TIME)
232
232
  return self._statestore.get_field(key)
233
233
 
234
+ def get_module_stop_time(self, module_id: str) -> int:
235
+ """Get module stop time.
236
+
237
+ Returns:
238
+ int: module time
239
+ """
240
+ key = self.generate_key(DF.MODULES, module_id, DF.STOP_TIME)
241
+ return self._statestore.get_field(key)
242
+
234
243
  def get_case_start_time(self, module_id: str, case_id: str) -> int:
235
244
  """Get case start time.
236
245
 
@@ -240,6 +249,15 @@ class HookReporter(BaseReporter):
240
249
  key = self.generate_key(DF.MODULES, module_id, DF.CASES, case_id, DF.START_TIME)
241
250
  return self._statestore.get_field(key)
242
251
 
252
+ def get_case_stop_time(self, module_id: str, case_id: str) -> int:
253
+ """Get case stop time.
254
+
255
+ Returns:
256
+ int: module time
257
+ """
258
+ key = self.generate_key(DF.MODULES, module_id, DF.CASES, case_id, DF.STOP_TIME)
259
+ return self._statestore.get_field(key)
260
+
243
261
  def set_caused_dut_failure_id(self, module_id: str, case_id: str) -> None:
244
262
  """Set caused DUT failure id.
245
263
 
@@ -3,7 +3,7 @@
3
3
 
4
4
  [project]
5
5
  name = "hardpy"
6
- version = "0.19.0"
6
+ version = "0.19.1"
7
7
  description = "HardPy library for device testing"
8
8
  license = "GPL-3.0-or-later"
9
9
  authors = [{ name = "Everypin", email = "info@everypin.io" }]
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes