nabu 2024.1.2__py3-none-any.whl → 2024.1.4__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.
doc/doc_config.py ADDED
@@ -0,0 +1,32 @@
1
+ #!/usr/bin/env python
2
+
3
+ from nabu.resources.nabu_config import nabu_config
4
+
5
+
6
+ def generate(file_):
7
+ def write(content):
8
+ print(content, file=file_)
9
+ for section, values in nabu_config.items():
10
+ if section == "about":
11
+ continue
12
+ write("## %s\n" % section)
13
+ for key, val in values.items():
14
+ if val["type"] == "unsupported":
15
+ continue
16
+ write(val["help"] + "\n")
17
+ write(
18
+ "```ini\n%s = %s\n```"
19
+ % (key, val["default"])
20
+ )
21
+
22
+
23
+
24
+ if __name__ == "__main__":
25
+
26
+ import sys, os
27
+ print(os.path.abspath(__file__))
28
+ exit(0)
29
+
30
+ fname = "/tmp/test.md"
31
+ with open(fname, "w") as f:
32
+ generate(f)
nabu/__init__.py CHANGED
@@ -1,4 +1,4 @@
1
- __version__ = "2024.1.2"
1
+ __version__ = "2024.1.4"
2
2
  __nabu_modules__ = [
3
3
  "app",
4
4
  "cuda",
@@ -157,8 +157,9 @@ class DatasetValidatorBase:
157
157
  """
158
158
  dataset_cfg = self.nabu_config["dataset"]
159
159
  self.binning = (dataset_cfg["binning"], dataset_cfg["binning_z"])
160
- subsampling_factor, subsampling_begin = dataset_cfg["projections_subsampling"]
160
+ subsampling_factor, subsampling_start = dataset_cfg["projections_subsampling"]
161
161
  self.subsampling_factor = subsampling_factor or 1
162
+ self.subsampling_start = subsampling_start or 0
162
163
 
163
164
  if self.binning != (1, 1):
164
165
  bin_x, bin_z = self.binning
@@ -83,6 +83,10 @@ class ProcessConfig(ProcessConfigBase):
83
83
  )
84
84
  self.rec_params = self.nabu_config["reconstruction"]
85
85
 
86
+ subsampling_factor, subsampling_start = self.nabu_config["dataset"]["projections_subsampling"]
87
+ self.subsampling_factor = subsampling_factor or 1
88
+ self.subsampling_start = subsampling_start or 0
89
+
86
90
  self._update_dataset_with_user_overwrites()
87
91
  self._get_rotation_axis_position()
88
92
  self._update_rotation_angles()
@@ -118,8 +122,9 @@ class ProcessConfig(ProcessConfigBase):
118
122
  if transl_file is not None and "://" not in transl_file:
119
123
  try:
120
124
  translations = get_values_from_file(
121
- transl_file, shape=(self.dataset_info.n_angles, last_dim), any_size=True
125
+ transl_file, shape=(self.n_angles(subsampling=False), last_dim), any_size=True
122
126
  ).astype(np.float32)
127
+ translations = translations[self.subsampling_start :: self.subsampling_factor]
123
128
  except ValueError:
124
129
  print("Something wrong with translation_movements_file %s" % transl_file)
125
130
  raise
@@ -145,9 +150,10 @@ class ProcessConfig(ProcessConfigBase):
145
150
  try:
146
151
  axis_correction = get_values_from_file(
147
152
  axis_correction_file,
148
- n_values=self.dataset_info.n_angles,
153
+ n_values=self.n_angles(subsampling=False),
149
154
  any_size=True,
150
155
  ).astype(np.float32)
156
+ axis_correction = axis_correction[self.subsampling_start :: self.subsampling_factor]
151
157
  except ValueError:
152
158
  print("Something wrong with axis correction file %s" % axis_correction_file)
153
159
  raise
@@ -225,7 +231,7 @@ class ProcessConfig(ProcessConfigBase):
225
231
  self.logger.debug("Doing coupled validation")
226
232
  self._dataset_validator = FullFieldDatasetValidator(self.nabu_config, self.dataset_info)
227
233
  # Not so ideal to propagate fields like this
228
- for what in ["rec_params", "rec_region", "binning", "subsampling_factor"]:
234
+ for what in ["rec_params", "rec_region", "binning"]:
229
235
  setattr(self, what, getattr(self._dataset_validator, what))
230
236
 
231
237
  #
@@ -255,7 +261,7 @@ class ProcessConfig(ProcessConfigBase):
255
261
  def n_angles(self, subsampling=False):
256
262
  rot_angles = self.dataset_info.rotation_angles
257
263
  if subsampling:
258
- rot_angles = rot_angles[:: (self.subsampling or 1)]
264
+ rot_angles = rot_angles[self.subsampling_start :: self.subsampling_factor]
259
265
  return len(rot_angles)
260
266
 
261
267
  def radios_shape(self, binning=False, subsampling=False):
@@ -300,10 +306,12 @@ class ProcessConfig(ProcessConfigBase):
300
306
  return sorted(self.dataset_info.projections.keys())[::step]
301
307
 
302
308
  def rotation_angles(self, subsampling=False):
309
+ start = 0
303
310
  step = 1
304
311
  if subsampling:
305
- step = self.subsampling or 1
306
- return self.dataset_info.rotation_angles[::step]
312
+ start = self.subsampling_start
313
+ step = self.subsampling_factor
314
+ return self.dataset_info.rotation_angles[start::step]
307
315
 
308
316
  @property
309
317
  def rec_roi(self):
@@ -512,7 +520,7 @@ class ProcessConfig(ProcessConfigBase):
512
520
  translations = dataset_info.translations
513
521
  if translations is not None:
514
522
  tasks.append("radios_movements")
515
- options["radios_movements"] = {"translation_movements": dataset_info.translations[:: self.binning_z]}
523
+ options["radios_movements"] = {"translation_movements": dataset_info.translations}
516
524
  #
517
525
  # Sinogram normalization (before half-tomo)
518
526
  #
@@ -562,7 +570,8 @@ class ProcessConfig(ProcessConfigBase):
562
570
  rec_options["enable_halftomo"] = self.do_halftomo
563
571
  rec_options["axis_correction"] = dataset_info.axis_correction
564
572
  if dataset_info.axis_correction is not None:
565
- rec_options["axis_correction"] = rec_options["axis_correction"][:: self.subsampling_factor]
573
+ rec_options["axis_correction"] = rec_options["axis_correction"]
574
+
566
575
  rec_options["angles"] = np.array(self.rotation_angles(subsampling=True))
567
576
  rec_options["angles"] += np.deg2rad(nabu_config["reconstruction"]["angle_offset"])
568
577
  voxel_size = dataset_info.pixel_size * 1e-4
@@ -55,10 +55,6 @@ class TestChunkReader:
55
55
  first_sino_odd = reader.data[:, 0, :].copy()
56
56
  compacted_dataslices_odd = get_compacted_dataslices_as_sorted_tuples(reader)
57
57
 
58
- # from spire.utils import ims
59
- # ims([first_sino_all[::2], first_sino_even, first_sino_all[::2]*1. - first_sino_even])
60
- # ims([first_sino_all[::2], first_sino_even, first_sino_all[1::2]*1. - first_sino_odd])
61
-
62
58
  # Check that the compacted data slices are correct
63
59
  assert len(compacted_dataslices_all) == len(compacted_dataslices_even) == len(compacted_dataslices_odd)
64
60
  for data_slice_all, data_slice_even, data_slice_odd in zip(
@@ -174,10 +174,15 @@ class CudaMunchDeringer(MunchDeringer):
174
174
  self._fft_plans[level].ifft(d_coeffs_f, output=d_coeffs)
175
175
 
176
176
  def _destripe_2D(self, d_sino, output):
177
+ if not (d_sino.flags.c_contiguous):
178
+ sino = self.cuda_processing.allocate_array("_d_sino", d_sino.shape, np.float32)
179
+ sino[:] = d_sino[:]
180
+ else:
181
+ sino = d_sino
177
182
  if self.padding is not None:
178
- d_sino = self.padder.pad(d_sino)
183
+ sino = self.padder.pad(sino)
179
184
  # set the "image" for DWT (memcpy D2D)
180
- self._d_sino.set(d_sino)
185
+ self._d_sino.set(sino)
181
186
  # perform forward DWT
182
187
  self.cudwt.forward()
183
188
  for i in range(self.cudwt.levels):
@@ -256,9 +261,10 @@ class CudaSinoMeanDeringer(SinoMeanDeringer):
256
261
  filename=get_cuda_srcfile("normalization.cu"),
257
262
  signature="PPiii",
258
263
  )
259
- self._mean_kernel_block = (32, 1, 32)
260
- self._mean_kernel_grid = [updiv(a, b) for a, b in zip(self.sinos_shape[::-1], self._mean_kernel_block)]
261
- self._mean_kernel_args = [self.d_sino_profile, np.int32(self.n_x), np.int32(self.n_angles), np.int32(self.n_z)]
264
+ self._mean_kernel_block = (32, 1, 1)
265
+ self._mean_kernel_grid = [updiv(self.sinos_shape[-1], self._mean_kernel_block[0]), 1, 1]
266
+ self._mean_kernel_args = [self.d_sino_profile, np.int32(self.n_x), np.int32(self.n_angles), np.int32(1)]
267
+
262
268
  self._mean_kernel_kwargs = {
263
269
  "grid": self._mean_kernel_grid,
264
270
  "block": self._mean_kernel_block,
@@ -270,9 +276,11 @@ class CudaSinoMeanDeringer(SinoMeanDeringer):
270
276
  signature="PPiii",
271
277
  options=["-DGENERIC_OP=%d" % (3 if self.mode == "divide" else 1)],
272
278
  )
273
- self._op_kernel_block = (16, 16, 4)
274
- self._op_kernel_grid = [updiv(a, b) for a, b in zip(self.sinos_shape[::-1], self._op_kernel_block)]
275
- self._op_kernel_args = [self.d_sino_profile, np.int32(self.n_x), np.int32(self.n_angles), np.int32(self.n_z)]
279
+ self._op_kernel_block = (16, 16, 1)
280
+ self._op_kernel_grid = [updiv(a, b) for a, b in zip(self.sinos_shape[1:][::-1], self._op_kernel_block[:-1])] + [
281
+ 1
282
+ ]
283
+ self._op_kernel_args = [self.d_sino_profile, np.int32(self.n_x), np.int32(self.n_angles), np.int32(1)]
276
284
  self._op_kernel_kwargs = {
277
285
  "grid": self._op_kernel_grid,
278
286
  "block": self._op_kernel_block,
@@ -312,9 +320,16 @@ class CudaSinoMeanDeringer(SinoMeanDeringer):
312
320
  if output is not None:
313
321
  raise NotImplementedError
314
322
  #
315
- self._mean_kernel(sino, *self._mean_kernel_args, **self._mean_kernel_kwargs)
323
+ if not (sino.flags.c_contiguous):
324
+ d_sino = self.processing.allocate_array("d_sino", sino.shape, np.float32)
325
+ d_sino[:] = sino[:]
326
+ else:
327
+ d_sino = sino
328
+ self._mean_kernel(d_sino, *self._mean_kernel_args, **self._mean_kernel_kwargs)
316
329
  self._apply_filter(self.d_sino_profile)
317
- self._op_kernel(sino, *self._op_kernel_args, **self._op_kernel_kwargs)
330
+ self._op_kernel(d_sino, *self._op_kernel_args, **self._op_kernel_kwargs)
331
+ if not (sino.flags.c_contiguous):
332
+ sino[:] = self.processing.d_sino[:]
318
333
  return sino
319
334
 
320
335
  def remove_rings_sinograms(self, sinograms):
nabu/utils.py CHANGED
@@ -422,19 +422,6 @@ def copy_dict_items(dict_, keys):
422
422
  return res
423
423
 
424
424
 
425
- def remove_first_dict_items(dict_, n_items, sort_func=None, inplace=True):
426
- """
427
- Remove the first items of a dictionary. The keys have to be sortable
428
- """
429
- sorted_keys = sorted(dict_.keys(), key=sort_func)
430
- if inplace:
431
- for key in sorted_keys[:n_items]:
432
- dict_.pop(key)
433
- return dict_
434
- else:
435
- return copy_dict_items(dict_, sorted_keys[n_items:])
436
-
437
-
438
425
  def recursive_copy_dict(dict_):
439
426
  """
440
427
  Perform a shallow copy of a dictionary of dictionaries.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: nabu
3
- Version: 2024.1.2
3
+ Version: 2024.1.4
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>
@@ -1,10 +1,11 @@
1
1
  doc/conf.py,sha256=3xtCarCHrXPr50GbeRDuH-o3Jzojw7mpr7vpGfZPLAE,3787
2
2
  doc/create_conf_doc.py,sha256=IVOdP70KvbW9WS_UQu3Iyd0YfS60E2fJ5IDtQ_s4cDw,1143
3
+ doc/doc_config.py,sha256=anqeOVjqE2e7eVzg7yuh9dvIneTkrA5doGl1cVBqT7Q,730
3
4
  doc/get_mathjax.py,sha256=VIvKRCdDuF2VoY8JD3mSey9XX13AZMmwTJBHdt1tUs4,1012
4
- nabu/__init__.py,sha256=ZAej-8X8A_uoviFokuukhi8jyzI2YRAj0-zkdCR3LaI,270
5
+ nabu/__init__.py,sha256=psl9fotN7bpPsnWf-aTbsiVzq6-RP7bhHXJU3ZsDkwI,270
5
6
  nabu/tests.py,sha256=cew9OY2uTyncHI_HM32W8CP6B1GTGKaOW65XtMEqs7o,1417
6
7
  nabu/testutils.py,sha256=qqtGgkIhpOpXhgeoXlqCb91Rx-JlI4ALaDF6nt8YRRk,13298
7
- nabu/utils.py,sha256=1OKKhQ6-t7OOwTLQkTJuK5Hk9lb7hkEZrDtTdcmvD4c,24164
8
+ nabu/utils.py,sha256=w-xfRb6TFQpS-tao6nlvfmr962pmeec-WH1GltSUCrk,23767
8
9
  nabu/app/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
10
  nabu/app/bootstrap.py,sha256=UQZzCBKtSXtQp5U0aXtlUhbjbwzgILTI4zD4zVffhBI,3246
10
11
  nabu/app/bootstrap_stitching.py,sha256=Inr0_zRAtyeMTK1BKxGqoDf-Na0O33CICmQJYja06ug,2148
@@ -31,7 +32,6 @@ nabu/app/shrink_dataset.py,sha256=P9dorO0Q-gPAWgSHyZi3XQp4jkMTJacDYzNvJY4oh98,35
31
32
  nabu/app/stitching.py,sha256=Ibp1oVokLVMz-VX762j1C0E88Di0YJvRt-b8NjGoe7g,3310
32
33
  nabu/app/utils.py,sha256=XUBRWDmth4i3BZHd27rfarFAUP7OEcsMeVmDJ6T4EXA,1178
33
34
  nabu/app/validator.py,sha256=IR-DcUV5h1Fc5CChBfBIaglrGpfKNICX7tGirAroMiw,3368
34
- nabu/app/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
35
  nabu/app/tests/test_reduce_dark_flat.py,sha256=T-_zyzD0-f2c5Z-tlzmRF5p3vPtyL2RFb-D5fIYYEoM,2641
36
36
  nabu/cuda/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
37
37
  nabu/cuda/convolution.py,sha256=n8KsJ7IZdPOs_K5QZC6qblnOvIKYwxtdt03oNa0GiMU,241
@@ -127,7 +127,7 @@ nabu/pipeline/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
127
127
  nabu/pipeline/config.py,sha256=amc05PX0kZA5wHjD1oFP59MfW4pBA-gjBypy4tKLnv0,9221
128
128
  nabu/pipeline/config_validators.py,sha256=rvK1Q_KmA1LUeNTefNxXCpYfDQ1zAdk1kFePrLintwc,16300
129
129
  nabu/pipeline/datadump.py,sha256=Ua4tbzxfGMOiT2-7WZn3IDiJqzzK-TyFuku_XUkH8_Q,6520
130
- nabu/pipeline/dataset_validator.py,sha256=b6RYIoaElX8QkqYPFl7KsMU7wai7jJjG6QtTQBvPd_o,9207
130
+ nabu/pipeline/dataset_validator.py,sha256=etQw9NC_YGsdWCgjsn8aJ3WfvcRuJlLVZlWoqhvvo-8,9263
131
131
  nabu/pipeline/detector_distortion_provider.py,sha256=ru1AxbcuO-FA8FYooPBWgp1lzdSDUtzFUC1A_sS8jME,920
132
132
  nabu/pipeline/estimators.py,sha256=4V5pwl5vUFMJDanWnmw7POnSsa9lKyKtUzvq9GLcJwc,41374
133
133
  nabu/pipeline/fallback_utils.py,sha256=7ccrKYE-rp3fydb72VA6W0_eKcEoqYBEAPlmij_lyEc,6086
@@ -141,7 +141,7 @@ nabu/pipeline/fullfield/chunked_cuda.py,sha256=aGzjY8MX6OL8auEj6Y0RfOGCmFnczsdfj
141
141
  nabu/pipeline/fullfield/computations.py,sha256=VpIURVXh8EpNSfait_AIFM4Ci-GK_546Wkb-Wn9r31Y,9935
142
142
  nabu/pipeline/fullfield/dataset_validator.py,sha256=sRgUECUc8aOjFbwrW-dHjvIf7K3T40YPSIgt3cInKAc,3055
143
143
  nabu/pipeline/fullfield/nabu_config.py,sha256=a0mMoLkvlvHgX6RmUS1m1UhJS-XB3O6wBCnkNoI90Cs,30358
144
- nabu/pipeline/fullfield/processconfig.py,sha256=SzA9FA7aK5V13q8f8fFmKvumvK0ATkl5Bi_lAs2r8m8,35658
144
+ nabu/pipeline/fullfield/processconfig.py,sha256=ad2lmo-cCkzfDJqMd__FhbfIInndTxQsLdgH9Ec9Tzc,36107
145
145
  nabu/pipeline/fullfield/reconstruction.py,sha256=Km_ZDtoiDQdX3TdTh6E9bzS5hoMC0jYU5eZWodaLbIg,36627
146
146
  nabu/pipeline/helical/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
147
147
  nabu/pipeline/helical/dataset_validator.py,sha256=0YQc0hdYdpaXznFaKmlj9SIu7mNs0xXMejcRkhOZHaI,640
@@ -161,7 +161,7 @@ nabu/pipeline/helical/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMp
161
161
  nabu/pipeline/helical/tests/test_accumulator.py,sha256=nNHwqUgSyUpdZVYNVyxqekj0SoThCF8s-8o3NfSw6vI,6416
162
162
  nabu/pipeline/helical/tests/test_pipeline_elements_full.py,sha256=zeR9SaeD0mnhtKU7qo4Qrn_lg1I1Vhg4dqzj6jy8tpg,14569
163
163
  nabu/pipeline/helical/tests/test_strategy.py,sha256=rt8SsUHBMMcVFl48kRGcOyf1y4bYqaA2xDznQxE7wFs,2721
164
- nabu/pipeline/tests/test_chunk_reader.py,sha256=Z5N620l4jZmG_15v5GPbqf4LgZeO2hJvcsptq_YpltU,3641
164
+ nabu/pipeline/tests/test_chunk_reader.py,sha256=OB279hSvgmVhWv_OauZNWTJeaaiheETayGYK79Op10Q,3410
165
165
  nabu/pipeline/tests/test_estimators.py,sha256=6VK7fxxfrRTWSSi2bhHqbLy8pZJ2DALO1gJkuxpLDSQ,8392
166
166
  nabu/pipeline/xrdct/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
167
167
  nabu/preproc/__init__.py,sha256=dKxvZvWZXjKS3iPRaSXiUeM2dNGIOyTlirq5pdAWY0Y,284
@@ -234,7 +234,7 @@ nabu/reconstruction/projection.py,sha256=7WVPlYLUmCmB2yR1JYmVLJ5fZ3CMMKQ3vS9yuTU
234
234
  nabu/reconstruction/reconstructor.py,sha256=wSva2EK-NTJi8N_ubzJWIZ4sv2ksfrA9YcA2ioEtISo,7299
235
235
  nabu/reconstruction/reconstructor_cuda.py,sha256=m_3GzG44PRyiSEfTvYjgr5atLwl26hMfZOMyqTWxp0g,1644
236
236
  nabu/reconstruction/rings.py,sha256=mpbCLuFM_6Uy9oNJkyQ8tZwhGhrbWtzRlArSRsC90bI,9527
237
- nabu/reconstruction/rings_cuda.py,sha256=LZ_XKmkccmBI1hxR_Zr7eP_mxRx0TTPgso6Y_jfEoJE,13010
237
+ nabu/reconstruction/rings_cuda.py,sha256=NFU4lV_K6oY3eVyHmK_zxpQYeXpejOe_j8fnK7Vnnb0,13514
238
238
  nabu/reconstruction/sinogram.py,sha256=KTSGP_JJABf4Yr9l628HPbyWsBnpbnyGKyPEq3ZrPIE,17026
239
239
  nabu/reconstruction/sinogram_cuda.py,sha256=wS84AIy3T00d1kTtuJOQmA3hktbDVs4ybwB9haiBcoY,10623
240
240
  nabu/reconstruction/sinogram_opencl.py,sha256=p793N26VknU8KIZLtDgFY6HNx0TylemZ1YL4WKD3fHs,1403
@@ -288,9 +288,9 @@ nabu/thirdparty/pore3d_deringer_munch.py,sha256=o4bisnFc-wMjuohWBT8wgWmfNehPQGtC
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.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,,
291
+ nabu-2024.1.4.dist-info/LICENSE,sha256=1eAIPSnEsnSFNUODnLtNtQTs76exG3ZxJ1DJR6zoUBA,1066
292
+ nabu-2024.1.4.dist-info/METADATA,sha256=gJfS07iPzNeEw40J0wzEK8Y7inuscqmakqyZfu7-hFM,5224
293
+ nabu-2024.1.4.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
294
+ nabu-2024.1.4.dist-info/entry_points.txt,sha256=cJKGkBeykVL7uK3E4R0RLRqMXifTL2qdO573syPAvJc,1288
295
+ nabu-2024.1.4.dist-info/top_level.txt,sha256=fsm_N3eXLRZk2QXF9OSKPNDPFXOz8FAQjHh5avT3dok,9
296
+ nabu-2024.1.4.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.41.1)
2
+ Generator: bdist_wheel (0.42.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
File without changes