nabu 2024.1.0rc4__py3-none-any.whl → 2024.1.2__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.
nabu/__init__.py CHANGED
@@ -1,4 +1,4 @@
1
- __version__ = "2024.1.0-rc4"
1
+ __version__ = "2024.1.2"
2
2
  __nabu_modules__ = [
3
3
  "app",
4
4
  "cuda",
nabu/app/cast_volume.py CHANGED
@@ -228,11 +228,20 @@ def main(argv=None):
228
228
 
229
229
  # get rescale_min_percentile and rescale_min_percentile
230
230
  rescale_min_percentile = options.rescale_min_percentile
231
+
232
+ def clean_percentiles_str(percentile):
233
+ # remove ' char
234
+ percentile = percentile.rstrip("'").lstrip("'")
235
+ # remove " char
236
+ percentile = percentile.rstrip('"').lstrip('"')
237
+ # remove % char
238
+ return percentile.rstrip("%")
239
+
231
240
  if isinstance(rescale_min_percentile, str):
232
- rescale_min_percentile = float(rescale_min_percentile.rstrip("%"))
241
+ rescale_min_percentile = float(clean_percentiles_str(rescale_min_percentile))
233
242
  rescale_max_percentile = options.rescale_max_percentile
234
243
  if isinstance(rescale_min_percentile, str):
235
- rescale_max_percentile = float(rescale_max_percentile.rstrip("%"))
244
+ rescale_max_percentile = float(clean_percentiles_str(rescale_max_percentile))
236
245
  assert rescale_min_percentile is not None, "rescale_min_percentile should be an int"
237
246
  assert rescale_max_percentile is not None, "rescale_max_percentile should be an int"
238
247
 
nabu/app/multicor.py CHANGED
@@ -60,12 +60,12 @@ def main():
60
60
  cors = get_user_cors(args["cor"])
61
61
 
62
62
  all_recs = []
63
+ rec_instance = pipeline.reconstruction
63
64
 
64
65
  for cor in cors:
65
66
  # Re-configure with new CoR
66
67
  pipeline.processing_options["reconstruction"]["rotation_axis_position"] = cor
67
68
  pipeline.processing_options["save"]["file_prefix"] = file_prefix + "_%.03f" % cor
68
- pipeline.reconstruction.reset_rot_center(cor)
69
69
  pipeline._init_writer(create_subfolder=False, single_output_file_initialized=False)
70
70
 
71
71
  # Get sinogram into contiguous array
@@ -73,8 +73,30 @@ def main():
73
73
  # For now: transfer to host... not optimal
74
74
  sino = pipeline._d_radios[:, pipeline._d_radios.shape[1] // 2, :].get() # pylint: disable=E1136
75
75
 
76
+ if pipeline.process_config.do_halftomo:
77
+ # re-initialize FBP object, because in half-tomography the output slice size is a function of CoR
78
+ options = pipeline.processing_options["reconstruction"]
79
+ rec_instance = pipeline.FBPClass(
80
+ sino.shape,
81
+ angles=options["angles"],
82
+ rot_center=cor,
83
+ filter_name=options["fbp_filter_type"] or "none",
84
+ halftomo=options["enable_halftomo"],
85
+ # slice_roi=self.process_config.rec_roi,
86
+ padding_mode=options["padding_type"],
87
+ extra_options={
88
+ "scale_factor": 1.0 / options["voxel_size_cm"][0],
89
+ "axis_correction": options["axis_correction"],
90
+ "centered_axis": options["centered_axis"],
91
+ "clip_outer_circle": options["clip_outer_circle"],
92
+ "filter_cutoff": options["fbp_filter_cutoff"],
93
+ },
94
+ )
95
+ else:
96
+ pipeline.reconstruction.reset_rot_center(cor)
97
+
76
98
  # Run reconstruction
77
- rec = pipeline.reconstruction.fbp(sino)
99
+ rec = rec_instance.fbp(sino)
78
100
  # if return_all_recs:
79
101
  # all_recs.append(rec)
80
102
  rec_3D = view_as_images_stack(rec) # writer wants 3D data
nabu/io/cast_volume.py CHANGED
@@ -74,7 +74,7 @@ def get_default_output_volume(
74
74
  volume_basename=input_volume.get_volume_basename(),
75
75
  )
76
76
  else:
77
- raise NotImplementedError
77
+ raise NotImplementedError(f"output volume format {output_type} is not handled")
78
78
  elif isinstance(input_volume, (HDF5Volume, MultiTIFFVolume)):
79
79
  if output_type == "hdf5":
80
80
  data_file_parent_path, data_file_name = os.path.split(input_volume.data_url.file_path())
@@ -121,9 +121,9 @@ def get_default_output_volume(
121
121
  )
122
122
  )
123
123
  else:
124
- raise NotImplementedError
124
+ raise NotImplementedError(f"output volume format {output_type} is not handled")
125
125
  else:
126
- raise NotImplementedError
126
+ raise NotImplementedError(f"input volume format {input_volume} is not handled")
127
127
 
128
128
 
129
129
  def cast_volume(
@@ -167,6 +167,12 @@ def cast_volume(
167
167
  if not isinstance(output_volume, VolumeBase):
168
168
  raise TypeError(f"output_volume is expected to be a {VolumeBase}. {type(output_volume)} provided")
169
169
 
170
+ try:
171
+ output_data_type = numpy.dtype(
172
+ output_data_type
173
+ ) # User friendly API in case user provides np.uint16 e.g. (see issue #482)
174
+ except Exception:
175
+ pass
170
176
  if not isinstance(output_data_type, numpy.dtype):
171
177
  raise TypeError(f"output_data_type is expected to be a {numpy.dtype}. {type(output_data_type)} provided")
172
178
 
@@ -326,7 +332,7 @@ def find_histogram(volume: VolumeBase, scan: Optional[TomoScanBase] = None) -> O
326
332
  )
327
333
 
328
334
 
329
- def _get_hst_saturations(hist, bins, rescale_min_percentile, rescale_max_percentile):
335
+ def _get_hst_saturations(hist, bins, rescale_min_percentile: numpy.float32, rescale_max_percentile: numpy.float32):
330
336
  hist_cum = numpy.cumsum(hist)
331
337
  bin_index_min = numpy.searchsorted(hist_cum, numpy.percentile(hist_cum, rescale_min_percentile))
332
338
  bin_index_max = numpy.searchsorted(hist_cum, numpy.percentile(hist_cum, rescale_max_percentile))
@@ -360,4 +366,6 @@ def _min_max_from_histo(url: DataUrl, rescale_min_percentile: int, rescale_max_p
360
366
  else:
361
367
  bins = histogram[1]
362
368
  hist = histogram[0]
363
- return _get_hst_saturations(hist, bins, rescale_min_percentile, rescale_max_percentile)
369
+ return _get_hst_saturations(
370
+ hist, bins, numpy.float32(rescale_min_percentile), numpy.float32(rescale_max_percentile)
371
+ )
nabu/io/utils.py CHANGED
@@ -201,7 +201,7 @@ class EntryReader(_BaseReader):
201
201
  """Context manager used to read a bliss node"""
202
202
 
203
203
  def __enter__(self):
204
- self._file_handler = HDF5File(filename=self._url.file_path(), mode="r")
204
+ self._file_handler = HDF5File(self._url.file_path(), mode="r")
205
205
  if self._url.data_path() == "":
206
206
  entry = self._file_handler
207
207
  else:
@@ -215,7 +215,7 @@ class DatasetReader(_BaseReader):
215
215
  """Context manager used to read a bliss node"""
216
216
 
217
217
  def __enter__(self):
218
- self._file_handler = HDF5File(filename=self._url.file_path(), mode="r")
218
+ self._file_handler = HDF5File(self._url.file_path(), mode="r")
219
219
  entry = self._file_handler[self._url.data_path()]
220
220
  if not isinstance(entry, h5py.Dataset):
221
221
  raise ValueError("Data path ({}) should point to a dataset (h5py.Dataset)".format(self._url.path()))
nabu/stitching/config.py CHANGED
@@ -710,12 +710,12 @@ class StitchingConfiguration:
710
710
  "type": "optional",
711
711
  },
712
712
  SLURM_PREPROCESSING_COMMAND: {
713
- "default": "'/scisoft/tomotools_env/activate.sh stable'",
713
+ "default": "",
714
714
  "help": "python virtual environment to use",
715
715
  "type": "optional",
716
716
  },
717
717
  SLURM_MODULES_TO_LOADS: {
718
- "default": "",
718
+ "default": "tomotools/stable",
719
719
  "help": "module to load",
720
720
  "type": "optional",
721
721
  },
@@ -726,7 +726,6 @@ def test_get_overlap_areas():
726
726
 
727
727
  def test_frame_flip(tmp_path):
728
728
  """check it with some NXtomo fliped"""
729
- pytest.skip(reason="Broken test")
730
729
  ref_frame_width = 280
731
730
  n_proj = 10
732
731
  raw_frame_width = 100
@@ -1223,7 +1223,9 @@ class PreProcessZStitcher(ZStitcher):
1223
1223
 
1224
1224
  # first save the NXtomo entry without the frame
1225
1225
  # dicttonx will fail if the folder does not exists
1226
- os.makedirs(os.path.dirname(self.configuration.output_file_path), exist_ok=True)
1226
+ dir_name = os.path.dirname(self.configuration.output_file_path)
1227
+ if dir_name not in (None, ""):
1228
+ os.makedirs(dir_name, exist_ok=True)
1227
1229
  nx_tomo.save(
1228
1230
  file_path=self.configuration.output_file_path,
1229
1231
  data_path=self.configuration.output_data_path,
@@ -1256,7 +1258,7 @@ class PreProcessZStitcher(ZStitcher):
1256
1258
 
1257
1259
  output_dtype = get_output_data_type()
1258
1260
  # append frames ("instrument/detactor/data" dataset)
1259
- with HDF5File(filename=self.configuration.output_file_path, mode="a") as h5f:
1261
+ with HDF5File(self.configuration.output_file_path, mode="a") as h5f:
1260
1262
  # note: nx_tomo.save already handles the possible overwrite conflict by removing
1261
1263
  # self.configuration.output_file_path or raising an error
1262
1264
 
@@ -1832,7 +1834,7 @@ class PostProcessZStitcher(ZStitcher):
1832
1834
  def __enter__(self):
1833
1835
  # handle the specific case of HDF5. Goal: avoid getting the full stitched volume in memory
1834
1836
  if isinstance(self._volume, HDF5Volume):
1835
- self.__file_handler = HDF5File(filename=self._volume.data_url.file_path(), mode="a")
1837
+ self.__file_handler = HDF5File(self._volume.data_url.file_path(), mode="a")
1836
1838
  # if need to delete an existing dataset
1837
1839
  if self._volume.overwrite and self._volume.data_path in self.__file_handler:
1838
1840
  try:
@@ -1900,7 +1902,7 @@ class PostProcessZStitcher(ZStitcher):
1900
1902
  if volume.data is not None:
1901
1903
  data = volume.data
1902
1904
  elif isinstance(volume, HDF5Volume):
1903
- file_handler = HDF5File(filename=volume.data_url.file_path(), mode="r")
1905
+ file_handler = HDF5File(volume.data_url.file_path(), mode="r")
1904
1906
  dataset = file_handler[volume.data_url.data_path()]
1905
1907
  data = dataset
1906
1908
  self.__file_handlers.append(file_handler)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: nabu
3
- Version: 2024.1.0rc4
3
+ Version: 2024.1.2
4
4
  Summary: Nabu - Tomography software
5
5
  Author-email: Pierre Paleo <pierre.paleo@esrf.fr>, Henri Payno <henri.payno@esrf.fr>, Alessandro Mirone <mirone@esrf.fr>, Jérôme Lesaint <jerome.lesaint@esrf.fr>
6
6
  Maintainer-email: Pierre Paleo <pierre.paleo@esrf.fr>
@@ -53,7 +53,7 @@ Requires-Dist: numpy >1.9.0
53
53
  Requires-Dist: scipy
54
54
  Requires-Dist: h5py >=3.0
55
55
  Requires-Dist: silx >=0.15.0
56
- Requires-Dist: tomoscan >=2.0.0a7
56
+ Requires-Dist: tomoscan >=2.0.4
57
57
  Requires-Dist: psutil
58
58
  Requires-Dist: pytest
59
59
  Requires-Dist: tifffile
@@ -1,14 +1,14 @@
1
1
  doc/conf.py,sha256=3xtCarCHrXPr50GbeRDuH-o3Jzojw7mpr7vpGfZPLAE,3787
2
2
  doc/create_conf_doc.py,sha256=IVOdP70KvbW9WS_UQu3Iyd0YfS60E2fJ5IDtQ_s4cDw,1143
3
3
  doc/get_mathjax.py,sha256=VIvKRCdDuF2VoY8JD3mSey9XX13AZMmwTJBHdt1tUs4,1012
4
- nabu/__init__.py,sha256=VaZQ2L3-u3o0BhoSKKPN1P8e_Eo3k46aSuDjgmxLFcc,274
4
+ nabu/__init__.py,sha256=ZAej-8X8A_uoviFokuukhi8jyzI2YRAj0-zkdCR3LaI,270
5
5
  nabu/tests.py,sha256=cew9OY2uTyncHI_HM32W8CP6B1GTGKaOW65XtMEqs7o,1417
6
6
  nabu/testutils.py,sha256=qqtGgkIhpOpXhgeoXlqCb91Rx-JlI4ALaDF6nt8YRRk,13298
7
7
  nabu/utils.py,sha256=1OKKhQ6-t7OOwTLQkTJuK5Hk9lb7hkEZrDtTdcmvD4c,24164
8
8
  nabu/app/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
9
  nabu/app/bootstrap.py,sha256=UQZzCBKtSXtQp5U0aXtlUhbjbwzgILTI4zD4zVffhBI,3246
10
10
  nabu/app/bootstrap_stitching.py,sha256=Inr0_zRAtyeMTK1BKxGqoDf-Na0O33CICmQJYja06ug,2148
11
- nabu/app/cast_volume.py,sha256=60mSXKivRMbK1TA8gsQROX2gmzCunCZG4TVP15t96yA,10928
11
+ nabu/app/cast_volume.py,sha256=oObZVX-UbhsQ-JbNqpG1SdOSeJwIBrALYsJ9PubPWXc,11217
12
12
  nabu/app/cli_configs.py,sha256=FBh9bG80oY0fwfOntmgqgumS5i120_r60tCsj_mcdvE,22109
13
13
  nabu/app/compare_volumes.py,sha256=Mu5O4uP-ANo-el-fE5PLvEq42BTk5FkrscaFRyQZdis,3341
14
14
  nabu/app/composite_cor.py,sha256=N0Q7dxak7GktcuwxtwQ0PdZcmCS5CboChlxa2UCLMIA,5132
@@ -19,7 +19,7 @@ nabu/app/diag_to_rot.py,sha256=86lqINSN4SoQ0Eqf0fGYCw-eAhBHm8ds7TDWtLNE6Cg,17111
19
19
  nabu/app/double_flatfield.py,sha256=zm9oHWR_QgAV2B3SeNWwgxpJtBsnnWUW4O2lCn5Hjbc,5450
20
20
  nabu/app/generate_header.py,sha256=Voo-FAvwS_mU5gtDxyqpZnSpP_mlMSfd_6bEtgdi_tg,8919
21
21
  nabu/app/histogram.py,sha256=gyLXKwFrU5WPQMkM1k8OdpIXSwGEEKC-f8RcTHKOho4,7930
22
- nabu/app/multicor.py,sha256=7Y-V6IH0L9BBoPa1pW9hbY3CsBvJtABgwRQSwd5dMD8,2996
22
+ nabu/app/multicor.py,sha256=h2ykS6Vg3S88E_pZOQu_s7F1VYGv-q7k1nfqxf2IdOM,4055
23
23
  nabu/app/nx_z_splitter.py,sha256=p54jR-PAAw-AkGolM9fZE5lM2vbNLspCNCy5zBnJNP4,4976
24
24
  nabu/app/parse_reconstruction_log.py,sha256=9eiJftCkyNvtZmTDjeOuKgu3a9Fe4KzJcfcI_ZdDlUM,4586
25
25
  nabu/app/prepare_weights_double.py,sha256=5TkhTwNbvgeG8jlDLCwlkeOV_YMINySwdpmjaTM6pbk,5495
@@ -76,12 +76,12 @@ nabu/estimation/tests/test_focus.py,sha256=deaVGbIFSzHDAReoeAy-1HLsnKWpJQsC2SL9W
76
76
  nabu/estimation/tests/test_tilt.py,sha256=PN4tnV3-XU2nNA608kQShaHugWn_-wbHzWCTnLIaCTk,1658
77
77
  nabu/estimation/tests/test_translation.py,sha256=RkOnCYgk9DZGKlIka1snqTv4wbIz_nG7-EHAxnBHsJU,2999
78
78
  nabu/io/__init__.py,sha256=Mx0HRIENk0dJbN3b9tzPZhiOnPMxBItgVNQn_QLLrlI,176
79
- nabu/io/cast_volume.py,sha256=KhwS8RKl17s39hJSSHnKVMIDMikVWYPYTomvQJgKBP8,15196
79
+ nabu/io/cast_volume.py,sha256=k2EjcWwEjR30VAqm6XK_5ofoJXlAYtf4B2hCafnCVx4,15638
80
80
  nabu/io/detector_distortion.py,sha256=Or4icugi0fGRKWIG0I9hCuR1UZA5Cel25ZGY7cR2j4I,11744
81
81
  nabu/io/reader.py,sha256=1DlUYObfOBEGYJHEqyw1Mb2uQ_b_Z7-FFqMWS-4tIB0,23083
82
82
  nabu/io/reader_helical.py,sha256=_6vZBH-US_VT7oOGJUtYXqPwFws7xZKcmdOthpwvlIQ,4477
83
83
  nabu/io/tiffwriter_zmm.py,sha256=ykaSFqdbYhGNxdBrJRT_rxihx5wj9G8qMQMI1e07fNk,3838
84
- nabu/io/utils.py,sha256=EcaAdjD09h_6dbVX2Bl3xGhK83hXBslixcJ4zn5kfLM,9241
84
+ nabu/io/utils.py,sha256=pFRULSlmGzJnzBbeSNKRhnKbBPbV0XaeUsxnWmnMtR4,9223
85
85
  nabu/io/writer.py,sha256=cWKY7RcNUztOs1ktzLP2G087fLvq4yNMNdvvBdnoOSk,31417
86
86
  nabu/io/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
87
87
  nabu/io/tests/test_cast_volume.py,sha256=3zd_aGhMeMPkjg1I3Kq4oKltxwVloizXKgaDV8g_F7Q,10391
@@ -265,14 +265,14 @@ nabu/resources/tests/test_nxflatfield.py,sha256=wLcBYpeD1UHGbimRrisGzgS9oVnQ8nNz
265
265
  nabu/resources/tests/test_units.py,sha256=F2jFTck-1UwYET1MwTtX6ntzYUosfwOJkugSencGgz8,2155
266
266
  nabu/stitching/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
267
267
  nabu/stitching/alignment.py,sha256=MSj-6npGfUnD3C5R5rqKwTogVRUDPmJuEZkPG9hMiUY,6752
268
- nabu/stitching/config.py,sha256=sFGcrs05KA5HH4auIU1gONtM2d2YCAjmibHxdwet_ww,51360
268
+ nabu/stitching/config.py,sha256=t7mkRrkdHKMz0x-lg0f5-IOAO829A6BvKH8WUAuSAps,51333
269
269
  nabu/stitching/definitions.py,sha256=RyqzZY3KLwN4j0SkOFA-T1aicPbO2jBrqfWdz-1djxk,130
270
270
  nabu/stitching/frame_composition.py,sha256=OGM9cLrLfEP5_hvhDbNq_zr2wdMeAuTTNlVqZk-qVBU,5889
271
271
  nabu/stitching/overlap.py,sha256=eXAKsILS5jwqFY62JhDijeNW8H50rP-yjdUUGqjj0aY,15700
272
272
  nabu/stitching/sample_normalization.py,sha256=_radin_wxnuD3MMmZNAOKA__aPa2z3ss4TFbZeocpXc,2069
273
273
  nabu/stitching/slurm_utils.py,sha256=sZ-VQPh_YlJ1Lkh7ap8qxII0rBpZryMyoxE5Xn557t8,8906
274
274
  nabu/stitching/utils.py,sha256=kMn2JEMDhcBQMweSlM0rUd-037H7iNUURTFMhXOTzC8,23651
275
- nabu/stitching/z_stitching.py,sha256=yI0jmmP3y_0VrbzYUBXT9x3F0KIBwNOAuTdQ3nlCdsM,103356
275
+ nabu/stitching/z_stitching.py,sha256=RRrLUDiOrImj1wvun13RkEC9tYL3WvbCNzS66iSKMgg,103400
276
276
  nabu/stitching/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
277
277
  nabu/stitching/tests/test_alignment.py,sha256=MACak1ILOr8nRKeT0mWfMd-ZvhCl3SWjjcp6GjRbITc,2735
278
278
  nabu/stitching/tests/test_config.py,sha256=ttWuVB9Y_MM3_wGdKbcbYi_PG3vN87cL7o5zKsMzn9g,8490
@@ -281,16 +281,16 @@ nabu/stitching/tests/test_overlap.py,sha256=vfZuK32pclWL0Hg8u5NH0JoxKO28qk3ObRMm
281
281
  nabu/stitching/tests/test_sample_normalization.py,sha256=E49E_Quv-Qon6qSuaH9ZBZLqq4TPuBl8RqgB18Rwjc0,1348
282
282
  nabu/stitching/tests/test_slurm_utils.py,sha256=bbhCQd06R3irGB4B9r79KKlf0AlBchI53N2ldsXoAQQ,4950
283
283
  nabu/stitching/tests/test_utils.py,sha256=CjV0vPvXEchJ5vo6o7hGQA-PsOOAyAamuQ6fiHKCQ9M,641
284
- nabu/stitching/tests/test_z_stitching.py,sha256=1bNvNkWDqV4mE5tgHBKqshDnoJtMPzUS2xCkf9qd2XM,42620
284
+ nabu/stitching/tests/test_z_stitching.py,sha256=8gio27FTULOX7bzypmdaAyVwQiO-JOwgBL1e9FwZUN4,42582
285
285
  nabu/thirdparty/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
286
286
  nabu/thirdparty/algotom_convert_sino.py,sha256=iZVRilvyqMyLTu8RKgbqDFUjObWW5X69rCARrnNizuI,13872
287
287
  nabu/thirdparty/pore3d_deringer_munch.py,sha256=o4bisnFc-wMjuohWBT8wgWmfNehPQGtCl6G2NebJlbg,4500
288
288
  nabu/thirdparty/tomocupy_remove_stripe.py,sha256=VgXHr2tzTAAGZix5pwhFfbPxj4tt3yXBcjCPNQSLPAg,22810
289
289
  nabu/thirdparty/tomopy_phase.py,sha256=hK4oPpkogLOhv23XzzEXQY2u3r8fJvASY_bINVs6ERE,8634
290
290
  nabu/thirdparty/tomwer_load_flats_darks.py,sha256=ZNoVAinUb_wGYbfvs_4BVnWsjsQmNxSvCh1bWhR2WWg,5611
291
- nabu-2024.1.0rc4.dist-info/LICENSE,sha256=1eAIPSnEsnSFNUODnLtNtQTs76exG3ZxJ1DJR6zoUBA,1066
292
- nabu-2024.1.0rc4.dist-info/METADATA,sha256=YqG-9EJ_oEis_rU6GzT1c_4TtNLbovDQAloRyPVhlE0,5229
293
- nabu-2024.1.0rc4.dist-info/WHEEL,sha256=5sUXSg9e4bi7lTLOHcm6QEYwO5TIF1TNbTSVFVjcJcc,92
294
- nabu-2024.1.0rc4.dist-info/entry_points.txt,sha256=cJKGkBeykVL7uK3E4R0RLRqMXifTL2qdO573syPAvJc,1288
295
- nabu-2024.1.0rc4.dist-info/top_level.txt,sha256=fsm_N3eXLRZk2QXF9OSKPNDPFXOz8FAQjHh5avT3dok,9
296
- nabu-2024.1.0rc4.dist-info/RECORD,,
291
+ nabu-2024.1.2.dist-info/LICENSE,sha256=1eAIPSnEsnSFNUODnLtNtQTs76exG3ZxJ1DJR6zoUBA,1066
292
+ nabu-2024.1.2.dist-info/METADATA,sha256=SNK5avox9pDHbu-OEbx204ASbhwoMmjSC3e5_9ilMFI,5224
293
+ nabu-2024.1.2.dist-info/WHEEL,sha256=5sUXSg9e4bi7lTLOHcm6QEYwO5TIF1TNbTSVFVjcJcc,92
294
+ nabu-2024.1.2.dist-info/entry_points.txt,sha256=cJKGkBeykVL7uK3E4R0RLRqMXifTL2qdO573syPAvJc,1288
295
+ nabu-2024.1.2.dist-info/top_level.txt,sha256=fsm_N3eXLRZk2QXF9OSKPNDPFXOz8FAQjHh5avT3dok,9
296
+ nabu-2024.1.2.dist-info/RECORD,,