Skip to content

Commit 5978c52

Browse files
committed
tests for compressed lists
1 parent 959dad1 commit 5978c52

File tree

10 files changed

+209
-20
lines changed

10 files changed

+209
-20
lines changed

setup.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ optional =
7070
summarizedexperiment>=0.4.1
7171
singlecellexperiment>=0.4.1
7272
multiassayexperiment
73-
compressed_lists>=0.1.1
73+
compressed_lists>=0.3.0
7474

7575
# Add here test requirements (semicolon/line-separated)
7676
testing =

src/rds2py/generics.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,11 @@
6363
# compressed lists
6464
"CompressedIntegerList": "rds2py.read_compressed_list.read_compressed_integer_list",
6565
"PartitioningByEnd": "rds2py.read_compressed_list.read_partitioning_by_end",
66+
"CompressedCharacterList": "rds2py.read_compressed_list.read_compressed_string_list",
67+
"CompressedLogicalList": "rds2py.read_compressed_list.read_compressed_boolean_list",
68+
"CompressedNumericList": "rds2py.read_compressed_list.read_compressed_float_list",
69+
"CompressedSplitDataFrameList": "rds2py.read_compressed_list.read_compressed_frame_list",
70+
"CompressedSplitDFrameList": "rds2py.read_compressed_list.read_compressed_frame_list",
6671
}
6772

6873

src/rds2py/read_compressed_list.py

Lines changed: 145 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,28 @@ def read_partitioning_by_end(robject: dict, **kwargs):
3535
return Partitioning(ends=np.asarray(ends))
3636

3737

38+
def _get_compressed_common_attrs(robject, **kwargs):
39+
if "unlistData" not in robject["attributes"]:
40+
raise ValueError("Object does not contain unlistData, is it really a `CompressedList`?")
41+
unlist_data = _dispatcher(robject["attributes"]["unlistData"], **kwargs)
42+
43+
element_metadata = None
44+
if "elementMetadata" in robject["attributes"]:
45+
element_metadata = _dispatcher(robject["attributes"]["elementMetadata"], **kwargs)
46+
47+
metadata = None
48+
if "metadata" in robject["attributes"]:
49+
metadata = _dispatcher(robject["attributes"]["metadata"], **kwargs)
50+
51+
partition = None
52+
if "partitioning" in robject["attributes"]:
53+
partition = _dispatcher(robject["attributes"]["partitioning"], **kwargs)
54+
55+
return unlist_data, element_metadata, metadata, partition
56+
57+
3858
def read_compressed_integer_list(robject: dict, **kwargs):
39-
"""Read an R compressed list.
59+
"""Read an R compressed integer list.
4060
4161
Args:
4262
robject:
@@ -53,24 +73,134 @@ def read_compressed_integer_list(robject: dict, **kwargs):
5373
if _cls not in ["CompressedIntegerList"]:
5474
raise RuntimeError(f"`robject` does not contain not a compressed integer list object, contains `{_cls}`.")
5575

56-
if "unlistData" not in robject["attributes"]:
57-
raise ValueError("Object does not contain unlistData, is it really a `compressedList`?")
58-
unlist_data = _dispatcher(robject["attributes"]["unlistData"], **kwargs)
76+
unlist_data, element_metadata, metadata, partition = _get_compressed_common_attrs(robject=robject, **kwargs)
5977

60-
element_metadata = None
61-
if "elementMetadata" in robject["attributes"]:
62-
element_metadata = _dispatcher(robject["attributes"]["elementMetadata"], **kwargs)
78+
from compressed_lists import CompressedIntegerList
6379

64-
metadata = None
65-
if "metadata" in robject["attributes"]:
66-
metadata = _dispatcher(robject["attributes"]["metadata"], **kwargs)
80+
return CompressedIntegerList(
81+
unlist_data=unlist_data, partitioning=partition, element_metadata=element_metadata, metadata=metadata
82+
)
6783

68-
partition = None
69-
if "partitioning" in robject["attributes"]:
70-
partition = _dispatcher(robject["attributes"]["partitioning"], **kwargs)
7184

72-
from compressed_lists import CompressedIntegerList
85+
def read_compressed_string_list(robject: dict, **kwargs):
86+
"""Read an R compressed string/character list.
7387
74-
return CompressedIntegerList(
88+
Args:
89+
robject:
90+
Dictionary containing parsed compressed list.
91+
92+
**kwargs:
93+
Additional arguments.
94+
95+
Returns:
96+
A `CompressedList` from the 'compressed_lists' package.
97+
"""
98+
_cls = get_class(robject)
99+
100+
if _cls not in ["CompressedCharacterList"]:
101+
raise RuntimeError(f"`robject` does not contain not a compressed string list object, contains `{_cls}`.")
102+
103+
unlist_data, element_metadata, metadata, partition = _get_compressed_common_attrs(robject=robject, **kwargs)
104+
105+
from compressed_lists import CompressedCharacterList
106+
107+
return CompressedCharacterList(
108+
unlist_data=unlist_data, partitioning=partition, element_metadata=element_metadata, metadata=metadata
109+
)
110+
111+
112+
def read_compressed_character_list(robject: dict, **kwargs):
113+
"""Read an R compressed string/character list.
114+
115+
Args:
116+
robject:
117+
Dictionary containing parsed compressed string list.
118+
119+
**kwargs:
120+
Additional arguments.
121+
122+
Returns:
123+
A `CompressedList` from the 'compressed_lists' package.
124+
"""
125+
return read_compressed_string_list(robject, **kwargs)
126+
127+
128+
def read_compressed_boolean_list(robject: dict, **kwargs):
129+
"""Read an R compressed boolean list.
130+
131+
Args:
132+
robject:
133+
Dictionary containing parsed compressed list.
134+
135+
**kwargs:
136+
Additional arguments.
137+
138+
Returns:
139+
A `CompressedList` from the 'compressed_lists' package.
140+
"""
141+
_cls = get_class(robject)
142+
143+
if _cls not in ["CompressedLogicalList"]:
144+
raise RuntimeError(f"`robject` does not contain not a compressed boolean list object, contains `{_cls}`.")
145+
146+
unlist_data, element_metadata, metadata, partition = _get_compressed_common_attrs(robject=robject, **kwargs)
147+
148+
from compressed_lists import CompressedBooleanList
149+
150+
return CompressedBooleanList(
151+
unlist_data=unlist_data, partitioning=partition, element_metadata=element_metadata, metadata=metadata
152+
)
153+
154+
155+
def read_compressed_float_list(robject: dict, **kwargs):
156+
"""Read an R compressed float list.
157+
158+
Args:
159+
robject:
160+
Dictionary containing parsed compressed list.
161+
162+
**kwargs:
163+
Additional arguments.
164+
165+
Returns:
166+
A `CompressedList` from the 'compressed_lists' package.
167+
"""
168+
_cls = get_class(robject)
169+
170+
if _cls not in ["CompressedNumericList"]:
171+
raise RuntimeError(f"`robject` does not contain not a compressed float list object, contains `{_cls}`.")
172+
173+
unlist_data, element_metadata, metadata, partition = _get_compressed_common_attrs(robject=robject, **kwargs)
174+
175+
from compressed_lists import CompressedFloatList
176+
177+
return CompressedFloatList(
178+
unlist_data=unlist_data, partitioning=partition, element_metadata=element_metadata, metadata=metadata
179+
)
180+
181+
182+
def read_compressed_frame_list(robject: dict, **kwargs):
183+
"""Read an R compressed dataframe list.
184+
185+
Args:
186+
robject:
187+
Dictionary containing parsed compressed list.
188+
189+
**kwargs:
190+
Additional arguments.
191+
192+
Returns:
193+
A `CompressedList` from the 'compressed_lists' package.
194+
"""
195+
_cls = get_class(robject)
196+
197+
if _cls not in ["CompressedSplitDataFrameList", "CompressedSplitDFrameList"]:
198+
raise RuntimeError(f"`robject` does not contain not a compressed dataframe list object, contains `{_cls}`.")
199+
200+
unlist_data, element_metadata, metadata, partition = _get_compressed_common_attrs(robject=robject, **kwargs)
201+
202+
from compressed_lists import CompressedSplitBiocFrameList
203+
204+
return CompressedSplitBiocFrameList(
75205
unlist_data=unlist_data, partitioning=partition, element_metadata=element_metadata, metadata=metadata
76206
)

tests/data/compressedlist_char.rds

284 Bytes
Binary file not shown.

tests/data/compressedlist_int.rds

-1 Bytes
Binary file not shown.
260 Bytes
Binary file not shown.
297 Bytes
Binary file not shown.
1.49 KB
Binary file not shown.

tests/data/generate_files.R

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,4 +201,18 @@ x <- IntegerList(11:12, integer(0), 3:-2, compress=TRUE)
201201
saveRDS(x, "compressedlist_int.rds")
202202

203203
clist <- CharacterList(LETTERS[1:5], LETTERS[20:24], compress=TRUE)
204-
clist
204+
saveRDS(clist, "compressedlist_char.rds")
205+
206+
x <- NumericList(11.1, 12.2, 13.3, 14.4, 15.5, compress=TRUE)
207+
saveRDS(x, "compressedlist_numeric.rds")
208+
209+
210+
x <- LogicalList(TRUE, FALSE, TRUE, compress=TRUE)
211+
saveRDS(x, "compressedlist_logical.rds")
212+
213+
data("airquality")
214+
aq <- DataFrame(airquality)
215+
aqsplit <-
216+
SplitDataFrameList(as.list(split(aq, aq[["Ozone"]])),
217+
compress = TRUE)
218+
saveRDS(aqsplit, "compressedlist_splitdframe.rds")

tests/test_clists.py

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import biocutils as ut
2+
import compressed_lists as clist
23
import pytest
3-
from compressed_lists import CompressedIntegerList
44

55
from rds2py import read_rds
66

@@ -15,5 +15,45 @@ def test_compressed_lists_int():
1515
assert obj is not None
1616
assert len(obj) > 0
1717

18-
assert isinstance(obj, CompressedIntegerList)
19-
assert obj.to_list().as_list() == [11, 12, 3, 2, 1, 0, -1, -2]
18+
assert isinstance(obj, clist.CompressedIntegerList)
19+
assert obj.to_list() == [[11, 12], [None], [3, 2, 1, 0, -1, -2]]
20+
21+
22+
def test_compressed_lists_char():
23+
obj = read_rds("tests/data/compressedlist_char.rds")
24+
25+
assert obj is not None
26+
assert len(obj) > 0
27+
28+
assert isinstance(obj, clist.CompressedCharacterList)
29+
assert obj.to_list() == [["A", "B", "C", "D", "E"], ["T", "U", "V", "W", "X"]]
30+
31+
32+
def test_compressed_lists_floats():
33+
obj = read_rds("tests/data/compressedlist_numeric.rds")
34+
35+
assert obj is not None
36+
assert len(obj) > 0
37+
38+
assert isinstance(obj, clist.CompressedFloatList)
39+
assert obj.to_list() == [[11.1], [12.2], [13.3], [14.4], [15.5]]
40+
41+
42+
def test_compressed_lists_bool():
43+
obj = read_rds("tests/data/compressedlist_logical.rds")
44+
45+
assert obj is not None
46+
assert len(obj) > 0
47+
48+
assert isinstance(obj, clist.CompressedBooleanList)
49+
assert obj.to_list() == [[True], [False], [True]]
50+
51+
52+
def test_compressed_lists_dframe():
53+
obj = read_rds("tests/data/compressedlist_splitdframe.rds")
54+
55+
assert obj is not None
56+
assert len(obj) > 0
57+
58+
assert isinstance(obj, clist.CompressedSplitBiocFrameList)
59+
assert obj.unlist().shape == (153, 6)

0 commit comments

Comments
 (0)