dicube 0.2.0__cp312-cp312-win_amd64.whl → 0.2.3__cp312-cp312-win_amd64.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 (27) hide show
  1. dicube/__init__.py +9 -2
  2. dicube/codecs/jph/ojph_complete.cp310-win_amd64.pyd +0 -0
  3. dicube/codecs/jph/ojph_complete.cp311-win_amd64.pyd +0 -0
  4. dicube/codecs/jph/ojph_complete.cp312-win_amd64.pyd +0 -0
  5. dicube/codecs/jph/ojph_complete.cp38-win_amd64.pyd +0 -0
  6. dicube/codecs/jph/ojph_complete.cp39-win_amd64.pyd +0 -0
  7. dicube/codecs/jph/ojph_decode_complete.cp310-win_amd64.pyd +0 -0
  8. dicube/codecs/jph/ojph_decode_complete.cp311-win_amd64.pyd +0 -0
  9. dicube/codecs/jph/ojph_decode_complete.cp312-win_amd64.pyd +0 -0
  10. dicube/codecs/jph/ojph_decode_complete.cp38-win_amd64.pyd +0 -0
  11. dicube/codecs/jph/ojph_decode_complete.cp39-win_amd64.pyd +0 -0
  12. dicube/core/io.py +48 -12
  13. dicube/dicom/dicom_meta.py +9 -6
  14. {dicube-0.2.0.dist-info → dicube-0.2.3.dist-info}/METADATA +2 -1
  15. dicube-0.2.3.dist-info/RECORD +35 -0
  16. dicube/codecs/jph/ojph_complete.cp310-win32.pyd +0 -0
  17. dicube/codecs/jph/ojph_complete.cp311-win32.pyd +0 -0
  18. dicube/codecs/jph/ojph_complete.cp312-win32.pyd +0 -0
  19. dicube/codecs/jph/ojph_complete.cp38-win32.pyd +0 -0
  20. dicube/codecs/jph/ojph_complete.cp39-win32.pyd +0 -0
  21. dicube/codecs/jph/ojph_decode_complete.cp310-win32.pyd +0 -0
  22. dicube/codecs/jph/ojph_decode_complete.cp311-win32.pyd +0 -0
  23. dicube/codecs/jph/ojph_decode_complete.cp312-win32.pyd +0 -0
  24. dicube/codecs/jph/ojph_decode_complete.cp38-win32.pyd +0 -0
  25. dicube/codecs/jph/ojph_decode_complete.cp39-win32.pyd +0 -0
  26. dicube-0.2.0.dist-info/RECORD +0 -45
  27. {dicube-0.2.0.dist-info → dicube-0.2.3.dist-info}/WHEEL +0 -0
dicube/__init__.py CHANGED
@@ -64,7 +64,7 @@ def set_num_threads(num_threads: int) -> None:
64
64
  _num_threads = num_threads
65
65
 
66
66
  # Top-level convenience methods
67
- def load(file_path: str) -> DicomCubeImage:
67
+ def load(file_path: str, skip_meta: bool = False) -> DicomCubeImage:
68
68
  """Load a DicomCubeImage from a file.
69
69
 
70
70
  Args:
@@ -73,8 +73,15 @@ def load(file_path: str) -> DicomCubeImage:
73
73
  Returns:
74
74
  DicomCubeImage: The loaded image object.
75
75
  """
76
- return DicomCubeImageIO.load(file_path)
76
+ return DicomCubeImageIO.load(file_path, skip_meta)
77
77
 
78
+ def load_meta(file_path: str) -> DicomMeta:
79
+ """Load the metadata from a file.
80
+
81
+ Args:
82
+ file_path (str): Path to the input file.
83
+ """
84
+ return DicomCubeImageIO.load_meta(file_path)
78
85
 
79
86
  def save(
80
87
  image: DicomCubeImage,
dicube/core/io.py CHANGED
@@ -107,18 +107,13 @@ class DicomCubeImageIO:
107
107
  details={"file_path": file_path, "file_type": file_type}
108
108
  ) from e
109
109
 
110
+
110
111
  @staticmethod
111
- def load(file_path: str) -> 'DicomCubeImage':
112
- """Load DicomCubeImage from a file.
112
+ def _get_reader(file_path: str) -> DcbFile:
113
+ """Get the appropriate reader based on the file path.
113
114
 
114
115
  Args:
115
- file_path (str): Input file path.
116
-
117
- Returns:
118
- DicomCubeImage: The loaded object from the file.
119
-
120
- Raises:
121
- ValueError: When the file format is not supported.
116
+ file_path (str): Path to the input file.
122
117
  """
123
118
  # Validate required parameters
124
119
  validate_not_none(file_path, "file_path", "load operation", InvalidCubeFileError)
@@ -143,9 +138,44 @@ class DicomCubeImageIO:
143
138
  details={"file_path": file_path, "magic_number": magic},
144
139
  suggestion="Ensure the file is a valid DicomCube file"
145
140
  )
141
+ return reader
142
+
143
+ except Exception as e:
144
+ if isinstance(e, (InvalidCubeFileError, CodecError)):
145
+ raise
146
+ raise InvalidCubeFileError(
147
+ f"Failed to load file: {str(e)}",
148
+ context="load operation",
149
+ details={"file_path": file_path}
150
+ ) from e
151
+
152
+ @staticmethod
153
+ def load_meta(file_path: str) -> DicomMeta:
154
+ """Load the metadata from a file.
155
+
156
+ Args:
157
+ file_path (str): Path to the input file.
158
+ """
159
+ reader = DicomCubeImageIO._get_reader(file_path)
160
+ return reader.read_meta()
161
+
162
+ @staticmethod
163
+ def load(file_path: str, skip_meta: bool = False) -> 'DicomCubeImage':
164
+ """Load DicomCubeImage from a file.
165
+
166
+ Args:
167
+ file_path (str): Input file path.
168
+
169
+ Returns:
170
+ DicomCubeImage: The loaded object from the file.
146
171
 
172
+ Raises:
173
+ ValueError: When the file format is not supported.
174
+ """
175
+ reader = DicomCubeImageIO._get_reader(file_path)
176
+ try:
147
177
  # Read file contents
148
- dicom_meta = reader.read_meta()
178
+ dicom_meta = None if skip_meta else reader.read_meta()
149
179
  space = reader.read_space()
150
180
  pixel_header = reader.read_pixel_header()
151
181
  dicom_status = reader.read_dicom_status()
@@ -239,6 +269,12 @@ class DicomCubeImageIO:
239
269
  intercept = meta.get_shared_value(CommonTags.RescaleIntercept)
240
270
  wind_center = meta.get_shared_value(CommonTags.WindowCenter)
241
271
  wind_width = meta.get_shared_value(CommonTags.WindowWidth)
272
+ try:
273
+ wind_center = float(wind_center)
274
+ wind_width = float(wind_width)
275
+ except:
276
+ wind_center = None
277
+ wind_width = None
242
278
 
243
279
  # Create pixel_header
244
280
  pixel_header = PixelDataHeader(
@@ -246,8 +282,8 @@ class DicomCubeImageIO:
246
282
  RescaleIntercept=float(intercept) if intercept is not None else 0.0,
247
283
  OriginalPixelDtype=str(images[0].dtype),
248
284
  PixelDtype=str(images[0].dtype),
249
- WindowCenter=float(wind_center) if wind_center is not None else None,
250
- WindowWidth=float(wind_width) if wind_width is not None else None,
285
+ WindowCenter=wind_center,
286
+ WindowWidth=wind_width,
251
287
  )
252
288
 
253
289
  # Validate PixelDataHeader initialization success
@@ -101,9 +101,9 @@ def _display(meta, show_shared=True, show_non_shared=True):
101
101
  Returns:
102
102
  pandas.DataFrame: Formatted metadata tables.
103
103
  """
104
+
104
105
  import pandas as pd
105
106
  from .dicom_tags import CommonTags
106
-
107
107
  # Prepare shared and non-shared data
108
108
  shared_data = []
109
109
  non_shared_data = {}
@@ -137,7 +137,7 @@ def _display(meta, show_shared=True, show_non_shared=True):
137
137
  # Process each tag
138
138
  for tag_key in meta.keys():
139
139
  tag = Tag(int(tag_key[:4], 16), int(tag_key[4:], 16))
140
- tag_name = datadict.dicom_dict_summary.get(tag, {}).get("name", f"({tag.group:04X},{tag.element:04X})")
140
+ tag_name = datadict.keyword_for_tag(tag)
141
141
  vr = meta.get_vr(tag)
142
142
 
143
143
  if meta.is_shared(tag):
@@ -198,7 +198,7 @@ def _display(meta, show_shared=True, show_non_shared=True):
198
198
  for tag in non_shared_tags
199
199
  }
200
200
  name_row = {
201
- f"({tag.group:04X},{tag.element:04X})": non_shared_data[tag.key]["Name"]
201
+ f"({tag.group:04X},{tag.element:04X})": non_shared_data[get_tag_key(tag)]["Name"]
202
202
  for tag in non_shared_tags
203
203
  }
204
204
 
@@ -206,7 +206,7 @@ def _display(meta, show_shared=True, show_non_shared=True):
206
206
  values_rows = []
207
207
  for idx in range(meta.slice_count):
208
208
  row = {
209
- f"({tag.group:04X},{tag.element:04X})": non_shared_data[tag.key]["Values"][idx]
209
+ f"({tag.group:04X},{tag.element:04X})": non_shared_data[get_tag_key(tag)]["Values"][idx]
210
210
  for tag in non_shared_tags
211
211
  }
212
212
  values_rows.append(row)
@@ -288,8 +288,11 @@ class DicomMeta:
288
288
  # Convert each dataset to a dict representation
289
289
  dicts = []
290
290
  for ds in datasets:
291
- dicts.append(ds.to_json_dict())
292
-
291
+ tmp = ds.to_json_dict(
292
+ bulk_data_threshold=10240, bulk_data_element_handler=lambda x: None
293
+ )
294
+ tmp.pop(get_tag_key(CommonTags.PixelData), None)
295
+ dicts.append(tmp)
293
296
  # Merge the dictionaries
294
297
  merged_data = _merge_dataset_list(dicts)
295
298
  return cls(merged_data, filenames)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: dicube
3
- Version: 0.2.0
3
+ Version: 0.2.3
4
4
  Summary: Medical Image Storage Library with DICOM compatibility
5
5
  Author: Fangzhou Liao
6
6
  License: MIT
@@ -38,6 +38,7 @@ Requires-Dist: mypy>=1.0.0; extra == "dev"
38
38
  Requires-Dist: build>=0.8.0; extra == "dev"
39
39
  Requires-Dist: pylibjpeg>=2.0; extra == "dev"
40
40
  Requires-Dist: pylibjpeg-openjpeg>=2.0; extra == "dev"
41
+ Requires-Dist: nibabel>=3.2.0; extra == "dev"
41
42
  Provides-Extra: all
42
43
  Requires-Dist: pybind11>=2.10.0; extra == "all"
43
44
  Requires-Dist: nibabel>=3.2.0; extra == "all"
@@ -0,0 +1,35 @@
1
+ dicube/__init__.py,sha256=X2Kgk5AUa9-DMFFLX8kr65sO7Srwfp1uZWiv1VAXGYs,5305
2
+ dicube/codecs/__init__.py,sha256=Tqw2vmQML-pcaNtnyTtj4W4kBqGhV2FTiVAT5bW5FgA,3905
3
+ dicube/codecs/jph/__init__.py,sha256=pWYkTNWYeGZx3khsJBAKRdB2Vgyr0BX5aLDKaanfe_o,407
4
+ dicube/codecs/jph/codec.py,sha256=BMZM3ReemQheraSIYn19aqH-1NrbjQTPAx3iCTms7KU,5620
5
+ dicube/codecs/jph/ojph_complete.cp310-win_amd64.pyd,sha256=aGz3SMVTU7C1rvTrJHW0-LiGJz79Gx0bj9qfTSKSZWc,601600
6
+ dicube/codecs/jph/ojph_complete.cp311-win_amd64.pyd,sha256=oeqav2QNt-_XWPNyO5lAvav7XVwN7crEudYGjSdkBRM,604160
7
+ dicube/codecs/jph/ojph_complete.cp312-win_amd64.pyd,sha256=z88hROaR8ewduzlitaom1tf6xaI8jWwJXfrfxKOFA4I,606720
8
+ dicube/codecs/jph/ojph_complete.cp38-win_amd64.pyd,sha256=0DV-QHwjpYylxfwKB1TF4r3yvrTH7Vgy_EI2kvMqBcQ,601600
9
+ dicube/codecs/jph/ojph_complete.cp39-win_amd64.pyd,sha256=lyOLVaATcN4yAzXZBf0M4cgFXwOw61rq-sLDa9ZXXLI,601600
10
+ dicube/codecs/jph/ojph_decode_complete.cp310-win_amd64.pyd,sha256=OB6_do4EDnsxEcE8dvI2PPdzIiPtpP3ao6p0jytRBWI,639488
11
+ dicube/codecs/jph/ojph_decode_complete.cp311-win_amd64.pyd,sha256=3b8MAfe-dGGFP0A-rUelMF4Icdph6nPZxIzS3_AxIC0,641536
12
+ dicube/codecs/jph/ojph_decode_complete.cp312-win_amd64.pyd,sha256=uXuxL8llEBVxAEnahXRS4OIj6v0sXn14ik8efgoe7QE,644096
13
+ dicube/codecs/jph/ojph_decode_complete.cp38-win_amd64.pyd,sha256=uqXtblbalMSVjOUH3PqmzPO8vi5TfvZteZWo7PsOpBQ,639488
14
+ dicube/codecs/jph/ojph_decode_complete.cp39-win_amd64.pyd,sha256=TPpJOq6eZUNACFcDuUsixS7-BCGTxGCErBCfGyflDZQ,638976
15
+ dicube/core/__init__.py,sha256=TJBS1xA2qVS7xxH6vZKPrd7YiQYtyLfNSs48tlmBCD8,676
16
+ dicube/core/image.py,sha256=WR9GKat0st0ior7zw1wi_5Bpd5cZoHWvsPzjYJAwpcg,14525
17
+ dicube/core/io.py,sha256=nGYifKDO4WRElK95uuz89BzVpoWqd43CZeOJp1nj5lg,17037
18
+ dicube/core/pixel_header.py,sha256=gikXfkjTGVQUqTWUk8Q2xAPsDfWm0iRPcwdIxIImr94,4124
19
+ dicube/dicom/__init__.py,sha256=OGnAHS3pCbb94Vpsc0x3d2gjv5UBAM9oUR3mxQVruYQ,383
20
+ dicube/dicom/dcb_streaming.py,sha256=6b50m5SEHFkdkWYKl6_ClzvPZZJKlJlVNR08sWF-Xdo,9335
21
+ dicube/dicom/dicom_io.py,sha256=EWR-VYXUYEF066dxucSb9E7xPpIReN-BbCeIZSsNskU,5069
22
+ dicube/dicom/dicom_meta.py,sha256=q5xiitigkGPwcH5U5Ih0UNiY-uxNcpOfcPxh1JqNXjg,27689
23
+ dicube/dicom/dicom_status.py,sha256=VYp6q6UbxPkGwJ8_udEBRGSCFeSWedwRuEB4vfREOaE,10375
24
+ dicube/dicom/dicom_tags.py,sha256=BRw099dC-9FvAJ43QKESHBxtGtsGSSodcijJKXcCnsE,4065
25
+ dicube/dicom/merge_utils.py,sha256=ji0twDUBpR261l0pS2i8knetZI5Jg-OEaYsc2G_SBzk,9594
26
+ dicube/dicom/space_from_meta.py,sha256=i6zIXbFaNyz0g6z2oeoO5lzsfaeo4sgz_FI-PrEmqsg,2489
27
+ dicube/exceptions.py,sha256=VNnW7Dd9MwKzSK_y9GQITrsaHYiL-Crwmntzf-YS1sY,6877
28
+ dicube/storage/__init__.py,sha256=6WG1hdok-TkKShXCKFvH9ShoNILq3qvyZ6sNEO_urW4,481
29
+ dicube/storage/dcb_file.py,sha256=tt7aYi4x_gxf4s6De6tSkpiwyoCp1ZcG-Piixai1Jw8,32055
30
+ dicube/storage/pixel_utils.py,sha256=_KrsMoKHsgGc9QFSkmpx5YlDNcTOYPkCSu-zGt3WS7k,10017
31
+ dicube/utils/__init__.py,sha256=r4wAqNWphzYWaeYN9fcoFCX7mTcOtNACzZ4O-dDCQ10,154
32
+ dicube/validation.py,sha256=aFu2lKW9NDl13eKedYhOjw1g50uOf_x0wx3y3g9cLsA,12857
33
+ dicube-0.2.3.dist-info/METADATA,sha256=NWFpkVhrchy-PksUdnOaC3WnpGb35w7XebMFavyqYF8,10627
34
+ dicube-0.2.3.dist-info/WHEEL,sha256=TcMXEVBP2SQds4YZwJ6flDTTNRzCE5owNAganfIqM0g,106
35
+ dicube-0.2.3.dist-info/RECORD,,
@@ -1,45 +0,0 @@
1
- dicube/__init__.py,sha256=XI_Zeif8FOQ-i_G7LabwVFpubzDniXSFb-8H_WdYW8c,5059
2
- dicube/codecs/__init__.py,sha256=Tqw2vmQML-pcaNtnyTtj4W4kBqGhV2FTiVAT5bW5FgA,3905
3
- dicube/codecs/jph/__init__.py,sha256=pWYkTNWYeGZx3khsJBAKRdB2Vgyr0BX5aLDKaanfe_o,407
4
- dicube/codecs/jph/codec.py,sha256=BMZM3ReemQheraSIYn19aqH-1NrbjQTPAx3iCTms7KU,5620
5
- dicube/codecs/jph/ojph_complete.cp310-win32.pyd,sha256=OQXH1naFlfAvI8YxSyVTBp283w2Rutcdf9VVQBk-syk,507904
6
- dicube/codecs/jph/ojph_complete.cp310-win_amd64.pyd,sha256=_CWtaFatb_fKoho6VniTI7rrHkaYZvgV9LJBQY3ZvO4,601600
7
- dicube/codecs/jph/ojph_complete.cp311-win32.pyd,sha256=eut4wirUngtvETMSqbycD9c-BYLDs-DMKGUf845CaGk,510464
8
- dicube/codecs/jph/ojph_complete.cp311-win_amd64.pyd,sha256=DKd-ukJ3oPsdxeEHDthV3ulQsUhxguORE3M8jKqkbWw,604160
9
- dicube/codecs/jph/ojph_complete.cp312-win32.pyd,sha256=_rkhszkkpOElaA5NQa8NLmRXSCuO9ZmcH-nRB8_UNLU,513536
10
- dicube/codecs/jph/ojph_complete.cp312-win_amd64.pyd,sha256=pXnM2utR7p8NAh3qtVWfwWHMQFEeHfzKh1KxhvLuiPg,606720
11
- dicube/codecs/jph/ojph_complete.cp38-win32.pyd,sha256=Y3Nterl5act9QSkyfny-K0u6OkJnDg6KVMob14XdzQs,507904
12
- dicube/codecs/jph/ojph_complete.cp38-win_amd64.pyd,sha256=vjlAPdq-rTif10Ya8hRuj1KUrlU7djCMrwz3i1Z9egY,601600
13
- dicube/codecs/jph/ojph_complete.cp39-win32.pyd,sha256=kEecz7Uixzn3CMawNsaYWQfyu0asV4hCNIMnvE2zjkw,507904
14
- dicube/codecs/jph/ojph_complete.cp39-win_amd64.pyd,sha256=ddRbfp0hZsgtvZocoUi_-VThW6IRC652C-NtsCXXqTs,601600
15
- dicube/codecs/jph/ojph_decode_complete.cp310-win32.pyd,sha256=mhGLqPbJ5CmrfM22Azb769s2HgY-jzJ9Qp3eqR2Uu3U,543744
16
- dicube/codecs/jph/ojph_decode_complete.cp310-win_amd64.pyd,sha256=5XQMaFven0b_3mks6FW8uV4XcJhO4C4uwvrOWkDAJ4o,639488
17
- dicube/codecs/jph/ojph_decode_complete.cp311-win32.pyd,sha256=pJD_-yZQrMNk25Pg1-g60TNALAvTRu8LEsE6t84RAVo,546304
18
- dicube/codecs/jph/ojph_decode_complete.cp311-win_amd64.pyd,sha256=z7pJRIrPLcdn-tkzxoAfZcNIQgP1YMlM2pIAQJWB09c,641536
19
- dicube/codecs/jph/ojph_decode_complete.cp312-win32.pyd,sha256=lUNNuTmDmg0aXXHG4XSrfxaJ5vq9gC_oXaqRXz8R4dM,549888
20
- dicube/codecs/jph/ojph_decode_complete.cp312-win_amd64.pyd,sha256=oVEwfMS1BoYcOUtN4fFdCO8exXY11ss-MSyI2vHB75U,644096
21
- dicube/codecs/jph/ojph_decode_complete.cp38-win32.pyd,sha256=Drd29pmHMr6xKAEOYHbxIOzvvKi7HwUqphVFkBDUDcY,543232
22
- dicube/codecs/jph/ojph_decode_complete.cp38-win_amd64.pyd,sha256=KxoPWOvvtfNJD0mhiTLL6rjiGHRDS5tNTLz3gygYEiY,639488
23
- dicube/codecs/jph/ojph_decode_complete.cp39-win32.pyd,sha256=_VR1xg2e90wHJQNoH50JDiEy2ZjGRU3SYU50DWMuxbE,543232
24
- dicube/codecs/jph/ojph_decode_complete.cp39-win_amd64.pyd,sha256=3G4xvyYCFAjzssGskezMAjzMMiexSr2P2r1v539CmC8,638976
25
- dicube/core/__init__.py,sha256=TJBS1xA2qVS7xxH6vZKPrd7YiQYtyLfNSs48tlmBCD8,676
26
- dicube/core/image.py,sha256=WR9GKat0st0ior7zw1wi_5Bpd5cZoHWvsPzjYJAwpcg,14525
27
- dicube/core/io.py,sha256=kMGiT20Gmkb55tFXxIDiU6RS3owHkqF7xk4IVq78eNU,15915
28
- dicube/core/pixel_header.py,sha256=gikXfkjTGVQUqTWUk8Q2xAPsDfWm0iRPcwdIxIImr94,4124
29
- dicube/dicom/__init__.py,sha256=OGnAHS3pCbb94Vpsc0x3d2gjv5UBAM9oUR3mxQVruYQ,383
30
- dicube/dicom/dcb_streaming.py,sha256=6b50m5SEHFkdkWYKl6_ClzvPZZJKlJlVNR08sWF-Xdo,9335
31
- dicube/dicom/dicom_io.py,sha256=EWR-VYXUYEF066dxucSb9E7xPpIReN-BbCeIZSsNskU,5069
32
- dicube/dicom/dicom_meta.py,sha256=PgVeIWoYE7udQ3M26ytX1r3ic9leL35MMVfEJhTk-3Q,27552
33
- dicube/dicom/dicom_status.py,sha256=VYp6q6UbxPkGwJ8_udEBRGSCFeSWedwRuEB4vfREOaE,10375
34
- dicube/dicom/dicom_tags.py,sha256=BRw099dC-9FvAJ43QKESHBxtGtsGSSodcijJKXcCnsE,4065
35
- dicube/dicom/merge_utils.py,sha256=ji0twDUBpR261l0pS2i8knetZI5Jg-OEaYsc2G_SBzk,9594
36
- dicube/dicom/space_from_meta.py,sha256=i6zIXbFaNyz0g6z2oeoO5lzsfaeo4sgz_FI-PrEmqsg,2489
37
- dicube/exceptions.py,sha256=VNnW7Dd9MwKzSK_y9GQITrsaHYiL-Crwmntzf-YS1sY,6877
38
- dicube/storage/__init__.py,sha256=6WG1hdok-TkKShXCKFvH9ShoNILq3qvyZ6sNEO_urW4,481
39
- dicube/storage/dcb_file.py,sha256=tt7aYi4x_gxf4s6De6tSkpiwyoCp1ZcG-Piixai1Jw8,32055
40
- dicube/storage/pixel_utils.py,sha256=_KrsMoKHsgGc9QFSkmpx5YlDNcTOYPkCSu-zGt3WS7k,10017
41
- dicube/utils/__init__.py,sha256=r4wAqNWphzYWaeYN9fcoFCX7mTcOtNACzZ4O-dDCQ10,154
42
- dicube/validation.py,sha256=aFu2lKW9NDl13eKedYhOjw1g50uOf_x0wx3y3g9cLsA,12857
43
- dicube-0.2.0.dist-info/METADATA,sha256=xDYbYiX9NKyLH0bAbBNOsziAxvXHyyQyELP8RlGA5ys,10581
44
- dicube-0.2.0.dist-info/WHEEL,sha256=TcMXEVBP2SQds4YZwJ6flDTTNRzCE5owNAganfIqM0g,106
45
- dicube-0.2.0.dist-info/RECORD,,
File without changes