Skip to content

Commit 48b2d2c

Browse files
committed
Python: Make isSequence() and isMapping() tests version specific
Since unicode/bytes difference, output can't match between Python 2 and Python 3.
1 parent bacd491 commit 48b2d2c

File tree

8 files changed

+89
-3
lines changed

8 files changed

+89
-3
lines changed
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
| mapping | builtin-class collections.defaultdict |
2+
| mapping | builtin-class dict |
3+
| mapping | class MyDictSubclass |
4+
| mapping | class MyMappingABC |
5+
| mapping | class OrderedDict |
6+
| neither sequence nor mapping | builtin-class set |
7+
| sequence | builtin-class list |
8+
| sequence | builtin-class str |
9+
| sequence | builtin-class tuple |
10+
| sequence | builtin-class unicode |
11+
| sequence | class MySequenceABC |
12+
| sequence | class MySequenceImpl |
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
semmle-extractor-options: --lang=2 --max-import-depth=2

python/ql/test/library-tests/PointsTo/class_properties/test.py renamed to python/ql/test/2/library-tests/PointsTo/class_properties/test.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
from collections import OrderedDict, defaultdict
2-
import collections.abc
2+
3+
# Python 2 specific
4+
from collections import Sequence, Mapping
35

46
def test(*args):
57
pass
68

7-
class MySequenceABC(collections.abc.Sequence):
9+
class MySequenceABC(Sequence):
810
pass
911

10-
class MyMappingABC(collections.abc.Mapping):
12+
class MyMappingABC(Mapping):
1113
pass
1214

1315
class MySequenceImpl(object):
@@ -24,6 +26,7 @@ class MyDictSubclass(dict):
2426
list,
2527
tuple,
2628
str,
29+
unicode,
2730
bytes,
2831
MySequenceABC,
2932
MySequenceImpl,
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import python
2+
3+
from ClassValue cls, string res
4+
where
5+
exists(CallNode call |
6+
call.getFunction().(NameNode).getId() = "test" and
7+
call.getAnArg().pointsTo(cls)
8+
) and
9+
(
10+
cls.isSequence() and
11+
cls.isMapping() and
12+
res = "IS BOTH. SHOULD NOT HAPPEN. THEY ARE MUTUALLY EXCLUSIVE."
13+
or
14+
cls.isSequence() and not cls.isMapping() and res = "sequence"
15+
or
16+
not cls.isSequence() and cls.isMapping() and res = "mapping"
17+
or
18+
not cls.isSequence() and not cls.isMapping() and res = "neither sequence nor mapping"
19+
)
20+
select res, cls.toString()
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
from collections import OrderedDict, defaultdict
2+
3+
# Python 3 specific
4+
from collections.abc import Sequence, Mapping
5+
6+
def test(*args):
7+
pass
8+
9+
class MySequenceABC(Sequence):
10+
pass
11+
12+
class MyMappingABC(Mapping):
13+
pass
14+
15+
class MySequenceImpl(object):
16+
def __getitem__(self, key):
17+
pass
18+
19+
def __len__(self):
20+
pass
21+
22+
class MyDictSubclass(dict):
23+
pass
24+
25+
test(
26+
list,
27+
tuple,
28+
str,
29+
unicode,
30+
bytes,
31+
MySequenceABC,
32+
MySequenceImpl,
33+
set,
34+
dict,
35+
OrderedDict,
36+
defaultdict,
37+
MyMappingABC,
38+
MyDictSubclass,
39+
)
40+
41+
for seq_cls in (list, tuple, str, bytes):
42+
assert issubclass(seq_cls, collections.abc.Sequence)
43+
assert not issubclass(seq_cls, collections.abc.Mapping)
44+
45+
for map_cls in (dict, OrderedDict, defaultdict):
46+
assert not issubclass(map_cls, collections.abc.Sequence)
47+
assert issubclass(map_cls, collections.abc.Mapping)
48+
49+
assert not issubclass(set, collections.abc.Sequence)
50+
assert not issubclass(set, collections.abc.Mapping)

0 commit comments

Comments
 (0)