hardpy 0.9.0__py3-none-any.whl → 0.10.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.
Files changed (31) hide show
  1. hardpy/__init__.py +4 -1
  2. hardpy/cli/cli.py +78 -11
  3. hardpy/common/config.py +16 -0
  4. hardpy/common/stand_cloud/__init__.py +13 -0
  5. hardpy/common/stand_cloud/connector.py +227 -0
  6. hardpy/common/stand_cloud/exception.py +9 -0
  7. hardpy/common/stand_cloud/oauth_callback.py +95 -0
  8. hardpy/common/stand_cloud/registration.py +209 -0
  9. hardpy/common/stand_cloud/token_storage.py +23 -0
  10. hardpy/hardpy_panel/api.py +10 -8
  11. hardpy/hardpy_panel/frontend/dist/asset-manifest.json +3 -3
  12. hardpy/hardpy_panel/frontend/dist/index.html +1 -1
  13. hardpy/hardpy_panel/frontend/dist/static/js/main.8a7d8f7d.js +3 -0
  14. hardpy/hardpy_panel/frontend/dist/static/js/main.8a7d8f7d.js.map +1 -0
  15. hardpy/pytest_hardpy/db/const.py +1 -0
  16. hardpy/pytest_hardpy/db/schema/v1.py +2 -0
  17. hardpy/pytest_hardpy/plugin.py +52 -4
  18. hardpy/pytest_hardpy/pytest_wrapper.py +10 -0
  19. hardpy/pytest_hardpy/reporter/hook_reporter.py +10 -0
  20. hardpy/pytest_hardpy/result/__init__.py +4 -0
  21. hardpy/pytest_hardpy/result/report_loader/__init__.py +4 -0
  22. hardpy/pytest_hardpy/result/report_loader/stand_cloud_loader.py +72 -0
  23. hardpy/pytest_hardpy/utils/connection_data.py +2 -0
  24. {hardpy-0.9.0.dist-info → hardpy-0.10.0.dist-info}/METADATA +8 -2
  25. {hardpy-0.9.0.dist-info → hardpy-0.10.0.dist-info}/RECORD +29 -22
  26. {hardpy-0.9.0.dist-info → hardpy-0.10.0.dist-info}/WHEEL +1 -1
  27. hardpy/hardpy_panel/frontend/dist/static/js/main.403e9cd8.js +0 -3
  28. hardpy/hardpy_panel/frontend/dist/static/js/main.403e9cd8.js.map +0 -1
  29. /hardpy/hardpy_panel/frontend/dist/static/js/{main.403e9cd8.js.LICENSE.txt → main.8a7d8f7d.js.LICENSE.txt} +0 -0
  30. {hardpy-0.9.0.dist-info → hardpy-0.10.0.dist-info}/entry_points.txt +0 -0
  31. {hardpy-0.9.0.dist-info → hardpy-0.10.0.dist-info}/licenses/LICENSE +0 -0
@@ -34,3 +34,4 @@ class DatabaseField(str, Enum):
34
34
  IMAGE = "image"
35
35
  ID = "id"
36
36
  FONT_SIZE = "font_size"
37
+ ALERT = "alert"
@@ -217,6 +217,7 @@ class ResultStateStore(IBaseResult):
217
217
  "start_time": 1695817263,
218
218
  "status": "failed",
219
219
  "name": "hardpy-stand",
220
+ "alert": "",
220
221
  "dut": {
221
222
  "serial_number": "92c5a4bb-ecb0-42c5-89ac-e0caca0919fd",
222
223
  "part_number": "part_1",
@@ -303,6 +304,7 @@ class ResultStateStore(IBaseResult):
303
304
  dut: Dut
304
305
  modules: dict[str, ModuleStateStore] = {}
305
306
  operator_msg: dict = {}
307
+ alert: str
306
308
 
307
309
 
308
310
  class ResultRunStore(IBaseResult):
@@ -31,6 +31,7 @@ from pytest import (
31
31
  skip,
32
32
  )
33
33
 
34
+ from hardpy.common.stand_cloud.connector import StandCloudConnector, StandCloudError
34
35
  from hardpy.pytest_hardpy.reporter import HookReporter
35
36
  from hardpy.pytest_hardpy.utils import (
36
37
  ConnectionData,
@@ -40,6 +41,11 @@ from hardpy.pytest_hardpy.utils import (
40
41
  )
41
42
  from hardpy.pytest_hardpy.utils.node_info import TestDependencyInfo
42
43
 
44
+ if __debug__:
45
+ from urllib3 import disable_warnings
46
+ from urllib3.exceptions import InsecureRequestWarning
47
+
48
+ disable_warnings(InsecureRequestWarning)
43
49
 
44
50
  def pytest_addoption(parser: Parser) -> None:
45
51
  """Register argparse-style options."""
@@ -74,6 +80,18 @@ def pytest_addoption(parser: Parser) -> None:
74
80
  default=False,
75
81
  help="enable pytest-hardpy plugin",
76
82
  )
83
+ parser.addoption(
84
+ "--sc-address",
85
+ action="store",
86
+ default=con_data.sc_address,
87
+ help="StandCloud address",
88
+ )
89
+ parser.addoption(
90
+ "--sc-connection-only",
91
+ action="store_true",
92
+ default=con_data.sc_connection_only,
93
+ help="check StandCloud availability",
94
+ )
77
95
 
78
96
 
79
97
  # Bootstrapping hooks
@@ -126,6 +144,14 @@ class HardpyPlugin:
126
144
  if socket_host:
127
145
  con_data.socket_host = str(socket_host) # type: ignore
128
146
 
147
+ sc_address = config.getoption("--sc-address")
148
+ if sc_address:
149
+ con_data.sc_address = str(sc_address) # type: ignore
150
+
151
+ sc_connection_only = config.getoption("--sc-connection-only")
152
+ if sc_connection_only:
153
+ con_data.sc_connection_only = bool(sc_connection_only) # type: ignore
154
+
129
155
  config.addinivalue_line("markers", "case_name")
130
156
  config.addinivalue_line("markers", "module_name")
131
157
  config.addinivalue_line("markers", "dependency")
@@ -202,6 +228,27 @@ class HardpyPlugin:
202
228
  # ignore collect only mode
203
229
  return True
204
230
 
231
+ con_data = ConnectionData()
232
+
233
+ if con_data.sc_connection_only: # check
234
+ try:
235
+ sc_connector = StandCloudConnector(addr=con_data.sc_address)
236
+ except StandCloudError as exc:
237
+ msg = str(exc)
238
+ self._reporter.set_alert(msg)
239
+ exit(msg)
240
+ try:
241
+ sc_connector.healthcheck()
242
+ except Exception: # noqa: BLE001
243
+ addr = con_data.sc_address
244
+ msg = (
245
+ f"StandCloud service at the address {addr} "
246
+ "not available or HardPy user is not authorized"
247
+ )
248
+ self._reporter.set_alert(msg)
249
+ self._reporter.update_db_by_doc()
250
+ exit(msg)
251
+
205
252
  # testrun entrypoint
206
253
  self._reporter.start()
207
254
  self._reporter.update_db_by_doc()
@@ -334,9 +381,10 @@ class HardpyPlugin:
334
381
  self._results[module_id][case_id] = None
335
382
 
336
383
  def _collect_module_result(self, module_id: str) -> None:
337
- if TestStatus.ERROR in self._results[module_id].values():
338
- status = TestStatus.ERROR
339
- elif TestStatus.FAILED in self._results[module_id].values():
384
+ if (
385
+ TestStatus.FAILED in self._results[module_id].values()
386
+ or TestStatus.ERROR in self._results[module_id].values()
387
+ ):
340
388
  status = TestStatus.FAILED
341
389
  elif TestStatus.SKIPPED in self._results[module_id].values():
342
390
  status = TestStatus.SKIPPED
@@ -356,7 +404,7 @@ class HardpyPlugin:
356
404
  self._stop_tests()
357
405
  return TestStatus.STOPPED
358
406
  case _:
359
- return TestStatus.ERROR
407
+ return TestStatus.FAILED
360
408
 
361
409
  def _stop_tests(self) -> None:
362
410
  """Update module and case statuses from READY or RUN to STOPPED."""
@@ -47,6 +47,11 @@ class PyTestWrapper:
47
47
  str(self.config.socket.port),
48
48
  "--hardpy-sh",
49
49
  self.config.socket.host,
50
+ "--sc-address",
51
+ self.config.stand_cloud.address,
52
+ "--sc-connection-only"
53
+ if self.config.stand_cloud.connection_only
54
+ else "",
50
55
  "--hardpy-pt",
51
56
  ],
52
57
  cwd=ConfigManager().get_tests_path(),
@@ -63,6 +68,11 @@ class PyTestWrapper:
63
68
  str(self.config.socket.port),
64
69
  "--hardpy-sh",
65
70
  self.config.socket.host,
71
+ "--sc-address",
72
+ self.config.stand_cloud.address,
73
+ "--sc-connection-only"
74
+ if self.config.stand_cloud.connection_only
75
+ else "",
66
76
  "--hardpy-pt",
67
77
  ],
68
78
  cwd=ConfigManager().get_tests_path(),
@@ -37,6 +37,7 @@ class HookReporter(BaseReporter):
37
37
  self.set_doc_value(DF.PROGRESS, 0, statestore_only=True)
38
38
  self.set_doc_value(DF.ARTIFACT, {}, runstore_only=True)
39
39
  self.set_doc_value(DF.OPERATOR_MSG, {}, statestore_only=True)
40
+ self.set_doc_value(DF.ALERT, "", statestore_only=True)
40
41
 
41
42
  test_stand_tz = self.generate_key(DF.TEST_STAND, DF.TIMEZONE)
42
43
  self.set_doc_value(test_stand_tz, str(get_localzone().key))
@@ -51,6 +52,7 @@ class HookReporter(BaseReporter):
51
52
  self.set_doc_value(DF.START_TIME, start_time)
52
53
  self.set_doc_value(DF.STATUS, TestStatus.RUN)
53
54
  self.set_doc_value(DF.PROGRESS, 0, statestore_only=True)
55
+ self.set_doc_value(DF.ALERT, "", statestore_only=True)
54
56
 
55
57
  def finish(self, status: TestStatus) -> None:
56
58
  """Finish test.
@@ -185,6 +187,14 @@ class HookReporter(BaseReporter):
185
187
  )
186
188
  self.set_doc_value(key, attempt, statestore_only=True)
187
189
 
190
+ def set_alert(self, alert: str) -> None:
191
+ """Set alert message.
192
+
193
+ Args:
194
+ alert (str): alert message
195
+ """
196
+ self.set_doc_value(DF.ALERT, alert, statestore_only=True)
197
+
188
198
  def update_node_order(self, nodes: dict) -> None:
189
199
  """Update node order.
190
200
 
@@ -2,9 +2,13 @@
2
2
  # GNU General Public License v3.0 (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
3
3
 
4
4
  from hardpy.pytest_hardpy.result.report_loader.couchdb_loader import CouchdbLoader
5
+ from hardpy.pytest_hardpy.result.report_loader.stand_cloud_loader import (
6
+ StandCloudLoader,
7
+ )
5
8
  from hardpy.pytest_hardpy.result.report_reader.couchdb_reader import CouchdbReader
6
9
 
7
10
  __all__ = [
8
11
  "CouchdbLoader",
9
12
  "CouchdbReader",
13
+ "StandCloudLoader",
10
14
  ]
@@ -4,7 +4,11 @@
4
4
  from hardpy.pytest_hardpy.result.report_loader.couchdb_loader import (
5
5
  CouchdbLoader,
6
6
  )
7
+ from hardpy.pytest_hardpy.result.report_loader.stand_cloud_loader import (
8
+ StandCloudLoader,
9
+ )
7
10
 
8
11
  __all__ = [
9
12
  "CouchdbLoader",
13
+ "StandCloudLoader",
10
14
  ]
@@ -0,0 +1,72 @@
1
+ # Copyright (c) 2024 Everypin
2
+ # GNU General Public License v3.0 (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
3
+ from __future__ import annotations
4
+
5
+ from typing import TYPE_CHECKING
6
+
7
+ from oauthlib.oauth2.rfc6749.errors import InvalidGrantError, TokenExpiredError
8
+ from requests.exceptions import HTTPError
9
+ from requests_oauth2client.tokens import ExpiredAccessToken
10
+
11
+ from hardpy.common.stand_cloud.connector import StandCloudConnector, StandCloudError
12
+ from hardpy.pytest_hardpy.utils import ConnectionData
13
+
14
+ if TYPE_CHECKING:
15
+ from requests import Response
16
+
17
+ from hardpy.pytest_hardpy.db.schema import ResultRunStore
18
+
19
+
20
+ class StandCloudLoader:
21
+ """StandCloud report generator."""
22
+
23
+ def __init__(self, address: str | None = None) -> None:
24
+ """Create StandCLoud loader.
25
+
26
+ Args:
27
+ address (str | None, optional): StandCloud address.
28
+ Defaults to None (the value is taken from the.toml).
29
+ Can be used outside of HardPy applications.
30
+ """
31
+ self._verify_ssl = not __debug__
32
+ connection_data = ConnectionData()
33
+ sc_addr = address if address else connection_data.sc_address
34
+ self._sc_connector = StandCloudConnector(sc_addr)
35
+
36
+ def load(self, report: ResultRunStore) -> Response:
37
+ """Load report to the StandCloud.
38
+
39
+ Args:
40
+ report (ResultRunStore): report
41
+
42
+ Returns:
43
+ Response: StandCloud load response, must be 201
44
+
45
+ Raises:
46
+ StandCloudError: if report not uploaded to StandCloud
47
+ """
48
+ api = self._sc_connector.get_api("api/test_run")
49
+
50
+ try:
51
+ resp = api.post(verify=self._verify_ssl, json=report.model_dump())
52
+ except ExpiredAccessToken as exc:
53
+ raise StandCloudError(str(exc)) # type: ignore
54
+ except TokenExpiredError as exc:
55
+ raise StandCloudError(exc.description)
56
+ except InvalidGrantError as exc:
57
+ raise StandCloudError(exc.description)
58
+ except HTTPError as exc:
59
+ return exc.response # type: ignore
60
+
61
+ return resp
62
+
63
+ def healthcheck(self) -> Response:
64
+ """Healthcheck of StandCloud API.
65
+
66
+ Returns:
67
+ Response: StandCloud healthcheck response, must be 200
68
+
69
+ Raises:
70
+ StandCloudError: if StandCloud is unavailable
71
+ """
72
+ return self._sc_connector.healthcheck()
@@ -13,3 +13,5 @@ class ConnectionData(metaclass=SingletonMeta):
13
13
  self.database_url: str = "http://dev:dev@localhost:5984/"
14
14
  self.socket_host: str = gethostname()
15
15
  self.socket_port: int = 6525
16
+ self.sc_address: str = ""
17
+ self.sc_connection_only: bool = False
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: hardpy
3
- Version: 0.9.0
3
+ Version: 0.10.0
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/
@@ -26,11 +26,17 @@ Classifier: Topic :: Utilities
26
26
  Requires-Python: >=3.10
27
27
  Requires-Dist: fastapi>=0.100.1
28
28
  Requires-Dist: glom>=23.3.0
29
+ Requires-Dist: jinja2<4,>=3
30
+ Requires-Dist: keyring<26,>=25.0.0
29
31
  Requires-Dist: natsort>=8.4.0
32
+ Requires-Dist: oauthlib<4,>=3.1.0
30
33
  Requires-Dist: py-machineid~=0.6.0
31
34
  Requires-Dist: pycouchdb<2,>=1.14.2
32
35
  Requires-Dist: pydantic<3,>=2.4.0
33
36
  Requires-Dist: pytest<9,>=7
37
+ Requires-Dist: requests-oauth2client<2,>=1.5.0
38
+ Requires-Dist: requests-oauthlib<3,>=2.0.0
39
+ Requires-Dist: requests<3,>=2.30.0
34
40
  Requires-Dist: tomli-w<2,>=1.1.0
35
41
  Requires-Dist: tomli<3,>=2.0.1
36
42
  Requires-Dist: typer<1,>=0.12
@@ -1,14 +1,20 @@
1
- hardpy/__init__.py,sha256=jW9I0Zwb1EU-YO0oSehgoGq5ZVCMTqiZeeNOrzdjXdw,1799
1
+ hardpy/__init__.py,sha256=WX_p5lKywria7tlZulIKTdPhgG-F_Soic1eQa25_of8,1918
2
2
  hardpy/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
- hardpy/cli/cli.py,sha256=DJFkqEx5-ft0rpbARDGFb-tIMNlBc76d2hzF_btVDHA,4573
3
+ hardpy/cli/cli.py,sha256=EzyTc8C771NaVnwLed9tAauX8MHVhdxmWetKOfqWFBk,6538
4
4
  hardpy/cli/template.py,sha256=a9BZX8uFbIwyGfUex0PWGVirZ6GlkVpfpAdNsP_fqYo,6478
5
5
  hardpy/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
- hardpy/common/config.py,sha256=aeSEAnl4FQkHw35JlbKqlC1CbZyhBQphA6YmMuzhWLw,4461
6
+ hardpy/common/config.py,sha256=IkY3jTCmjzmIqXBPGhBPQp2yEx8SzI00c5WrEspIhsQ,5077
7
+ hardpy/common/stand_cloud/__init__.py,sha256=iOLOLdz06j8TLZBzHbYYuc0V5RYdEuG9ZbAxSg3rP2s,412
8
+ hardpy/common/stand_cloud/connector.py,sha256=RBG-RDQmKGDey7mT13KiDtl-0ETIGivF-3LGtI67Odg,7334
9
+ hardpy/common/stand_cloud/exception.py,sha256=eKkqu5ylDRIGN_yZhvz2xVGm49XmlZ8nryALgdRqpbY,287
10
+ hardpy/common/stand_cloud/oauth_callback.py,sha256=GkADOnQ46HwxKEdgG_4bS1xX0ybfdQqMK3us-dMuHVw,3322
11
+ hardpy/common/stand_cloud/registration.py,sha256=QoQLRx69AdUF-uS8ACSlUeI5bxzHRpuvLLvWylX-lrQ,6007
12
+ hardpy/common/stand_cloud/token_storage.py,sha256=g-wqGV2Cq0UJwQQX7k84WbgbUfelfJys-Te1JYdBnLw,681
7
13
  hardpy/hardpy_panel/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
- hardpy/hardpy_panel/api.py,sha256=XQeTsh-TJxizaQYpzFVDHPUG6XOIZJThbxtdyjgEKSo,2992
9
- hardpy/hardpy_panel/frontend/dist/asset-manifest.json,sha256=0XxqgXusGLSpIqqR-rJvKomxSaA5UUQJZuot5VnMuH8,2824
14
+ hardpy/hardpy_panel/api.py,sha256=2brUDu8gAV7WduZTlxfW_ax-Z7loE-RXzZgrUUd33L4,3073
15
+ hardpy/hardpy_panel/frontend/dist/asset-manifest.json,sha256=PgtjHvX6HPsAzUrKaCldhGUmr0wyFIv8brWW2pitHUQ,2824
10
16
  hardpy/hardpy_panel/frontend/dist/favicon.ico,sha256=sgIk5PKUKEKBDpkSrc8dJgjpObp0iF82Mec0GpfKId4,15406
11
- hardpy/hardpy_panel/frontend/dist/index.html,sha256=tnoelByKKp6G_dA93WG3WSrk6Ln4vBS4e7A5PrcaaSs,656
17
+ hardpy/hardpy_panel/frontend/dist/index.html,sha256=zlW8GXzZZSz2Q3d1RP1LuNzuNFQk9oI1iemKzFbxC_o,656
12
18
  hardpy/hardpy_panel/frontend/dist/logo192.png,sha256=E4K7drvhJCg9HcTpRihOXZhVJVBZ7-W97Se-3tDb46o,14485
13
19
  hardpy/hardpy_panel/frontend/dist/logo512.png,sha256=-fIMbqX7PYUpheK4kX1C1erRTe_hHZwFQYDLrAbhFRU,34188
14
20
  hardpy/hardpy_panel/frontend/dist/manifest.json,sha256=PfmJlN2JMJtHS6OnhU4b4X5wPQC_yRBdjesjoirObSA,502
@@ -26,9 +32,9 @@ hardpy/hardpy_panel/frontend/dist/static/js/blueprint-icons-all-paths.f63155c9.c
26
32
  hardpy/hardpy_panel/frontend/dist/static/js/blueprint-icons-all-paths.f63155c9.chunk.js.map,sha256=p1xKHRK4AZutkZsQHiWSNU61tYp7I3iUuyLLm3eqkHQ,2833
27
33
  hardpy/hardpy_panel/frontend/dist/static/js/blueprint-icons-split-paths-by-size-loader.52a072d3.chunk.js,sha256=Jl5xm_jQ9IXKhCagHHvnIhwYXb379Q5FFBiqPoKdUIE,605
28
34
  hardpy/hardpy_panel/frontend/dist/static/js/blueprint-icons-split-paths-by-size-loader.52a072d3.chunk.js.map,sha256=amJiG2QaJMRR9Y2M0C2soOqd75xdQHhsVKjwrDSIIT0,2224
29
- hardpy/hardpy_panel/frontend/dist/static/js/main.403e9cd8.js,sha256=ANnIGk2RhGmmh5Xa6RAZCMrsKMfPeDiA9eQ8VFDIoPc,1067460
30
- hardpy/hardpy_panel/frontend/dist/static/js/main.403e9cd8.js.LICENSE.txt,sha256=ForPNukClWMEP3pF9LMYoU-ve-LsyCH-rYU8eLki_FY,2315
31
- hardpy/hardpy_panel/frontend/dist/static/js/main.403e9cd8.js.map,sha256=-4lbjH-S9tUmu9k_w_Le5EwB-jpLfVzTSvc4iCZUdTE,5324286
35
+ hardpy/hardpy_panel/frontend/dist/static/js/main.8a7d8f7d.js,sha256=lb369nZXWvAWJvKBkONDxwjGgt8q1R5K8LjHmAig-uA,1067533
36
+ hardpy/hardpy_panel/frontend/dist/static/js/main.8a7d8f7d.js.LICENSE.txt,sha256=ForPNukClWMEP3pF9LMYoU-ve-LsyCH-rYU8eLki_FY,2315
37
+ hardpy/hardpy_panel/frontend/dist/static/js/main.8a7d8f7d.js.map,sha256=MwMn2EKAFx4ynoVjCcFuWYJO_iFS4j3FNVllq5oYYdA,5324603
32
38
  hardpy/hardpy_panel/frontend/dist/static/media/blueprint-icons-16.520846c6beb41df528c8.eot,sha256=PTCTrQYNHX2hIPUaYWtOKrI30-iQGXt_EGxq6JCXie0,117628
33
39
  hardpy/hardpy_panel/frontend/dist/static/media/blueprint-icons-16.5c52b39c697f2323ce8b.svg,sha256=lDCQy06aS-9bmhwuFOUs-EdcR8MP2wqwAwky5oamtkQ,509417
34
40
  hardpy/hardpy_panel/frontend/dist/static/media/blueprint-icons-16.84db1772f4bfb529f64f.woff,sha256=edyqQN0nw4dNBs1pgr7pQB7nJhhR6T_YfklFcG_fHj0,53344
@@ -41,30 +47,31 @@ hardpy/hardpy_panel/frontend/dist/static/media/blueprint-icons-20.afbadb627d43b7
41
47
  hardpy/hardpy_panel/frontend/dist/static/media/blueprint-icons-20.e857f5a5132b8bfa71a1.woff,sha256=mQZTxE1PyyAL16VWuASOvXlZFwuI4aCPvbrhfgpdIdU,55356
42
48
  hardpy/hardpy_panel/frontend/dist/static/media/logo_smol.5b16f92447a4a9e80331.png,sha256=E4K7drvhJCg9HcTpRihOXZhVJVBZ7-W97Se-3tDb46o,14485
43
49
  hardpy/pytest_hardpy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
44
- hardpy/pytest_hardpy/plugin.py,sha256=nrA1p33RR5Wef1YjqI6olzR8HgBZUCkMahDsJJnN55E,16008
50
+ hardpy/pytest_hardpy/plugin.py,sha256=dBgj_p7Re9BWHCXKUT8h5J8LGAXK0Jb_ac9fdtQ_q3A,17671
45
51
  hardpy/pytest_hardpy/pytest_call.py,sha256=S8v5XHm8iG_KcVeBHlb97aupGSWpadsaH_dfLLGTGEQ,12628
46
- hardpy/pytest_hardpy/pytest_wrapper.py,sha256=bB1HLeviGDHTIYqclrKb5qEjAB9l_OqWGE688BlpETw,4554
52
+ hardpy/pytest_hardpy/pytest_wrapper.py,sha256=y9McSAzSIushZek2wmNooZDDnN_1TlxHoW-WG5Wk29M,5002
47
53
  hardpy/pytest_hardpy/db/__init__.py,sha256=G6y13JPh8HaH2O9E3_LTH_bTUVSgiezQFjDGaNIljec,557
48
54
  hardpy/pytest_hardpy/db/base_connector.py,sha256=5a476F5LwvFUfQ4Yc0Q6biacULDrCk8UHPlpc6n0NRQ,1111
49
55
  hardpy/pytest_hardpy/db/base_server.py,sha256=XqTff225iIymPYUGGEja9r9WOilVw7ljcAVp1M8VuAI,404
50
56
  hardpy/pytest_hardpy/db/base_store.py,sha256=9TA1BAU4_ARm4dxfhLRNWSnGV98z0rr9U1o0BibBe-U,3532
51
- hardpy/pytest_hardpy/db/const.py,sha256=-ResQZFdj7aVvr51AduRTEE_H37CzXYAM3ZnXGRqylI,874
57
+ hardpy/pytest_hardpy/db/const.py,sha256=MkKYBAf5_o4jaGM-vfprKbRXITb-ix7RqmNo3AMCI7o,894
52
58
  hardpy/pytest_hardpy/db/runstore.py,sha256=tCXWo2AW0er3lbDcCqYbYxOBbINMZNtfnnjlIJpXmIA,949
53
59
  hardpy/pytest_hardpy/db/statestore.py,sha256=0sv4AqzwW_J34O-cb7aN3zmgULIVtZRi_qg4XvC2_L0,586
54
60
  hardpy/pytest_hardpy/db/schema/__init__.py,sha256=1S73W3PLQt8gX5Y33nbX1JdwLvnrtlKH4cElID3pwuc,263
55
- hardpy/pytest_hardpy/db/schema/v1.py,sha256=J4FI5P8F7bVlkJFt2O4FXebydcvu9Sf-TLUVyxNkbcE,9420
61
+ hardpy/pytest_hardpy/db/schema/v1.py,sha256=iEkcczMYo9TGs6dTzL5eR1k59rkOC8FDs4JRqGuoNAM,9454
56
62
  hardpy/pytest_hardpy/reporter/__init__.py,sha256=rztpM2HlLUpMOvad0JHbZU4Mk8PDDQyCFXLhpLktGQI,322
57
63
  hardpy/pytest_hardpy/reporter/base.py,sha256=o5Pbl89nWLCFd1mYiFdxCQ9d3FOb9oQ3eruYH60H5CQ,2517
58
- hardpy/pytest_hardpy/reporter/hook_reporter.py,sha256=haK9Wl3oplTtkkU_6OncBGnGPp5JHnzUCGx91GGqbWQ,11251
64
+ hardpy/pytest_hardpy/reporter/hook_reporter.py,sha256=PAmy-dcIectzbAd3NfZDi_IydtFXwY9_7HlbsgLhLvA,11585
59
65
  hardpy/pytest_hardpy/reporter/runner_reporter.py,sha256=YsK8wrLIulsixePG6WNfC4MagpKfhP5j0CUaXkcfeL0,790
60
- hardpy/pytest_hardpy/result/__init__.py,sha256=0-W_usRzALAbvlKxW-qXeW214H8Bp5UNvl-FG-vrWrM,346
66
+ hardpy/pytest_hardpy/result/__init__.py,sha256=JEFxF8yCnBcUSkvRFIjOCTafMIQuMXCBL23Uj0vSX2E,469
61
67
  hardpy/pytest_hardpy/result/couchdb_config.py,sha256=rzUc2cg6uUnDo6RPHTaWR_RbmN_uZ77dWGCXQYz8iNk,3292
62
- hardpy/pytest_hardpy/result/report_loader/__init__.py,sha256=FuHuD6IFZyaKj0yu5urhf6nkxGbiPONJ-WHnJ2jHwyc,251
68
+ hardpy/pytest_hardpy/result/report_loader/__init__.py,sha256=wq5Y-_JW2ExCRnQ9VVesKmTToEQrcTY5RxNJIWaT9ag,374
63
69
  hardpy/pytest_hardpy/result/report_loader/couchdb_loader.py,sha256=KcZ0JkCgWhrj2J9M04JBDy0fpqtpVEYtu9GCLDG27pU,2255
70
+ hardpy/pytest_hardpy/result/report_loader/stand_cloud_loader.py,sha256=RM6teBUvX5BlYUEHnElqIBvbbfx0G98vwjlCecI6FG8,2405
64
71
  hardpy/pytest_hardpy/result/report_reader/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
65
72
  hardpy/pytest_hardpy/result/report_reader/couchdb_reader.py,sha256=GrROwfTVyJaVLPBxkvOM35HCksFEnWm0aVI8FibPikg,5911
66
73
  hardpy/pytest_hardpy/utils/__init__.py,sha256=eNvQ5OjiLHLj9Rn2y4hyIexano1CUNhSMhzaw3IUwn4,1471
67
- hardpy/pytest_hardpy/utils/connection_data.py,sha256=NVDrkGok5fW2c163bwjBN0F9Ja2CZrwSL0bRUrNXTU0,484
74
+ hardpy/pytest_hardpy/utils/connection_data.py,sha256=H5WyQhyRolXkZPrSDAlNRm0TRUcJAsHC7_27MjRa85w,564
68
75
  hardpy/pytest_hardpy/utils/const.py,sha256=RuzRmnpvmUylRbj8CxtaVbo7J9kp6rELvjPdfUzMQLU,407
69
76
  hardpy/pytest_hardpy/utils/dialog_box.py,sha256=aUakpMihJTLRaAWm1Ybt2SPYGBL5Gt9pOmhIMYEHIls,9708
70
77
  hardpy/pytest_hardpy/utils/exception.py,sha256=kLvJpAppjFsdnhw7zhUHGMLhS946O36H2-F5wrTeVVE,1380
@@ -72,8 +79,8 @@ hardpy/pytest_hardpy/utils/machineid.py,sha256=6JAzUt7KtjTYn8kL9hSMaCQ20U8liH-zD
72
79
  hardpy/pytest_hardpy/utils/node_info.py,sha256=mA7u1KHHLIq70ZNOOF7NVlxMmfhwGanVyXpBNfBWQDk,4121
73
80
  hardpy/pytest_hardpy/utils/progress_calculator.py,sha256=TPl2gG0ZSvMe8otPythhF9hkD6fa6-mJAhy9yI83-yE,1071
74
81
  hardpy/pytest_hardpy/utils/singleton.py,sha256=tjUGs48o_vBeVpRsEBZEOTCoCUikpIFmQ1c3rsfymso,948
75
- hardpy-0.9.0.dist-info/METADATA,sha256=YM0t39uebOYNf94ua2eWab1GFWtAEhNEhOiQKXVkVAw,3686
76
- hardpy-0.9.0.dist-info/WHEEL,sha256=TJPnKdtrSue7xZ_AVGkp9YXcvDrobsjBds1du3Nx6dc,87
77
- hardpy-0.9.0.dist-info/entry_points.txt,sha256=nL2sMkKMScNaOE0IPkYnu9Yr-BUswZvGSrwY-SxHY3E,102
78
- hardpy-0.9.0.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
79
- hardpy-0.9.0.dist-info/RECORD,,
82
+ hardpy-0.10.0.dist-info/METADATA,sha256=A6XFOyxpBR8ENne-9TGG2SSXJ5MIHQpvhwp8JuooWDg,3909
83
+ hardpy-0.10.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
84
+ hardpy-0.10.0.dist-info/entry_points.txt,sha256=nL2sMkKMScNaOE0IPkYnu9Yr-BUswZvGSrwY-SxHY3E,102
85
+ hardpy-0.10.0.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
86
+ hardpy-0.10.0.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: hatchling 1.21.1
2
+ Generator: hatchling 1.27.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any