hardpy 0.8.0__py3-none-any.whl → 0.9.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.
@@ -29,3 +29,8 @@ class DatabaseField(str, Enum):
29
29
  ATTEMPT = "attempt"
30
30
  LOCATION = "location"
31
31
  HW_ID = "hw_id"
32
+ TITLE = "title"
33
+ VISIBLE = "visible"
34
+ IMAGE = "image"
35
+ ID = "id"
36
+ FONT_SIZE = "font_size"
@@ -42,7 +42,10 @@ class CaseStateStore(IBaseResult):
42
42
  "text": "some text"
43
43
  },
44
44
  "type": "textinput"
45
- }
45
+ },
46
+ visible: true,
47
+ id: "af6ac3e7-7ce8-4a6b-bb9d-88c3e10b5c7a",
48
+ font_size: 14
46
49
  }
47
50
  }
48
51
  }
@@ -241,7 +244,8 @@ class ResultStateStore(IBaseResult):
241
244
  "operator_msg": {
242
245
  "msg": "Operator message",
243
246
  "title": "Message",
244
- "visible": "True"
247
+ "visible": true,
248
+ "id": "f45ac1e7-2ce8-4a6b-bb9d-8863e30bcc78"
245
249
  },
246
250
  "modules": {
247
251
  "test_1_a": {
@@ -266,7 +270,10 @@ class ResultStateStore(IBaseResult):
266
270
  "text": "some text"
267
271
  },
268
272
  "type": "textinput"
269
- }
273
+ },
274
+ visible: true,
275
+ id: "f45bc1e7-2c18-4a4b-2b9d-8863e30bcc78",
276
+ font_size: 14
270
277
  }
271
278
  },
272
279
  "test_minute_parity": {
@@ -7,6 +7,7 @@ from logging import getLogger
7
7
  from pathlib import Path, PurePath
8
8
  from platform import system
9
9
  from re import compile as re_compile
10
+ from time import sleep
10
11
  from typing import Any, Callable
11
12
 
12
13
  from _pytest._code.code import (
@@ -254,6 +255,9 @@ class HardpyPlugin:
254
255
 
255
256
  # first attempt was in pytest_runtest_call
256
257
  for current_attempt in range(2, attempt + 1):
258
+ # add pause between attempts to verify STOP condition
259
+ sleep(1)
260
+
257
261
  self._reporter.set_module_status(module_id, TestStatus.RUN)
258
262
  self._reporter.set_case_status(module_id, case_id, TestStatus.RUN)
259
263
  self._reporter.set_case_attempt(module_id, case_id, current_attempt)
@@ -5,7 +5,7 @@ from __future__ import annotations
5
5
  import socket
6
6
  from dataclasses import dataclass
7
7
  from os import environ
8
- from time import sleep
8
+ from select import select
9
9
  from typing import Any
10
10
  from uuid import uuid4
11
11
 
@@ -25,6 +25,7 @@ from hardpy.pytest_hardpy.utils import (
25
25
  DuplicateSerialNumberError,
26
26
  DuplicateTestStandLocationError,
27
27
  DuplicateTestStandNameError,
28
+ ImageComponent,
28
29
  )
29
30
 
30
31
 
@@ -306,52 +307,76 @@ def run_dialog_box(dialog_box_data: DialogBox) -> Any: # noqa: ANN401
306
307
  current_test.case_id,
307
308
  DF.DIALOG_BOX,
308
309
  )
309
-
310
- reporter.set_doc_value(key, {}, statestore_only=True)
311
- reporter.update_db_by_doc()
312
- debounce_time = 0.2
313
- sleep(debounce_time)
310
+ _cleanup_widget(reporter, key)
314
311
 
315
312
  reporter.set_doc_value(key, dialog_box_data.to_dict(), statestore_only=True)
316
313
  reporter.update_db_by_doc()
317
314
 
315
+ # get socket data
318
316
  input_dbx_data = _get_socket_raw_data()
319
317
 
320
- # cleanup widget
321
- reporter.set_doc_value(key, {}, statestore_only=True)
322
- reporter.update_db_by_doc()
318
+ _cleanup_widget(reporter, key)
323
319
  return dialog_box_data.widget.convert_data(input_dbx_data)
324
320
 
325
321
 
326
- def set_operator_message(msg: str, title: str | None = None) -> None:
322
+ def set_operator_message(
323
+ msg: str,
324
+ title: str | None = None,
325
+ block: bool = True,
326
+ image: ImageComponent | None = None,
327
+ font_size: int = 14,
328
+ ) -> None:
327
329
  """Set operator message.
328
330
 
329
331
  The function should be used to handle events outside of testing.
330
332
  For messages to the operator during testing, there is the function `run_dialog_box`.
331
333
 
332
334
  Args:
333
- msg (str): Message
334
- title (str | None): Title
335
+ msg (str): message
336
+ title (str | None): title
337
+ image (ImageComponent | None): operator message info
338
+ block (bool): if True, the function will block until the message is closed
339
+ font_size (int): font size
335
340
  """
336
341
  reporter = RunnerReporter()
337
342
  key = reporter.generate_key(DF.OPERATOR_MSG)
343
+ _cleanup_widget(reporter, key)
338
344
 
339
- reporter.set_doc_value(key, {}, statestore_only=True)
340
- reporter.update_db_by_doc()
341
- debounce_time = 0.2
342
- sleep(debounce_time)
345
+ if font_size < 1:
346
+ msg = "The 'font_size' argument cannot be less than 1"
347
+ raise ValueError(msg)
343
348
 
344
- msg_data = {"msg": msg, "title": title, "visible": True}
345
- reporter.set_doc_value(key, msg_data, statestore_only=True)
346
- reporter.update_db_by_doc()
347
- is_msg_visible = _get_socket_raw_data()
348
- msg_data["visible"] = is_msg_visible
349
+ msg_data = {
350
+ DF.MSG: msg,
351
+ DF.TITLE: title,
352
+ DF.VISIBLE: True,
353
+ DF.IMAGE: image.to_dict() if image else None,
354
+ DF.ID: str(uuid4()),
355
+ DF.FONT_SIZE: int(font_size),
356
+ }
349
357
  reporter.set_doc_value(key, msg_data, statestore_only=True)
350
358
  reporter.update_db_by_doc()
351
359
 
352
- # cleanup widget
353
- reporter.set_doc_value(key, {}, statestore_only=True)
354
- reporter.update_db_by_doc()
360
+ if block:
361
+ # get socket data
362
+ is_msg_visible = _get_socket_raw_data()
363
+
364
+ msg_data[DF.VISIBLE] = is_msg_visible
365
+ reporter.set_doc_value(key, msg_data, statestore_only=True)
366
+ reporter.update_db_by_doc()
367
+
368
+ _cleanup_widget(reporter, key)
369
+
370
+
371
+ def clear_operator_message() -> None:
372
+ """Clear operator message.
373
+
374
+ Clears the current message to the operator if it exists, otherwise does nothing.
375
+ """
376
+ reporter = RunnerReporter()
377
+ key = reporter.generate_key(DF.OPERATOR_MSG)
378
+
379
+ _cleanup_widget(reporter, key)
355
380
 
356
381
 
357
382
  def get_current_attempt() -> int:
@@ -391,25 +416,37 @@ def _get_current_test() -> CurrentTestInfo:
391
416
 
392
417
  def _get_socket_raw_data() -> str:
393
418
  # create socket connection
394
- server = socket.socket()
395
- server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
396
- con_data = ConnectionData()
397
-
398
- try:
399
- server.bind((con_data.socket_host, con_data.socket_port))
400
- except OSError as exc:
401
- msg = "Socket creating error"
419
+ with socket.socket() as server:
420
+ server.setblocking(False)
421
+ server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
422
+
423
+ con_data = ConnectionData()
424
+ try:
425
+ server.bind((con_data.socket_host, con_data.socket_port))
426
+ except OSError as exc:
427
+ msg = "Socket creating error"
428
+ server.close()
429
+ raise RuntimeError(msg) from exc
430
+ server.listen(1)
431
+
432
+ client = None
433
+ while True:
434
+ ready_to_read, _, _ = select([server], [], [], 0.5)
435
+ if ready_to_read:
436
+ client, _ = server.accept()
437
+ break
438
+
439
+ # receive data
440
+ max_input_data_len = 1024
441
+ socket_data = client.recv(max_input_data_len).decode("utf-8")
442
+
443
+ # close connection
444
+ client.close()
402
445
  server.close()
403
- raise RuntimeError(msg) from exc
404
- server.listen(1)
405
- client, _ = server.accept()
406
446
 
407
- # receive data
408
- max_input_data_len = 1024
409
- socket_data = client.recv(max_input_data_len).decode("utf-8")
447
+ return socket_data
410
448
 
411
- # close connection
412
- client.close()
413
- server.close()
414
449
 
415
- return socket_data
450
+ def _cleanup_widget(reporter: RunnerReporter, key: str) -> None:
451
+ reporter.set_doc_value(key, {}, statestore_only=True)
452
+ reporter.update_db_by_doc()
@@ -134,10 +134,10 @@ class PyTestWrapper:
134
134
  bool: True if dialog box was confirmed/closed, else False
135
135
  """
136
136
  try:
137
- client = socket()
138
- client.connect((self.config.socket.host, self.config.socket.port))
139
- client.sendall(data.encode("utf-8"))
140
- client.close()
137
+ with socket() as client:
138
+ client.connect((self.config.socket.host, self.config.socket.port))
139
+ client.sendall(data.encode("utf-8"))
140
+ client.close()
141
141
  except Exception: # noqa: BLE001
142
142
  return False
143
143
  return True
@@ -9,6 +9,7 @@ from copy import deepcopy
9
9
  from dataclasses import dataclass
10
10
  from enum import Enum
11
11
  from typing import Any, Final
12
+ from uuid import uuid4
12
13
 
13
14
  from hardpy.pytest_hardpy.utils.exception import ImageError, WidgetInfoError
14
15
 
@@ -315,6 +316,7 @@ class DialogBox:
315
316
  title_bar (str | None): title bar
316
317
  widget (IWidget | None): widget info
317
318
  image (ImageComponent | None): image
319
+ font_size (int): font size
318
320
  """
319
321
 
320
322
  def __init__(
@@ -323,11 +325,19 @@ class DialogBox:
323
325
  title_bar: str | None = None,
324
326
  widget: IWidget | None = None,
325
327
  image: ImageComponent | None = None,
328
+ font_size: int = 14,
326
329
  ) -> None:
327
330
  self.widget: IWidget = BaseWidget() if widget is None else widget
328
331
  self.image: ImageComponent | None = image
329
332
  self.dialog_text: str = dialog_text
330
333
  self.title_bar: str | None = title_bar
334
+ self.visible: bool = True
335
+ self.id = str(uuid4())
336
+ self.font_size = font_size
337
+
338
+ if font_size < 1:
339
+ msg = "The 'font_size' argument cannot be less than 1"
340
+ raise ValueError(msg)
331
341
 
332
342
  def to_dict(self) -> dict:
333
343
  """Convert DialogBox to dictionary.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: hardpy
3
- Version: 0.8.0
3
+ Version: 0.9.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/
@@ -18,6 +18,7 @@ Classifier: Programming Language :: Python :: 3 :: Only
18
18
  Classifier: Programming Language :: Python :: 3.10
19
19
  Classifier: Programming Language :: Python :: 3.11
20
20
  Classifier: Programming Language :: Python :: 3.12
21
+ Classifier: Programming Language :: Python :: 3.13
21
22
  Classifier: Topic :: Software Development :: Libraries
22
23
  Classifier: Topic :: Software Development :: Testing
23
24
  Classifier: Topic :: Software Development :: Testing :: Acceptance
@@ -1,4 +1,4 @@
1
- hardpy/__init__.py,sha256=bZka1CixhogDKm3hyIrD4fkE6sCYcGTBoDtsP-6mj6Y,1741
1
+ hardpy/__init__.py,sha256=jW9I0Zwb1EU-YO0oSehgoGq5ZVCMTqiZeeNOrzdjXdw,1799
2
2
  hardpy/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
3
  hardpy/cli/cli.py,sha256=DJFkqEx5-ft0rpbARDGFb-tIMNlBc76d2hzF_btVDHA,4573
4
4
  hardpy/cli/template.py,sha256=a9BZX8uFbIwyGfUex0PWGVirZ6GlkVpfpAdNsP_fqYo,6478
@@ -6,9 +6,9 @@ hardpy/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
6
  hardpy/common/config.py,sha256=aeSEAnl4FQkHw35JlbKqlC1CbZyhBQphA6YmMuzhWLw,4461
7
7
  hardpy/hardpy_panel/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
8
  hardpy/hardpy_panel/api.py,sha256=XQeTsh-TJxizaQYpzFVDHPUG6XOIZJThbxtdyjgEKSo,2992
9
- hardpy/hardpy_panel/frontend/dist/asset-manifest.json,sha256=dlGk6O3iTOi1oRMF3UhLl8JPBRI-3ePa94kAMSs82Ew,2824
9
+ hardpy/hardpy_panel/frontend/dist/asset-manifest.json,sha256=0XxqgXusGLSpIqqR-rJvKomxSaA5UUQJZuot5VnMuH8,2824
10
10
  hardpy/hardpy_panel/frontend/dist/favicon.ico,sha256=sgIk5PKUKEKBDpkSrc8dJgjpObp0iF82Mec0GpfKId4,15406
11
- hardpy/hardpy_panel/frontend/dist/index.html,sha256=cfy45pXCBq9CSJctY1q_PzMf-3m5NaRQEXk9JNuoYuY,656
11
+ hardpy/hardpy_panel/frontend/dist/index.html,sha256=tnoelByKKp6G_dA93WG3WSrk6Ln4vBS4e7A5PrcaaSs,656
12
12
  hardpy/hardpy_panel/frontend/dist/logo192.png,sha256=E4K7drvhJCg9HcTpRihOXZhVJVBZ7-W97Se-3tDb46o,14485
13
13
  hardpy/hardpy_panel/frontend/dist/logo512.png,sha256=-fIMbqX7PYUpheK4kX1C1erRTe_hHZwFQYDLrAbhFRU,34188
14
14
  hardpy/hardpy_panel/frontend/dist/manifest.json,sha256=PfmJlN2JMJtHS6OnhU4b4X5wPQC_yRBdjesjoirObSA,502
@@ -26,9 +26,9 @@ hardpy/hardpy_panel/frontend/dist/static/js/blueprint-icons-all-paths.f63155c9.c
26
26
  hardpy/hardpy_panel/frontend/dist/static/js/blueprint-icons-all-paths.f63155c9.chunk.js.map,sha256=p1xKHRK4AZutkZsQHiWSNU61tYp7I3iUuyLLm3eqkHQ,2833
27
27
  hardpy/hardpy_panel/frontend/dist/static/js/blueprint-icons-split-paths-by-size-loader.52a072d3.chunk.js,sha256=Jl5xm_jQ9IXKhCagHHvnIhwYXb379Q5FFBiqPoKdUIE,605
28
28
  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.6f09d61a.js,sha256=cMaNHNmrd24qy2qchDphLp8aRPHwtoPmzqD8hoMez7E,1064938
30
- hardpy/hardpy_panel/frontend/dist/static/js/main.6f09d61a.js.LICENSE.txt,sha256=ForPNukClWMEP3pF9LMYoU-ve-LsyCH-rYU8eLki_FY,2315
31
- hardpy/hardpy_panel/frontend/dist/static/js/main.6f09d61a.js.map,sha256=PTrIsSXig1lWc89Cjsfglkc4zz-ibfJUkASVZnOC7-s,5316516
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
32
32
  hardpy/hardpy_panel/frontend/dist/static/media/blueprint-icons-16.520846c6beb41df528c8.eot,sha256=PTCTrQYNHX2hIPUaYWtOKrI30-iQGXt_EGxq6JCXie0,117628
33
33
  hardpy/hardpy_panel/frontend/dist/static/media/blueprint-icons-16.5c52b39c697f2323ce8b.svg,sha256=lDCQy06aS-9bmhwuFOUs-EdcR8MP2wqwAwky5oamtkQ,509417
34
34
  hardpy/hardpy_panel/frontend/dist/static/media/blueprint-icons-16.84db1772f4bfb529f64f.woff,sha256=edyqQN0nw4dNBs1pgr7pQB7nJhhR6T_YfklFcG_fHj0,53344
@@ -41,18 +41,18 @@ hardpy/hardpy_panel/frontend/dist/static/media/blueprint-icons-20.afbadb627d43b7
41
41
  hardpy/hardpy_panel/frontend/dist/static/media/blueprint-icons-20.e857f5a5132b8bfa71a1.woff,sha256=mQZTxE1PyyAL16VWuASOvXlZFwuI4aCPvbrhfgpdIdU,55356
42
42
  hardpy/hardpy_panel/frontend/dist/static/media/logo_smol.5b16f92447a4a9e80331.png,sha256=E4K7drvhJCg9HcTpRihOXZhVJVBZ7-W97Se-3tDb46o,14485
43
43
  hardpy/pytest_hardpy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
44
- hardpy/pytest_hardpy/plugin.py,sha256=ExStGYzMl9OlDzUJZaNJgvRIgqJkkCI3brLvVqw2oRk,15897
45
- hardpy/pytest_hardpy/pytest_call.py,sha256=3G8oZr9lkGQ9CrjlHcq_q-xc9zVDw6moWACq1om7tHw,11616
46
- hardpy/pytest_hardpy/pytest_wrapper.py,sha256=Xj4N3KlgTQMKLcIW0xZKYJC47FCJKsgwuxbLQMOmOMU,4535
44
+ hardpy/pytest_hardpy/plugin.py,sha256=nrA1p33RR5Wef1YjqI6olzR8HgBZUCkMahDsJJnN55E,16008
45
+ hardpy/pytest_hardpy/pytest_call.py,sha256=S8v5XHm8iG_KcVeBHlb97aupGSWpadsaH_dfLLGTGEQ,12628
46
+ hardpy/pytest_hardpy/pytest_wrapper.py,sha256=bB1HLeviGDHTIYqclrKb5qEjAB9l_OqWGE688BlpETw,4554
47
47
  hardpy/pytest_hardpy/db/__init__.py,sha256=G6y13JPh8HaH2O9E3_LTH_bTUVSgiezQFjDGaNIljec,557
48
48
  hardpy/pytest_hardpy/db/base_connector.py,sha256=5a476F5LwvFUfQ4Yc0Q6biacULDrCk8UHPlpc6n0NRQ,1111
49
49
  hardpy/pytest_hardpy/db/base_server.py,sha256=XqTff225iIymPYUGGEja9r9WOilVw7ljcAVp1M8VuAI,404
50
50
  hardpy/pytest_hardpy/db/base_store.py,sha256=9TA1BAU4_ARm4dxfhLRNWSnGV98z0rr9U1o0BibBe-U,3532
51
- hardpy/pytest_hardpy/db/const.py,sha256=RUHkSRNtTa3sYTMoZg1Ser_BkcUup_bxuiwHa6yi7Wk,768
51
+ hardpy/pytest_hardpy/db/const.py,sha256=-ResQZFdj7aVvr51AduRTEE_H37CzXYAM3ZnXGRqylI,874
52
52
  hardpy/pytest_hardpy/db/runstore.py,sha256=tCXWo2AW0er3lbDcCqYbYxOBbINMZNtfnnjlIJpXmIA,949
53
53
  hardpy/pytest_hardpy/db/statestore.py,sha256=0sv4AqzwW_J34O-cb7aN3zmgULIVtZRi_qg4XvC2_L0,586
54
54
  hardpy/pytest_hardpy/db/schema/__init__.py,sha256=1S73W3PLQt8gX5Y33nbX1JdwLvnrtlKH4cElID3pwuc,263
55
- hardpy/pytest_hardpy/db/schema/v1.py,sha256=DHxMP0jeh7IqBji0uxh056_NkLMwJJv6eaK-azG8KnY,9142
55
+ hardpy/pytest_hardpy/db/schema/v1.py,sha256=J4FI5P8F7bVlkJFt2O4FXebydcvu9Sf-TLUVyxNkbcE,9420
56
56
  hardpy/pytest_hardpy/reporter/__init__.py,sha256=rztpM2HlLUpMOvad0JHbZU4Mk8PDDQyCFXLhpLktGQI,322
57
57
  hardpy/pytest_hardpy/reporter/base.py,sha256=o5Pbl89nWLCFd1mYiFdxCQ9d3FOb9oQ3eruYH60H5CQ,2517
58
58
  hardpy/pytest_hardpy/reporter/hook_reporter.py,sha256=haK9Wl3oplTtkkU_6OncBGnGPp5JHnzUCGx91GGqbWQ,11251
@@ -66,14 +66,14 @@ hardpy/pytest_hardpy/result/report_reader/couchdb_reader.py,sha256=GrROwfTVyJaVL
66
66
  hardpy/pytest_hardpy/utils/__init__.py,sha256=eNvQ5OjiLHLj9Rn2y4hyIexano1CUNhSMhzaw3IUwn4,1471
67
67
  hardpy/pytest_hardpy/utils/connection_data.py,sha256=NVDrkGok5fW2c163bwjBN0F9Ja2CZrwSL0bRUrNXTU0,484
68
68
  hardpy/pytest_hardpy/utils/const.py,sha256=RuzRmnpvmUylRbj8CxtaVbo7J9kp6rELvjPdfUzMQLU,407
69
- hardpy/pytest_hardpy/utils/dialog_box.py,sha256=qOTSGJb9PSBA9URVDiDrXM3cK9JljgXw32-DSYY0NbU,9393
69
+ hardpy/pytest_hardpy/utils/dialog_box.py,sha256=aUakpMihJTLRaAWm1Ybt2SPYGBL5Gt9pOmhIMYEHIls,9708
70
70
  hardpy/pytest_hardpy/utils/exception.py,sha256=kLvJpAppjFsdnhw7zhUHGMLhS946O36H2-F5wrTeVVE,1380
71
71
  hardpy/pytest_hardpy/utils/machineid.py,sha256=6JAzUt7KtjTYn8kL9hSMaCQ20U8liH-zDT9v-5Ch7Q8,296
72
72
  hardpy/pytest_hardpy/utils/node_info.py,sha256=mA7u1KHHLIq70ZNOOF7NVlxMmfhwGanVyXpBNfBWQDk,4121
73
73
  hardpy/pytest_hardpy/utils/progress_calculator.py,sha256=TPl2gG0ZSvMe8otPythhF9hkD6fa6-mJAhy9yI83-yE,1071
74
74
  hardpy/pytest_hardpy/utils/singleton.py,sha256=tjUGs48o_vBeVpRsEBZEOTCoCUikpIFmQ1c3rsfymso,948
75
- hardpy-0.8.0.dist-info/METADATA,sha256=s6QH1Lulem4N-Gbt44S2fLAC2rZ-SkDzQmGixdEF8P0,3635
76
- hardpy-0.8.0.dist-info/WHEEL,sha256=TJPnKdtrSue7xZ_AVGkp9YXcvDrobsjBds1du3Nx6dc,87
77
- hardpy-0.8.0.dist-info/entry_points.txt,sha256=nL2sMkKMScNaOE0IPkYnu9Yr-BUswZvGSrwY-SxHY3E,102
78
- hardpy-0.8.0.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
79
- hardpy-0.8.0.dist-info/RECORD,,
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,,