4
4
5
5
import inspect
6
6
import unittest
7
+ from typing import Callable , TypeVar , cast
7
8
8
9
import pandas as pd
9
10
import rdflib
14
15
15
16
SKIP = {"__init__" }
16
17
18
+ X = TypeVar ("X" )
17
19
18
- def _df_equal (a : pd .DataFrame , b : pd .DataFrame , msg = None ) -> bool :
19
- return a .values .tolist () == b .values .tolist ()
20
20
21
+ def _df_equal (a : pd .DataFrame , b : pd .DataFrame , msg : str | None = None ) -> bool :
22
+ return bool (a .values .tolist () == b .values .tolist ())
21
23
22
- def _rdf_equal (a : rdflib .Graph , b : rdflib .Graph , msg = None ) -> bool :
24
+
25
+ def _rdf_equal (a : rdflib .Graph , b : rdflib .Graph , msg : str | None = None ) -> bool :
23
26
return {tuple (t ) for t in a } == {tuple (t ) for t in b }
24
27
25
28
26
- def _etree_equal (a : etree .ElementTree , b : etree .ElementTree , msg = None ) -> bool :
27
- return etree .tostring (a ) == etree .tostring (b )
29
+ def _etree_equal (a : etree .ElementTree , b : etree .ElementTree , msg : str | None = None ) -> bool :
30
+ return cast ( str , etree .tostring (a )) == cast ( str , etree .tostring (b ) )
28
31
29
32
30
33
class TestExposed (unittest .TestCase ):
31
34
"""Test API exposure."""
32
35
33
36
def setUp (self ) -> None :
34
37
"""Set up the test case."""
35
- self .addTypeEqualityFunc (pd .DataFrame , _df_equal )
36
- self .addTypeEqualityFunc (rdflib .Graph , _rdf_equal )
37
- self .addTypeEqualityFunc (type (etree .ElementTree ()), _etree_equal )
38
+ self .addTypeEqualityFunc (pd .DataFrame , _df_equal ) # type:ignore[arg-type]
39
+ self .addTypeEqualityFunc (rdflib .Graph , _rdf_equal ) # type:ignore[arg-type]
40
+ self .addTypeEqualityFunc (type (etree .ElementTree ()), _etree_equal ) # type:ignore[arg-type]
38
41
39
- def assert_io (self , obj , ext : str , dump , load ):
42
+ def assert_io (
43
+ self , obj : X , extension : str , dump : Callable [..., None ], load : Callable [..., X ]
44
+ ) -> None :
40
45
"""Test an object can be dumped and loaded.
41
46
42
47
:param obj: The object to dump
43
- :param ext : The extension to use
48
+ :param extension : The extension to use
44
49
:param dump: The dump function
45
50
:param load: The load function
46
51
"""
47
- name = f"test.{ ext } "
52
+ name = f"test.{ extension } "
48
53
path = pystow .join ("test" , name = name )
49
54
if path .is_file ():
50
55
path .unlink ()
@@ -54,7 +59,7 @@ def assert_io(self, obj, ext: str, dump, load):
54
59
self .assertTrue (path .is_file ())
55
60
self .assertEqual (obj , load ("test" , name = name ))
56
61
57
- def test_exposed (self ):
62
+ def test_exposed (self ) -> None :
58
63
"""Test that all module-level functions also have a counterpart in the top-level API."""
59
64
for name , func in Module .__dict__ .items ():
60
65
if not inspect .isfunction (func ) or name in SKIP :
@@ -75,24 +80,24 @@ def test_exposed(self):
75
80
msg = f"`pystow.api.{ name } ` should be imported in `pystow.__init__`." ,
76
81
)
77
82
78
- def test_io (self ):
83
+ def test_io (self ) -> None :
79
84
"""Test IO functions."""
80
85
obj = ["a" , "b" , "c" ]
81
86
for ext , dump , load in [
82
87
("json" , pystow .dump_json , pystow .load_json ),
83
88
("pkl" , pystow .dump_pickle , pystow .load_pickle ),
84
89
]:
85
90
with self .subTest (ext = ext ):
86
- self .assert_io (obj , ext = ext , dump = dump , load = load )
91
+ self .assert_io (obj , extension = ext , dump = dump , load = load ) # type:ignore
87
92
88
- def test_pd_io (self ):
93
+ def test_pd_io (self ) -> None :
89
94
"""Test pandas IO."""
90
95
columns = list ("abc" )
91
96
data = [(1 , 2 , 3 ), (4 , 5 , 6 )]
92
97
df = pd .DataFrame (data , columns = columns )
93
- self .assert_io (df , ext = "tsv" , load = pystow .load_df , dump = pystow .dump_df )
98
+ self .assert_io (df , extension = "tsv" , load = pystow .load_df , dump = pystow .dump_df )
94
99
95
- def test_rdf_io (self ):
100
+ def test_rdf_io (self ) -> None :
96
101
"""Test RDFlib IO."""
97
102
graph = rdflib .Graph ()
98
103
graph .add (
@@ -103,12 +108,12 @@ def test_rdf_io(self):
103
108
)
104
109
)
105
110
self .assertEqual (1 , len (graph ))
106
- self .assert_io (graph , ext = "ttl" , dump = pystow .dump_rdf , load = pystow .load_rdf )
111
+ self .assert_io (graph , extension = "ttl" , dump = pystow .dump_rdf , load = pystow .load_rdf )
107
112
108
- def test_xml_io (self ):
113
+ def test_xml_io (self ) -> None :
109
114
"""Test XML I/O."""
110
115
root = etree .Element ("root" )
111
116
root .set ("interesting" , "somewhat" )
112
117
etree .SubElement (root , "test" )
113
118
my_tree = etree .ElementTree (root )
114
- self .assert_io (my_tree , ext = "xml" , dump = pystow .dump_xml , load = pystow .load_xml )
119
+ self .assert_io (my_tree , extension = "xml" , dump = pystow .dump_xml , load = pystow .load_xml )
0 commit comments