legend-pydataobj 1.14.1__tar.gz → 1.14.3__tar.gz

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 (96) hide show
  1. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/PKG-INFO +1 -1
  2. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/src/legend_pydataobj.egg-info/PKG-INFO +1 -1
  3. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/src/lgdo/_version.py +2 -2
  4. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/src/lgdo/lh5/_serializers/write/composite.py +1 -1
  5. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/src/lgdo/lh5/core.py +1 -1
  6. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/src/lgdo/lh5/store.py +5 -1
  7. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/src/lgdo/lh5/tools.py +31 -16
  8. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/src/lgdo/lh5/utils.py +8 -2
  9. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/tests/lh5/test_exceptions.py +13 -0
  10. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/LICENSE +0 -0
  11. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/README.md +0 -0
  12. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/pyproject.toml +0 -0
  13. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/setup.cfg +0 -0
  14. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/src/legend_pydataobj.egg-info/SOURCES.txt +0 -0
  15. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/src/legend_pydataobj.egg-info/dependency_links.txt +0 -0
  16. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/src/legend_pydataobj.egg-info/entry_points.txt +0 -0
  17. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/src/legend_pydataobj.egg-info/not-zip-safe +0 -0
  18. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/src/legend_pydataobj.egg-info/requires.txt +0 -0
  19. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/src/legend_pydataobj.egg-info/top_level.txt +0 -0
  20. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/src/lgdo/__init__.py +0 -0
  21. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/src/lgdo/cli.py +0 -0
  22. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/src/lgdo/compression/__init__.py +0 -0
  23. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/src/lgdo/compression/base.py +0 -0
  24. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/src/lgdo/compression/generic.py +0 -0
  25. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/src/lgdo/compression/radware.py +0 -0
  26. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/src/lgdo/compression/utils.py +0 -0
  27. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/src/lgdo/compression/varlen.py +0 -0
  28. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/src/lgdo/lgdo_utils.py +0 -0
  29. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/src/lgdo/lh5/__init__.py +0 -0
  30. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/src/lgdo/lh5/_serializers/__init__.py +0 -0
  31. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/src/lgdo/lh5/_serializers/read/__init__.py +0 -0
  32. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/src/lgdo/lh5/_serializers/read/array.py +0 -0
  33. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/src/lgdo/lh5/_serializers/read/composite.py +0 -0
  34. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/src/lgdo/lh5/_serializers/read/encoded.py +0 -0
  35. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/src/lgdo/lh5/_serializers/read/ndarray.py +0 -0
  36. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/src/lgdo/lh5/_serializers/read/scalar.py +0 -0
  37. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/src/lgdo/lh5/_serializers/read/utils.py +0 -0
  38. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/src/lgdo/lh5/_serializers/read/vector_of_vectors.py +0 -0
  39. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/src/lgdo/lh5/_serializers/write/__init__.py +0 -0
  40. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/src/lgdo/lh5/_serializers/write/array.py +0 -0
  41. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/src/lgdo/lh5/_serializers/write/scalar.py +0 -0
  42. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/src/lgdo/lh5/_serializers/write/vector_of_vectors.py +0 -0
  43. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/src/lgdo/lh5/concat.py +0 -0
  44. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/src/lgdo/lh5/datatype.py +0 -0
  45. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/src/lgdo/lh5/exceptions.py +0 -0
  46. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/src/lgdo/lh5/iterator.py +0 -0
  47. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/src/lgdo/lh5/settings.py +0 -0
  48. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/src/lgdo/logging.py +0 -0
  49. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/src/lgdo/types/__init__.py +0 -0
  50. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/src/lgdo/types/array.py +0 -0
  51. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/src/lgdo/types/arrayofequalsizedarrays.py +0 -0
  52. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/src/lgdo/types/encoded.py +0 -0
  53. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/src/lgdo/types/fixedsizearray.py +0 -0
  54. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/src/lgdo/types/histogram.py +0 -0
  55. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/src/lgdo/types/lgdo.py +0 -0
  56. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/src/lgdo/types/scalar.py +0 -0
  57. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/src/lgdo/types/struct.py +0 -0
  58. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/src/lgdo/types/table.py +0 -0
  59. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/src/lgdo/types/vectorofvectors.py +0 -0
  60. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/src/lgdo/types/vovutils.py +0 -0
  61. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/src/lgdo/types/waveformtable.py +0 -0
  62. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/src/lgdo/units.py +0 -0
  63. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/src/lgdo/utils.py +0 -0
  64. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/tests/compression/conftest.py +0 -0
  65. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/tests/compression/sigcompress/LDQTA_r117_20200110T105115Z_cal_geds_raw-0.dat +0 -0
  66. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/tests/compression/sigcompress/special-wf-clipped.dat +0 -0
  67. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/tests/compression/test_compression.py +0 -0
  68. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/tests/compression/test_radware_sigcompress.py +0 -0
  69. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/tests/compression/test_str2wfcodec.py +0 -0
  70. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/tests/compression/test_uleb128_zigzag_diff.py +0 -0
  71. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/tests/conftest.py +0 -0
  72. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/tests/lh5/conftest.py +0 -0
  73. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/tests/lh5/test_concat.py +0 -0
  74. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/tests/lh5/test_core.py +0 -0
  75. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/tests/lh5/test_lh5_datatype.py +0 -0
  76. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/tests/lh5/test_lh5_iterator.py +0 -0
  77. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/tests/lh5/test_lh5_store.py +0 -0
  78. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/tests/lh5/test_lh5_tools.py +0 -0
  79. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/tests/lh5/test_lh5_utils.py +0 -0
  80. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/tests/lh5/test_lh5_write.py +0 -0
  81. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/tests/lh5/test_pathlib.py +0 -0
  82. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/tests/test_cli.py +0 -0
  83. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/tests/test_lgdo_utils.py +0 -0
  84. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/tests/types/test_array.py +0 -0
  85. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/tests/types/test_arrayofequalsizedarrays.py +0 -0
  86. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/tests/types/test_encoded.py +0 -0
  87. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/tests/types/test_fixedsizearray.py +0 -0
  88. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/tests/types/test_histogram.py +0 -0
  89. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/tests/types/test_representations.py +0 -0
  90. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/tests/types/test_scalar.py +0 -0
  91. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/tests/types/test_struct.py +0 -0
  92. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/tests/types/test_table.py +0 -0
  93. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/tests/types/test_table_eval.py +0 -0
  94. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/tests/types/test_vectorofvectors.py +0 -0
  95. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/tests/types/test_vovutils.py +0 -0
  96. {legend_pydataobj-1.14.1 → legend_pydataobj-1.14.3}/tests/types/test_waveformtable.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: legend_pydataobj
3
- Version: 1.14.1
3
+ Version: 1.14.3
4
4
  Summary: LEGEND Python Data Objects
5
5
  Author: The LEGEND Collaboration
6
6
  Maintainer: The LEGEND Collaboration
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: legend_pydataobj
3
- Version: 1.14.1
3
+ Version: 1.14.3
4
4
  Summary: LEGEND Python Data Objects
5
5
  Author: The LEGEND Collaboration
6
6
  Maintainer: The LEGEND Collaboration
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '1.14.1'
21
- __version_tuple__ = version_tuple = (1, 14, 1)
20
+ __version__ = version = '1.14.3'
21
+ __version_tuple__ = version_tuple = (1, 14, 3)
@@ -59,7 +59,7 @@ def _h5_write_lgdo(
59
59
  try:
60
60
  fh = h5py.File(lh5_file, mode=mode, **file_kwargs)
61
61
  except OSError as oe:
62
- raise LH5EncodeError(str(oe), lh5_file, None) from oe
62
+ raise LH5EncodeError(oe, lh5_file) from oe
63
63
 
64
64
  opened_here = True
65
65
  else:
@@ -118,7 +118,7 @@ def read(
118
118
  try:
119
119
  lh5_file = h5py.File(str(Path(lh5_file)), mode="r", locking=locking)
120
120
  except (OSError, FileExistsError) as oe:
121
- raise LH5DecodeError(str(oe), lh5_file, None) from oe
121
+ raise LH5DecodeError(oe, lh5_file) from oe
122
122
 
123
123
  close_after = True
124
124
  try:
@@ -19,6 +19,7 @@ from numpy.typing import ArrayLike
19
19
  from .. import types
20
20
  from . import _serializers, utils
21
21
  from .core import read
22
+ from .exceptions import LH5DecodeError
22
23
 
23
24
  log = logging.getLogger(__name__)
24
25
 
@@ -125,7 +126,10 @@ class LH5Store:
125
126
  "fs_page_size": page_buffer,
126
127
  }
127
128
  )
128
- h5f = h5py.File(full_path, mode, **file_kwargs)
129
+ try:
130
+ h5f = h5py.File(full_path, mode, **file_kwargs)
131
+ except (OSError, FileExistsError) as oe:
132
+ raise LH5DecodeError(oe, full_path) from oe
129
133
 
130
134
  if self.keep_open:
131
135
  if isinstance(self.keep_open, int) and len(self.files) >= self.keep_open:
@@ -8,6 +8,7 @@ from pathlib import Path
8
8
  import h5py
9
9
 
10
10
  from . import utils
11
+ from .exceptions import LH5DecodeError
11
12
  from .store import LH5Store
12
13
 
13
14
  log = logging.getLogger(__name__)
@@ -123,7 +124,10 @@ def show(
123
124
 
124
125
  # open file
125
126
  if isinstance(lh5_file, (str, Path)):
126
- lh5_file = h5py.File(utils.expand_path(Path(lh5_file)), "r", locking=False)
127
+ try:
128
+ lh5_file = h5py.File(utils.expand_path(Path(lh5_file)), "r", locking=False)
129
+ except (OSError, FileExistsError) as oe:
130
+ raise LH5DecodeError(oe, lh5_file) from oe
127
131
 
128
132
  # go to group
129
133
  if lh5_group != "/":
@@ -145,17 +149,27 @@ def show(
145
149
 
146
150
  # loop over keys
147
151
  while True:
148
- val = lh5_file[key]
149
- # we want to print the LGDO datatype
150
- dtype = val.attrs.get("datatype", default="no datatype")
151
- if dtype == "no datatype" and isinstance(val, h5py.Group):
152
- dtype = "HDF5 group"
153
-
154
- _attrs = ""
155
- if attrs:
156
- attrs_d = dict(val.attrs)
157
- attrs_d.pop("datatype", "")
158
- _attrs = "── " + str(attrs_d) if attrs_d else ""
152
+ is_link = False
153
+ link_type = lh5_file.get(key, getlink=True)
154
+ if isinstance(link_type, (h5py.SoftLink, h5py.ExternalLink)):
155
+ desc = f"-> {link_type.path}"
156
+ is_link = True
157
+
158
+ else:
159
+ val = lh5_file[key]
160
+
161
+ # we want to print the LGDO datatype
162
+ dtype = val.attrs.get("datatype", default="no datatype")
163
+ if dtype == "no datatype" and isinstance(val, h5py.Group):
164
+ dtype = "HDF5 group"
165
+
166
+ _attrs = ""
167
+ if attrs:
168
+ attrs_d = dict(val.attrs)
169
+ attrs_d.pop("datatype", "")
170
+ _attrs = "── " + str(attrs_d) if attrs_d else ""
171
+
172
+ desc = f"· {dtype} {_attrs}"
159
173
 
160
174
  # is this the last key?
161
175
  killme = False
@@ -167,9 +181,10 @@ def show(
167
181
  else:
168
182
  char = "├──"
169
183
 
170
- print(f"{indent}{char} \033[1m{key}\033[0m · {dtype} {_attrs}") # noqa: T201
184
+ print(f"{indent}{char} \033[1m{key}\033[0m {desc}") # noqa: T201
171
185
 
172
- if detail and isinstance(val, h5py.Dataset):
186
+ if not is_link and detail and isinstance(val, h5py.Dataset):
187
+ val = lh5_file[key]
173
188
  char = "| "
174
189
  if killme:
175
190
  char = " "
@@ -203,9 +218,9 @@ def show(
203
218
  print(toprint) # noqa: T201
204
219
 
205
220
  # if it's a group, call this function recursively
206
- if isinstance(val, h5py.Group):
221
+ if not is_link and isinstance(val, h5py.Group):
207
222
  show(
208
- val,
223
+ lh5_file[key],
209
224
  indent=indent + (" " if killme else "│ "),
210
225
  header=False,
211
226
  attrs=attrs,
@@ -45,7 +45,10 @@ def read_n_rows(name: str, h5f: str | Path | h5py.File) -> int | None:
45
45
  Return ``None`` if `name` is a :class:`.Scalar` or a :class:`.Struct`.
46
46
  """
47
47
  if not isinstance(h5f, h5py.File):
48
- h5f = h5py.File(h5f, "r", locking=False)
48
+ try:
49
+ h5f = h5py.File(h5f, "r", locking=False)
50
+ except (OSError, FileExistsError) as oe:
51
+ raise LH5DecodeError(oe, h5f, None) from oe
49
52
 
50
53
  try:
51
54
  h5o = h5f[name].id
@@ -61,7 +64,10 @@ def read_size_in_bytes(name: str, h5f: str | Path | h5py.File) -> int | None:
61
64
  recursively through members of a Struct or Table
62
65
  """
63
66
  if not isinstance(h5f, h5py.File):
64
- h5f = h5py.File(h5f, "r", locking=False)
67
+ try:
68
+ h5f = h5py.File(h5f, "r", locking=False)
69
+ except (OSError, FileExistsError) as oe:
70
+ raise LH5DecodeError(oe, h5f) from oe
65
71
 
66
72
  try:
67
73
  h5o = h5f[name].id
@@ -12,6 +12,19 @@ from lgdo import lh5, types
12
12
  from lgdo.lh5.exceptions import LH5DecodeError, LH5EncodeError
13
13
 
14
14
 
15
+ def test_tools(tmptestdir):
16
+ thefile = tmptestdir / "already-open-file-tools.lh5"
17
+ lh5.write(types.Struct({}), "/empty", thefile)
18
+
19
+ for mode in ("r", "r+", "w", "a"):
20
+ f = h5py.File(thefile, mode)
21
+ with pytest.raises(LH5DecodeError):
22
+ lh5.ls(thefile)
23
+ with pytest.raises(LH5DecodeError):
24
+ lh5.show(thefile)
25
+ f.close()
26
+
27
+
15
28
  def test_interact_with_already_open_files(tmptestdir):
16
29
  thefile = tmptestdir / "already-open-file.lh5"
17
30
  lh5.write(types.Struct({}), "/empty", thefile)