doc: add readthedocs config
[rarfile.git] / test / test_compat.py
blob9f761c2e1df5be949964b5a7c6fdbe90147ab890
1 """Test zipfile compat.
2 """
4 import inspect
5 import sys
6 import zipfile
8 import pytest
10 import rarfile
12 # dont fail on new python by default
13 _VERS = [(3, 6), (3, 7), (3, 8)]
15 _UNSUPPORTED = sys.version_info[:2] not in _VERS
17 _ignore = set([
18 "detach",
19 "peek",
20 "read1",
21 "readinto1",
23 "seek",
25 # no kwargs
26 "readinto",
27 "readline",
28 "truncate",
29 "write",
31 # random
32 "FileHeader",
33 "from_file",
34 "testzip",
35 "writestr",
39 def load_cls_names(maincls):
40 assert inspect.isclass(maincls)
41 res = {}
42 for cls in inspect.getmro(maincls):
43 for name, val in inspect.getmembers(cls):
44 if name not in res:
45 res[name] = val
46 return res
49 def cleansig(sig):
50 res = str(sig).replace(", /", "")
51 if "*" in res:
52 res = res.split(", *", 1)[0] + ")"
53 return res
56 def compare(rmaincls, zmaincls):
57 znames = load_cls_names(zmaincls)
58 rnames = load_cls_names(rmaincls)
59 for name, zval in znames.items():
60 if not inspect.isroutine(zval) or name[0] == "_" or name in _ignore:
61 continue
62 assert name in rnames, "member not found: \"%s\"" % name
64 rval = rnames[name]
65 zsig = inspect.signature(zval)
66 rsig = inspect.signature(rval)
68 zsigstr = cleansig(zsig)
69 rsigstr = cleansig(rsig)
70 assert zsigstr == rsigstr, "sig differs: %s.%s%s != %s.%s%s" % (
71 rmaincls.__name__, name, rsigstr,
72 zmaincls.__name__, name, zsigstr)
75 @pytest.mark.skipif(_UNSUPPORTED, reason="Unsupported for sig checks")
76 def test_cmp_zipfile():
77 compare(rarfile.RarFile, zipfile.ZipFile)
80 @pytest.mark.skipif(_UNSUPPORTED, reason="Unsupported for sig checks")
81 def test_cmp_zipextfile():
82 compare(rarfile.RarExtFile, zipfile.ZipExtFile)
85 @pytest.mark.skipif(_UNSUPPORTED, reason="Unsupported for sig checks")
86 def test_cmp_zipinfo():
87 compare(rarfile.RarInfo, zipfile.ZipInfo)