Skip to content

Commit 29a04fc

Browse files
committed
Add PyTypeObjectWrapper#subclass?
1 parent 9822751 commit 29a04fc

File tree

2 files changed

+42
-0
lines changed

2 files changed

+42
-0
lines changed

lib/pycall/pytypeobject_wrapper.rb

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,17 @@ def ===(other)
4949
end
5050
end
5151

52+
def subclass?(other)
53+
case other
54+
when PyTypeObjectWrapper
55+
__pyptr__.subclass?(other.__pyptr__)
56+
when Class, Module
57+
other >= self || false
58+
else
59+
__pyptr__.subclass?(other)
60+
end
61+
end
62+
5263
private
5364

5465
def register_python_type_mapping

spec/pycall/pytypeobject_wrapper_spec.rb

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,37 @@ module PyCall
1010
PyCall.wrap_class(simple_class)
1111
end
1212

13+
describe '#subclass?(other)' do
14+
subject { PyCall.builtins.list }
15+
16+
context 'when the value of other is a PyTypeObjectWrapper' do
17+
specify do
18+
expect(subject.subclass?(PyCall.builtins.object)).to eq(true)
19+
expect(subject.subclass?(PyCall.builtins.list)).to eq(true)
20+
expect(subject.subclass?(PyCall.builtins.dict)).to eq(false)
21+
end
22+
end
23+
24+
context 'when the value of other is a Class' do
25+
specify do
26+
expect(subject.subclass?(Object)).to eq(true)
27+
expect(subject.subclass?(PyObjectWrapper)).to eq(true)
28+
expect(subject.subclass?(PyTypeObjectWrapper)).to eq(false)
29+
expect(subject.subclass?(Array)).to eq(false)
30+
end
31+
end
32+
33+
context 'when the other cases' do
34+
it 'behaves as well as PyTypePtr#subclass?' do
35+
expect(subject.subclass?(PyCall.builtins.object.__pyptr__)).to eq(true)
36+
expect(subject.subclass?(PyCall.builtins.list.__pyptr__)).to eq(true)
37+
expect(subject.subclass?(PyCall.builtins.dict.__pyptr__)).to eq(false)
38+
expect { subject.subclass?(Conversion.from_ruby(12)) }.to raise_error(TypeError)
39+
expect { subject.subclass?(12) }.to raise_error(TypeError)
40+
end
41+
end
42+
end
43+
1344
describe '#===' do
1445
specify do
1546
expect(PyCall.builtins.tuple === PyCall.tuple()).to eq(true)

0 commit comments

Comments
 (0)