dclab 0.62.17__cp313-cp313-macosx_10_13_x86_64.whl → 0.63.1__cp313-cp313-macosx_10_13_x86_64.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.

Potentially problematic release.


This version of dclab might be problematic. Click here for more details.

dclab/_version.py CHANGED
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '0.62.17'
21
- __version_tuple__ = version_tuple = (0, 62, 17)
20
+ __version__ = version = '0.63.1'
21
+ __version_tuple__ = version_tuple = (0, 63, 1)
Binary file
@@ -51,6 +51,7 @@ class Export(object):
51
51
  pixel_format: str = "yuv420p",
52
52
  codec: str = "rawvideo",
53
53
  codec_options: dict[str, str] = None,
54
+ progress_callback: callable = None,
54
55
  ):
55
56
  """Exports filtered event images to a video file
56
57
 
@@ -72,6 +73,10 @@ class Export(object):
72
73
  codec_options:
73
74
  Additional arguments to give to the codec using ffmpeg,
74
75
  e.g. `{'preset': 'slow', 'crf': '0'}` for "libx264" codec.
76
+ progress_callback: callable
77
+ Function that takes at least two arguments: float between 0 and
78
+ 1 for monitoring progress and a string describing what is being
79
+ done.
75
80
 
76
81
  Notes
77
82
  -----
@@ -103,6 +108,10 @@ class Export(object):
103
108
 
104
109
  # write the filtered frames to the video file
105
110
  for evid in np.arange(len(ds)):
111
+
112
+ if progress_callback is not None and evid % 10_000 == 0:
113
+ progress_callback(evid / len(ds), "exporting video")
114
+
106
115
  # skip frames that were filtered out
107
116
  if filtered and not ds.filter.all[evid]:
108
117
  continue
@@ -116,12 +125,22 @@ class Export(object):
116
125
 
117
126
  for packet in stream.encode(av_frame):
118
127
  container.mux(packet)
128
+
129
+ if progress_callback is not None:
130
+ progress_callback(1.0, "video export complete")
131
+
119
132
  else:
120
133
  msg = "No image data to export: dataset {} !".format(ds.title)
121
134
  raise OSError(msg)
122
135
 
123
- def fcs(self, path, features, meta_data=None, filtered=True,
124
- override=False):
136
+ def fcs(self,
137
+ path: pathlib.Path | str,
138
+ features: list[str],
139
+ meta_data: dict = None,
140
+ filtered: bool = True,
141
+ override: bool = False,
142
+ progress_callback: callable = None,
143
+ ):
125
144
  """Export the data of an RT-DC dataset to an .fcs file
126
145
 
127
146
  Parameters
@@ -142,6 +161,10 @@ class Export(object):
142
161
  override: bool
143
162
  If set to `True`, an existing file ``path`` will be overridden.
144
163
  If set to `False`, raises `OSError` if ``path`` exists.
164
+ progress_callback: callable
165
+ Function that takes at least two arguments: float between 0 and
166
+ 1 for monitoring progress and a string describing what is being
167
+ done.
145
168
 
146
169
  Notes
147
170
  -----
@@ -175,12 +198,18 @@ class Export(object):
175
198
  # Collect the header
176
199
  chn_names = [dfn.get_feature_label(c, rtdc_ds=ds) for c in features]
177
200
 
201
+ if progress_callback is not None:
202
+ progress_callback(0.0, "collecting data")
203
+
178
204
  # Collect the data
179
205
  if filtered:
180
206
  data = [ds[c][ds.filter.all] for c in features]
181
207
  else:
182
208
  data = [ds[c] for c in features]
183
209
 
210
+ if progress_callback is not None:
211
+ progress_callback(0.5, "exporting data")
212
+
184
213
  data = np.array(data).transpose()
185
214
  meta_data["dclab version"] = version
186
215
  fcswrite.write_fcs(filename=str(path),
@@ -189,6 +218,9 @@ class Export(object):
189
218
  text_kw_pr=meta_data,
190
219
  )
191
220
 
221
+ if progress_callback is not None:
222
+ progress_callback(1.0, "export complete")
223
+
192
224
  def hdf5(self,
193
225
  path: str | pathlib.Path,
194
226
  features: List[str] = None,
@@ -200,7 +232,9 @@ class Export(object):
200
232
  override: bool = False,
201
233
  compression_kwargs: Dict = None,
202
234
  compression: str = "deprecated",
203
- skip_checks: bool = False):
235
+ skip_checks: bool = False,
236
+ progress_callback: callable = None,
237
+ ):
204
238
  """Export the data of the current instance to an HDF5 file
205
239
 
206
240
  Parameters
@@ -244,7 +278,10 @@ class Export(object):
244
278
  Use `compression_kwargs` instead.
245
279
  skip_checks: bool
246
280
  Disable checking whether all features have the same length.
247
-
281
+ progress_callback: callable
282
+ Function that takes at least two arguments: float between 0 and
283
+ 1 for monitoring progress and a string describing what is being
284
+ done.
248
285
 
249
286
  .. versionchanged:: 0.58.0
250
287
 
@@ -335,6 +372,8 @@ class Export(object):
335
372
  with RTDCWriter(path,
336
373
  mode="append",
337
374
  compression_kwargs=compression_kwargs) as hw:
375
+ if progress_callback is not None:
376
+ progress_callback(0.0, "writing metadata")
338
377
  # write meta data
339
378
  hw.store_metadata(meta)
340
379
 
@@ -369,7 +408,10 @@ class Export(object):
369
408
  ds.tables[tab])
370
409
 
371
410
  # write each feature individually
372
- for feat in features:
411
+ for ii, feat in enumerate(features):
412
+ if progress_callback is not None:
413
+ progress_callback(ii / len(features), f"exporting {feat}")
414
+
373
415
  if (filter_arr is None or
374
416
  # This does not work for the .tdms file format
375
417
  # (and probably also not for DCOR).
@@ -393,6 +435,10 @@ class Export(object):
393
435
  filtarr=filter_arr)
394
436
 
395
437
  if basins:
438
+ if progress_callback:
439
+ progress_callback(1 - 1 / (len(features) or 1),
440
+ "writing basins")
441
+
396
442
  # We have to store basins. There are three options:
397
443
  # - filtering disabled: just copy basins
398
444
  # - filtering enabled
@@ -472,9 +518,17 @@ class Export(object):
472
518
 
473
519
  # Do not verify basins, it takes too long.
474
520
  hw.store_basin(**bn_dict, verify=False)
521
+ if progress_callback is not None:
522
+ progress_callback(1.0, "export complete")
475
523
 
476
- def tsv(self, path, features, meta_data=None, filtered=True,
477
- override=False):
524
+ def tsv(self,
525
+ path: pathlib.Path | str,
526
+ features: list[str],
527
+ meta_data: dict = None,
528
+ filtered: bool = True,
529
+ override: bool = False,
530
+ progress_callback: callable = None,
531
+ ):
478
532
  """Export the data of the current instance to a .tsv file
479
533
 
480
534
  Parameters
@@ -496,6 +550,10 @@ class Export(object):
496
550
  override: bool
497
551
  If set to `True`, an existing file ``path`` will be overridden.
498
552
  If set to `False`, raises `OSError` if ``path`` exists.
553
+ progress_callback: callable
554
+ Function that takes at least two arguments: float between 0 and
555
+ 1 for monitoring progress and a string describing what is being
556
+ done.
499
557
  """
500
558
  if meta_data is None:
501
559
  meta_data = {}
@@ -516,6 +574,10 @@ class Export(object):
516
574
  if c not in ds.features_scalar:
517
575
  raise ValueError("Invalid feature name {}".format(c))
518
576
  meta_data["dclab version"] = version
577
+
578
+ if progress_callback is not None:
579
+ progress_callback(0.0, "writing metadata")
580
+
519
581
  # Write BOM header
520
582
  with path.open("wb") as fd:
521
583
  fd.write(codecs.BOM_UTF8)
@@ -539,17 +601,26 @@ class Export(object):
539
601
  fd.write("# "+header2+"\n")
540
602
 
541
603
  with path.open("ab") as fd:
542
- # write data
604
+ if progress_callback is not None:
605
+ progress_callback(0.1, "collecting data")
606
+
607
+ # collect data
543
608
  if filtered:
544
609
  data = [ds[c][ds.filter.all] for c in features]
545
610
  else:
546
611
  data = [ds[c] for c in features]
547
612
 
613
+ if progress_callback is not None:
614
+ progress_callback(0.5, "writing data")
615
+
548
616
  np.savetxt(fd,
549
617
  np.array(data).transpose(),
550
618
  fmt=str("%.10e"),
551
619
  delimiter="\t")
552
620
 
621
+ if progress_callback is not None:
622
+ progress_callback(1.0, "export complete")
623
+
553
624
 
554
625
  def yield_filtered_array_stacks(data, indices):
555
626
  """Generator returning chunks with the filtered feature data
@@ -12,7 +12,7 @@ class DCORAccessError(BaseException):
12
12
  class APIHandler:
13
13
  """Handles the DCOR api with caching for simple queries"""
14
14
  #: these are cached to minimize network usage
15
- cache_queries = ["metadata", "size", "feature_list", "valid"]
15
+ cache_queries = ["basins", "metadata", "size", "feature_list", "valid"]
16
16
  #: DCOR API Keys/Tokens in the current session
17
17
  api_keys = []
18
18
 
@@ -42,6 +42,27 @@ S3_ACCESS_KEY_ID = os.environ.get("DCLAB_S3_ACCESS_KEY_ID")
42
42
  S3_SECRET_ACCESS_KEY = os.environ.get("DCLAB_S3_SECRET_ACCESS_KEY")
43
43
 
44
44
 
45
+ @functools.lru_cache(maxsize=1000)
46
+ def get_s3_session_client(access_key_id: str,
47
+ secret_access_key: str,
48
+ use_ssl: bool,
49
+ verify_ssl: bool,
50
+ endpoint_url: str
51
+ ):
52
+ botocore_session = botocore.session.get_session()
53
+ s3_session = boto3.Session(
54
+ aws_access_key_id=access_key_id,
55
+ aws_secret_access_key=secret_access_key,
56
+ botocore_session=botocore_session)
57
+ s3_client = s3_session.client(
58
+ service_name='s3',
59
+ use_ssl=use_ssl,
60
+ verify=verify_ssl,
61
+ endpoint_url=endpoint_url,
62
+ )
63
+ return botocore_session, s3_session, s3_client
64
+
65
+
45
66
  class S3File(HTTPFile):
46
67
  """Monkeypatched `HTTPFile` to support authenticated access to S3"""
47
68
  def __init__(self,
@@ -74,17 +95,15 @@ class S3File(HTTPFile):
74
95
  "not specify the full S3 URL or that you forgot to set "
75
96
  "the `S3_ENDPOINT_URL` environment variable.")
76
97
  endpoint_url = endpoint_url.strip().rstrip("/")
77
- self.botocore_session = botocore.session.get_session()
78
- self.s3_session = boto3.Session(
79
- aws_access_key_id=access_key_id,
80
- aws_secret_access_key=secret_access_key,
81
- botocore_session=self.botocore_session)
82
- self.s3_client = self.s3_session.client(
83
- service_name='s3',
84
- use_ssl=use_ssl,
85
- verify=verify_ssl,
86
- endpoint_url=endpoint_url,
98
+ self.botocore_session, self.s3_session, self.s3_client = \
99
+ get_s3_session_client(
100
+ access_key_id=access_key_id,
101
+ secret_access_key=secret_access_key,
102
+ use_ssl=use_ssl,
103
+ verify_ssl=verify_ssl,
104
+ endpoint_url=endpoint_url,
87
105
  )
106
+
88
107
  # Use a configuration that allows anonymous access
89
108
  # https://stackoverflow.com/a/34866092
90
109
  if not secret_access_key:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dclab
3
- Version: 0.62.17
3
+ Version: 0.63.1
4
4
  Summary: Library for real-time deformability cytometry (RT-DC)
5
5
  Author: Benedikt Hartmann, Eoghan O'Connell, Maik Herbig, Maximilian Schlögel, Nadia Sbaa, Paul Müller, Philipp Rosendahl, Raghava Alajangi
6
6
  Maintainer-email: Paul Müller <dev@craban.de>
@@ -1,5 +1,5 @@
1
1
  dclab/kde_methods.py,sha256=f0-zDN7ETintvGB3gSzxwgBb53YtT9jZtzI70EAX50g,365
2
- dclab/_version.py,sha256=GEa7QH3NrBgvyLi3LNdBdNGUvveY9cblWLa2mkR4bCI,515
2
+ dclab/_version.py,sha256=qDZMrEPFSKYNbMiOoBOEXqq2P0z4X69tZSzimIIP7H0,513
3
3
  dclab/util.py,sha256=HFT5ZQV6AW8GIIruVMldukbVVdlMyKH50GUfOogAcxI,5860
4
4
  dclab/downsampling.pyx,sha256=OK7zbgGLl5gVyoU8ZBHo9EWwb8C9ChavmLNEvQvC9T0,7258
5
5
  dclab/__init__.py,sha256=wyJWhElQRPcq09vUqUnuquTU_KHgHxv6wQxuxQ988Iw,1583
@@ -7,7 +7,7 @@ dclab/warn.py,sha256=MjJvyQeuvIXFQ2-fHDzbmXJ0scnHqqRJlIxfuLI_utE,523
7
7
  dclab/cached.py,sha256=eWTYBiI-HQM7JuPH-oxa5LLnhAX32GpRwlYg2kQ3sTA,2917
8
8
  dclab/http_utils.py,sha256=YtZHEwB-BBBo2fCvwhlJvlnWvfWFMHclqol3OIJ7atM,10910
9
9
  dclab/polygon_filter.py,sha256=qexmo-rXe06CUPZhN6EMJy4y4B5gXZeqejdvIB2arOE,13480
10
- dclab/downsampling.cpython-313-darwin.so,sha256=B4q14jsN0fa_JvcAndaBk_G3WgjwC0FP01VH0KjNrPQ,258720
10
+ dclab/downsampling.cpython-313-darwin.so,sha256=dsZFUONlPg1TA2v6HEKX6y3bccBCL9NUUFL6mA7rDZQ,258720
11
11
  dclab/statistics.py,sha256=tJDqPlY_Jw2Hhl-s7ugMBSZAxcRuPu4LQuBAZBXz7t8,6355
12
12
  dclab/kde_contours.py,sha256=UlU64lrzMQUZH11oZndW7xf7NFCzwP3FcVujwuqXDCI,278
13
13
  dclab/isoelastics/iso_LE-2D-FEM-19-volume-deform.txt,sha256=vTcazOlOXo3BQ0NQtGB_IdHKA0neOLXZ_d3JuMU--RE,83358
@@ -66,16 +66,16 @@ dclab/external/statsmodels/nonparametric/__init__.py,sha256=-GEWgwsF27ems5WTBvR1
66
66
  dclab/external/statsmodels/nonparametric/kernels.py,sha256=fuy4kStFz2ZA9pqgfUb4cly-YBpXLu4TJ9-ZujayuIw,1075
67
67
  dclab/external/skimage/measure.py,sha256=y1idCqD9TUxp3-QnOiWR_d674OKaeqBJ4MN2-gVP6ro,247
68
68
  dclab/external/skimage/LICENSE,sha256=ivsSBvn3c0R9mOctWRRdza7C7wdZSRYgCVxlVqUdlB8,1452
69
- dclab/external/skimage/_find_contours_cy.cpython-313-darwin.so,sha256=9dNAVtMe-yEzJqHNAcUa3YB-XNlvN1RV3T5q43PiIck,204096
69
+ dclab/external/skimage/_find_contours_cy.cpython-313-darwin.so,sha256=aIxiN0VgjnFiuK48hs0ntPfdzUR2MS1X8cRN7kOH2yg,204096
70
70
  dclab/external/skimage/pnpoly.py,sha256=r8hFNiTz5XlUoNZjosqA0iyv1FPn0l7ewbplgFgkdaw,1347
71
71
  dclab/external/skimage/_find_contours.py,sha256=16v5eeTZBmevG8SSuXtJ6yUpVPhwfSmtc8pDD0nuuOU,9340
72
- dclab/external/skimage/_pnpoly.cpython-313-darwin.so,sha256=4JtzvHdTSCniVqN0ra0ooKH2RxlHQNjn48JEUyWVJyc,205960
72
+ dclab/external/skimage/_pnpoly.cpython-313-darwin.so,sha256=u-dwNKwrbRzA3k6AialvCvVSeFmNH_d0aB_y0O7-8Pg,205960
73
73
  dclab/external/skimage/__init__.py,sha256=-B2QUKHAFzQuBWuuKvPDC5JIl0Zb-x3OGmbwPaE9VwQ,72
74
74
  dclab/external/skimage/_pnpoly.pyx,sha256=Qdn6xPazDschBqbr46DzB75MB2MnqvdnoTSBMK7kUGE,2504
75
75
  dclab/external/skimage/_find_contours_cy.pyx,sha256=pZJOBhMHzYEMkcz4WQVyjn7jDNrdjCfet47FU1hRAxk,7161
76
76
  dclab/external/skimage/_shared/geometry.pxd,sha256=kRsu9ifv_rL3kbRIgSLf86p0hn2oTMp6s013lZ9bBZM,346
77
77
  dclab/external/skimage/_shared/__init__.py,sha256=2sHZwTtJSlMTa3Q2YSvQW7jrPLMUSqDJQa-ROe5zfcw,37
78
- dclab/external/skimage/_shared/geometry.cpython-313-darwin.so,sha256=k4REBBCIbh2pjE7OAgQxMQOaQvOua2KHa0g4yTb7v8Q,38656
78
+ dclab/external/skimage/_shared/geometry.cpython-313-darwin.so,sha256=xK656WCujc4Rzy8YaKF25C1RN1PoNvmYyzzLnJenYM0,38656
79
79
  dclab/external/skimage/_shared/geometry.pyx,sha256=miCHUh6mBDbRRIoaF_0xAER1MRzsCAzFdlYQZhV7RmE,1667
80
80
  dclab/definitions/feat_logic.py,sha256=SXsSlAusgtE3uXcPu84dQwYZ07zxmV37DmPednA3_dM,5823
81
81
  dclab/definitions/meta_parse.py,sha256=YdaTdM8DAMsIFn5ITH9OHYGTXeAOBGWtx22oVjxXcWk,2393
@@ -87,11 +87,11 @@ dclab/rtdc_dataset/config.py,sha256=MvBteFya3R6Ch3U6UgTakCsJoBgVykTxS_Z25STWPHU,
87
87
  dclab/rtdc_dataset/check.py,sha256=lJNaz4QTe2WNlxik6zSohRHTiAYuP_bKOzSDjPGTUS0,35006
88
88
  dclab/rtdc_dataset/meta_table.py,sha256=ucqBNrgI6rDAuQFuMRckY8lp1LpnYAoRgEsLObWTJCE,648
89
89
  dclab/rtdc_dataset/feat_basin.py,sha256=ViKdvJcwFM8joysnrBYdZbA5t_wZix-6xn_FsvzpYsQ,21072
90
- dclab/rtdc_dataset/fmt_s3.py,sha256=FVw0q3CwiPwDKmz37EsjK2T5CLr4MsH3pvscu-gToVM,11278
90
+ dclab/rtdc_dataset/fmt_s3.py,sha256=bU3V_WGyqJhxPCH80X_nlNqq-jXcgoZKv_aUBIqwaL8,11877
91
91
  dclab/rtdc_dataset/feat_temp.py,sha256=XbDIS1iUUkRH0Zp9uVlwvK_untJ7hkOnKshK1Drsnt8,3694
92
92
  dclab/rtdc_dataset/__init__.py,sha256=MUHSGVQJ4Zc0IyU2lf01dpDWyOyNveHip-UjSkmPNvQ,486
93
93
  dclab/rtdc_dataset/core.py,sha256=EjNWk9SV-2xBTRtf34XosLCOS164vGWKP5dKKLSOSq4,34441
94
- dclab/rtdc_dataset/export.py,sha256=RPnWNDAPW1m3vPcStjqIX-YnxDOKyWLtQ1HrA38S3Uo,30384
94
+ dclab/rtdc_dataset/export.py,sha256=NarfazGkPasyRpnhQ2H_riUP-oUq5QL7lG9WwvLCL2o,33121
95
95
  dclab/rtdc_dataset/fmt_dict.py,sha256=gumVQOiVVDFUKow_483PY7cxInqo-NiBBnBhIU8s4lg,3009
96
96
  dclab/rtdc_dataset/writer.py,sha256=jc6ADyxGoujXpoXu1vF2nfZjGFMaO5LbRmoYJZ83JVo,41418
97
97
  dclab/rtdc_dataset/filter.py,sha256=AFPUBzOIi3pqXgUdMQ5CIi9ZeGOKC71rfSZKLMLgtog,10023
@@ -123,7 +123,7 @@ dclab/rtdc_dataset/feat_anc_ml/__init__.py,sha256=99jZlz17aBCAxI5xx42XINomMy20Hi
123
123
  dclab/rtdc_dataset/fmt_dcor/access_token.py,sha256=jotLQay138RUlv8wbdF2ishRnyE9N0KwGGBlbCL0wRI,2028
124
124
  dclab/rtdc_dataset/fmt_dcor/basin.py,sha256=tQZ4GumqURjS3eppRrSyUq1zBPD0y_8rwznMRDXiDUs,2526
125
125
  dclab/rtdc_dataset/fmt_dcor/__init__.py,sha256=WjO1uM_Vlof15Y7HkhkV5Xv75q9TDIdOBIuS_I38qps,210
126
- dclab/rtdc_dataset/fmt_dcor/api.py,sha256=COPRnPfPBcxbQGxHFEbGxp2CjK-Mgnt3cIu20-Zz04M,4245
126
+ dclab/rtdc_dataset/fmt_dcor/api.py,sha256=GfQdKhkGXN-e9-e5YxgzL81tDeWB2M-UoyouVfXXbVg,4255
127
127
  dclab/rtdc_dataset/fmt_dcor/logs.py,sha256=1JsMr_4r5j8rkfrrUsiN42_l92GcvDjapYxopZKimnw,583
128
128
  dclab/rtdc_dataset/fmt_dcor/tables.py,sha256=NaVEwLKmOg7Mz5iAMe2S8C4xRVC_YO3zeT7g5EbQE1M,1682
129
129
  dclab/rtdc_dataset/fmt_dcor/base.py,sha256=wD127W5LvvhkUy8SvFVVwAR6EEYtzgoWJ4booh45rfA,6588
@@ -134,9 +134,9 @@ dclab/rtdc_dataset/fmt_tdms/event_image.py,sha256=-jp7Z-N91e4ieumYQ1huMicj7PMJqw
134
134
  dclab/rtdc_dataset/fmt_tdms/event_trace.py,sha256=Vkym0QKSw2mq1XZl5n8wDkgHXmaZwQGiMAV5AuRSJkE,5215
135
135
  dclab/rtdc_dataset/fmt_tdms/exc.py,sha256=WzrMqnyrzp8gsT8Pf7JKqGGv43ewx7d_qgtirURppRI,813
136
136
  dclab/rtdc_dataset/fmt_tdms/event_contour.py,sha256=kjo0wJx9F0gmmOOyR0NoLw6VEtSl3h63WXXkcbfnoS8,9627
137
- dclab-0.62.17.dist-info/RECORD,,
138
- dclab-0.62.17.dist-info/WHEEL,sha256=D5oYZcu7xsHPQ1lvRcEfimRZkYr_RmvD7J5S2QmS8s0,138
139
- dclab-0.62.17.dist-info/entry_points.txt,sha256=eOpjgznu-eW-9utUpLU-77O5098YyUEgGF3ksGMdtec,273
140
- dclab-0.62.17.dist-info/top_level.txt,sha256=irvwZMgs1edY1Zj60ZFk7Almb9Zhk4k6E6aC4YPFnnM,6
141
- dclab-0.62.17.dist-info/METADATA,sha256=sxoMpN4ygAI9x12l_IsEKUqi32wGJ3o2Tg2OKEx8cKQ,4756
142
- dclab-0.62.17.dist-info/licenses/LICENSE,sha256=gLDaVZWRrlnLdyfOrR0qfWjLbOVcjvoJ-kCLUK0fyXA,15360
137
+ dclab-0.63.1.dist-info/RECORD,,
138
+ dclab-0.63.1.dist-info/WHEEL,sha256=0zT6bEe6ExT6o7m_6mGvkzRfdTnnYpeEzXPUtdm-wYw,138
139
+ dclab-0.63.1.dist-info/entry_points.txt,sha256=eOpjgznu-eW-9utUpLU-77O5098YyUEgGF3ksGMdtec,273
140
+ dclab-0.63.1.dist-info/top_level.txt,sha256=irvwZMgs1edY1Zj60ZFk7Almb9Zhk4k6E6aC4YPFnnM,6
141
+ dclab-0.63.1.dist-info/METADATA,sha256=kaDiBVjVDUqc77B4nSoNNQhk-IE6Rfb7WI9yAV1UABM,4755
142
+ dclab-0.63.1.dist-info/licenses/LICENSE,sha256=gLDaVZWRrlnLdyfOrR0qfWjLbOVcjvoJ-kCLUK0fyXA,15360
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (78.1.0)
2
+ Generator: setuptools (80.3.1)
3
3
  Root-Is-Purelib: false
4
4
  Tag: cp313-cp313-macosx_10_13_x86_64
5
5
  Generator: delocate 0.13.0