hardpy 0.18.0__tar.gz → 0.18.2__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 (86) hide show
  1. {hardpy-0.18.0 → hardpy-0.18.2}/PKG-INFO +1 -1
  2. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/cli/cli.py +7 -3
  3. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/common/stand_cloud/connector.py +1 -1
  4. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/common/stand_cloud/exception.py +0 -3
  5. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/common/stand_cloud/token_manager.py +2 -0
  6. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/hardpy_panel/api.py +6 -8
  7. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/pytest_hardpy/plugin.py +3 -3
  8. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/pytest_hardpy/pytest_wrapper.py +4 -4
  9. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/pytest_hardpy/result/report_synchronizer/synchronizer.py +10 -5
  10. {hardpy-0.18.0 → hardpy-0.18.2}/pyproject.toml +1 -1
  11. {hardpy-0.18.0 → hardpy-0.18.2}/.gitignore +0 -0
  12. {hardpy-0.18.0 → hardpy-0.18.2}/LICENSE +0 -0
  13. {hardpy-0.18.0 → hardpy-0.18.2}/README.md +0 -0
  14. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/__init__.py +0 -0
  15. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/cli/__init__.py +0 -0
  16. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/cli/template.py +0 -0
  17. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/common/__init__.py +0 -0
  18. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/common/config.py +0 -0
  19. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/common/singleton.py +0 -0
  20. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/common/stand_cloud/__init__.py +0 -0
  21. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/common/stand_cloud/oauth2.py +0 -0
  22. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/common/stand_cloud/registration.py +0 -0
  23. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/common/stand_cloud/utils.py +0 -0
  24. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/hardpy_panel/__init__.py +0 -0
  25. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/hardpy_panel/frontend/dist/assets/allPaths-31ulJ0tA.js +0 -0
  26. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/hardpy_panel/frontend/dist/assets/allPathsLoader-HPn4WHWu.js +0 -0
  27. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/hardpy_panel/frontend/dist/assets/blueprint-icons-16-B2twAPZE.ttf +0 -0
  28. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/hardpy_panel/frontend/dist/assets/blueprint-icons-16-C0Unyq1d.eot +0 -0
  29. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/hardpy_panel/frontend/dist/assets/blueprint-icons-16-CVy9qFng.svg +0 -0
  30. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/hardpy_panel/frontend/dist/assets/blueprint-icons-16-Ck1ifK4A.woff +0 -0
  31. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/hardpy_panel/frontend/dist/assets/blueprint-icons-16-DwWyHYRo.woff2 +0 -0
  32. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/hardpy_panel/frontend/dist/assets/blueprint-icons-20-9zitLjlL.woff2 +0 -0
  33. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/hardpy_panel/frontend/dist/assets/blueprint-icons-20-CjKGIKxE.woff +0 -0
  34. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/hardpy_panel/frontend/dist/assets/blueprint-icons-20-DQ09GSQq.svg +0 -0
  35. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/hardpy_panel/frontend/dist/assets/blueprint-icons-20-DmR755bS.ttf +0 -0
  36. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/hardpy_panel/frontend/dist/assets/blueprint-icons-20-p9MhBXD8.eot +0 -0
  37. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/hardpy_panel/frontend/dist/assets/browser-ponyfill-BQ1ipruI.js +0 -0
  38. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/hardpy_panel/frontend/dist/assets/index-B-fsa5Ru.js +0 -0
  39. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/hardpy_panel/frontend/dist/assets/index-B7T9xvaW.css +0 -0
  40. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/hardpy_panel/frontend/dist/assets/index-BK2y65ib.js +0 -0
  41. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/hardpy_panel/frontend/dist/assets/index-DLOviMB1.js +0 -0
  42. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/hardpy_panel/frontend/dist/assets/logo_smol-CK3jE85c.png +0 -0
  43. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/hardpy_panel/frontend/dist/assets/splitPathsBySizeLoader-ev1ZiRR9.js +0 -0
  44. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/hardpy_panel/frontend/dist/favicon.ico +0 -0
  45. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/hardpy_panel/frontend/dist/index.html +0 -0
  46. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/hardpy_panel/frontend/dist/locales/de/translation.json +0 -0
  47. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/hardpy_panel/frontend/dist/locales/en/translation.json +0 -0
  48. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/hardpy_panel/frontend/dist/locales/es/translation.json +0 -0
  49. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/hardpy_panel/frontend/dist/locales/fr/translation.json +0 -0
  50. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/hardpy_panel/frontend/dist/locales/ja/translation.json +0 -0
  51. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/hardpy_panel/frontend/dist/locales/ru/translation.json +0 -0
  52. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/hardpy_panel/frontend/dist/locales/zh/translation.json +0 -0
  53. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/hardpy_panel/frontend/dist/logo192.png +0 -0
  54. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/hardpy_panel/frontend/dist/logo512.png +0 -0
  55. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/hardpy_panel/frontend/dist/manifest.json +0 -0
  56. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/pytest_hardpy/__init__.py +0 -0
  57. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/pytest_hardpy/db/__init__.py +0 -0
  58. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/pytest_hardpy/db/base_store.py +0 -0
  59. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/pytest_hardpy/db/const.py +0 -0
  60. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/pytest_hardpy/db/runstore.py +0 -0
  61. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/pytest_hardpy/db/schema/__init__.py +0 -0
  62. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/pytest_hardpy/db/schema/v1.py +0 -0
  63. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/pytest_hardpy/db/stand_type.py +0 -0
  64. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/pytest_hardpy/db/statestore.py +0 -0
  65. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/pytest_hardpy/db/tempstore.py +0 -0
  66. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/pytest_hardpy/pytest_call.py +0 -0
  67. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/pytest_hardpy/reporter/__init__.py +0 -0
  68. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/pytest_hardpy/reporter/base.py +0 -0
  69. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/pytest_hardpy/reporter/hook_reporter.py +0 -0
  70. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/pytest_hardpy/reporter/runner_reporter.py +0 -0
  71. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/pytest_hardpy/result/__init__.py +0 -0
  72. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/pytest_hardpy/result/couchdb_config.py +0 -0
  73. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/pytest_hardpy/result/report_loader/__init__.py +0 -0
  74. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/pytest_hardpy/result/report_loader/couchdb_loader.py +0 -0
  75. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/pytest_hardpy/result/report_loader/stand_cloud_loader.py +0 -0
  76. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/pytest_hardpy/result/report_reader/__init__.py +0 -0
  77. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/pytest_hardpy/result/report_reader/couchdb_reader.py +0 -0
  78. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/pytest_hardpy/result/report_reader/stand_cloud_reader.py +0 -0
  79. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/pytest_hardpy/result/report_synchronizer/__init__.py +0 -0
  80. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/pytest_hardpy/utils/__init__.py +0 -0
  81. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/pytest_hardpy/utils/const.py +0 -0
  82. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/pytest_hardpy/utils/dialog_box.py +0 -0
  83. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/pytest_hardpy/utils/exception.py +0 -0
  84. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/pytest_hardpy/utils/machineid.py +0 -0
  85. {hardpy-0.18.0 → hardpy-0.18.2}/hardpy/pytest_hardpy/utils/node_info.py +0 -0
  86. {hardpy-0.18.0 → hardpy-0.18.2}/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.18.0
3
+ Version: 0.18.2
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/
@@ -330,9 +330,13 @@ def _validate_running_config(config: HardpyConfig, tests_dir: str) -> None:
330
330
  sys.exit()
331
331
 
332
332
  def _validate_config(config: HardpyConfig) -> None:
333
- if config.stand_cloud.autosync_timeout < 1:
334
- print("StandCloud autosync timeout must be greater than 0.")
335
- sys.exit()
333
+ if config.stand_cloud.autosync:
334
+ if config.stand_cloud.autosync_timeout < 1:
335
+ print("StandCloud autosync timeout must be greater than 0.")
336
+ sys.exit()
337
+ if not config.stand_cloud.api_key:
338
+ print("StandCloud API key is empty.")
339
+ sys.exit()
336
340
 
337
341
 
338
342
  def _request_hardpy(url: str, timeout: int = 5) -> str:
@@ -166,7 +166,7 @@ class StandCloudConnector:
166
166
  except OAuth2Error as exc:
167
167
  raise StandCloudError(exc.description) from exc
168
168
  except RequestException as exc:
169
- raise StandCloudError(exc.strerror) from exc # type: ignore
169
+ raise StandCloudError(exc.strerror or str(exc)) from exc # type: ignore
170
170
 
171
171
  return resp
172
172
 
@@ -4,6 +4,3 @@
4
4
 
5
5
  class StandCloudError(Exception):
6
6
  """Base StandCloud error."""
7
-
8
- def __init__(self, msg: str) -> None:
9
- super().__init__(f"StandCloud error: {msg}")
@@ -124,6 +124,8 @@ class TokenManager:
124
124
  storage_keyring = load_keyring("keyring.backends.SecretService.Keyring")
125
125
  elif system() == "Windows":
126
126
  storage_keyring = load_keyring("keyring.backends.Windows.WinVaultKeyring")
127
+ elif system() == "Darwin":
128
+ storage_keyring = load_keyring("keyring.backends.macOS.KeyChain")
127
129
  # TODO(xorialexandrov): add memory keyring or other store
128
130
  mem_keyring = storage_keyring
129
131
 
@@ -93,9 +93,8 @@ async def sync_stand_cloud(sc_sync_interval_minutes: int) -> None:
93
93
  except asyncio.CancelledError:
94
94
  logger.info("StandCloud synchronization task cancelled.")
95
95
  break
96
- except Exception: # noqa: BLE001
97
- # TODO (xorialexandrov): add more information to logging
98
- logger.info("Error during StandCloud synchronization")
96
+ except Exception as exc: # noqa: BLE001
97
+ logger.info(f"Error during StandCloud synchronization. {exc}")
99
98
  await asyncio.sleep(sc_sync_interval)
100
99
 
101
100
 
@@ -208,12 +207,11 @@ async def stand_cloud_sync() -> dict:
208
207
  app.state.executor,
209
208
  app.state.sc_synchronizer.sync,
210
209
  )
211
- except Exception: # noqa: BLE001
212
- msg = "Error during StandCloud synchronization"
213
- # TODO (xorialexandrov): add more information to logging
214
- logger.info("Error during StandCloud synchronization")
210
+ except Exception as exc: # noqa: BLE001
211
+ msg = f"Error during StandCloud synchronization. {exc}"
212
+ logger.info(msg)
215
213
  return {"status": msg}
216
- logger.info(f"StandCloud sucnronization status: {sync_result}")
214
+ logger.info(f"StandCloud syncronization status: {sync_result}")
217
215
  return {"status": sync_result}
218
216
 
219
217
 
@@ -140,10 +140,10 @@ class HardpyPlugin:
140
140
  self._start_args = {}
141
141
  self._sc_syncronizer = StandCloudSynchronizer()
142
142
 
143
- if system() == "Linux":
144
- signal.signal(signal.SIGTERM, self._stop_handler)
145
- elif system() == "Windows":
143
+ if system() == "Windows":
146
144
  signal.signal(signal.SIGBREAK, self._stop_handler) # type: ignore
145
+ else:
146
+ signal.signal(signal.SIGTERM, self._stop_handler)
147
147
  self._log = getLogger(__name__)
148
148
 
149
149
  # Initialization hooks
@@ -65,7 +65,7 @@ class PyTestWrapper:
65
65
  cwd=self._config_manager.tests_path,
66
66
  creationflags=subprocess.CREATE_NEW_PROCESS_GROUP,
67
67
  )
68
- if system() == "Linux":
68
+ else:
69
69
  self._proc = subprocess.Popen( # noqa: S603
70
70
  cmd,
71
71
  cwd=self._config_manager.tests_path,
@@ -80,10 +80,10 @@ class PyTestWrapper:
80
80
  bool: True if pytest was running and stopped
81
81
  """
82
82
  if self.is_running() and self._proc:
83
- if system() == "Linux":
84
- self._proc.terminate()
85
- elif system() == "Windows":
83
+ if system() == "Windows":
86
84
  self._proc.send_signal(signal.CTRL_BREAK_EVENT) # type: ignore
85
+ else:
86
+ self._proc.terminate()
87
87
  return True
88
88
  return False
89
89
 
@@ -31,10 +31,7 @@ class StandCloudSynchronizer:
31
31
  """
32
32
  if not self._tempstore.reports():
33
33
  return "All reports are synchronized with StandCloud"
34
- try:
35
- loader = self._create_sc_loader()
36
- except StandCloudError as err:
37
- raise StandCloudError(str(err)) from err
34
+ loader = self._create_sc_loader()
38
35
 
39
36
  invalid_reports = []
40
37
  success_report_counter = 0
@@ -117,5 +114,13 @@ class StandCloudSynchronizer:
117
114
 
118
115
  def _create_sc_loader(self) -> StandCloudLoader:
119
116
  loader = StandCloudLoader()
120
- loader.healthcheck()
117
+ response = loader.healthcheck()
118
+ if response.status_code != HTTPStatus.OK:
119
+ url = response.url
120
+ code = response.status_code
121
+ msg = f"StandCloud healthcheck at {url} is unavailable, status code: {code}"
122
+ raise StandCloudError(msg)
123
+ if response.status_code == HTTPStatus.OK and response.text != "{}":
124
+ msg = f"StandCloud healthcheck at {response.url} is unavailable"
125
+ raise StandCloudError(msg)
121
126
  return loader
@@ -3,7 +3,7 @@
3
3
 
4
4
  [project]
5
5
  name = "hardpy"
6
- version = "0.18.0"
6
+ version = "0.18.2"
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