##// END OF EJS Templates
DEV: Add ForwardDeclaredType and ForwardDeclaredInstance trait types....
Scott Sanderson -
Show More
@@ -20,7 +20,7 b' from IPython.utils.traitlets import ('
20 20 Int, Long, Integer, Float, Complex, Bytes, Unicode, TraitError,
21 21 Undefined, Type, This, Instance, TCPAddress, List, Tuple,
22 22 ObjectName, DottedObjectName, CRegExp, link, directional_link,
23 EventfulList, EventfulDict
23 EventfulList, EventfulDict, ForwardDeclaredType, ForwardDeclaredInstance,
24 24 )
25 25 from IPython.utils import py3compat
26 26 from IPython.testing.decorators import skipif
@@ -969,6 +969,23 b' class TestInstanceList(TraitTestBase):'
969 969 _good_values = [[Foo(), Foo(), None], None]
970 970 _bad_values = [['1', 2,], '1', [Foo]]
971 971
972 class ForwardDeclaredInstanceListTrait(HasTraits):
973
974 value = List(ForwardDeclaredInstance('Foo'))
975
976 class TestForwardDeclaredInstanceList(TraitTestBase):
977
978 obj = ForwardDeclaredInstanceListTrait()
979
980 def test_klass(self):
981 """Test that the instance klass is properly assigned."""
982 self.assertIs(self.obj.traits()['value']._trait.klass, Foo)
983
984 _default_value = []
985 _good_values = [[Foo(), Foo(), None], None]
986 _bad_values = [['1', 2,], '1', [Foo]]
987
988
972 989 class LenListTrait(HasTraits):
973 990
974 991 value = List(Int, [0], minlen=1, maxlen=2)
@@ -1320,3 +1337,33 b' class TestEventful(TestCase):'
1320 1337
1321 1338 # Is the output correct?
1322 1339 self.assertEqual(a.x, {c: c for c in 'bz'})
1340
1341
1342 class ForwardDeclaredBar(object):
1343 pass
1344
1345 class ForwardDeclaredBarSub(ForwardDeclaredBar):
1346 pass
1347
1348 class ForwardDeclaredInstanceTrait(HasTraits):
1349
1350 value = ForwardDeclaredInstance(klass='ForwardDeclaredBar')
1351
1352 class TestForwardDeclaredInstanceTrait(TraitTestBase):
1353
1354 obj = ForwardDeclaredInstanceTrait()
1355 _default_value = None
1356 _good_values = [None, ForwardDeclaredBar(), ForwardDeclaredBarSub()]
1357 _bad_values = ['foo', 3, ForwardDeclaredBar, ForwardDeclaredBarSub]
1358
1359
1360 class ForwardDeclaredTypeTrait(HasTraits):
1361
1362 value = ForwardDeclaredType(klass='ForwardDeclaredBar')
1363
1364 class TestForwardDeclaredInstanceTrait(TraitTestBase):
1365
1366 obj = ForwardDeclaredTypeTrait()
1367 _default_value = None
1368 _good_values = [None, ForwardDeclaredBar, ForwardDeclaredBarSub]
1369 _bad_values = ['foo', 3, ForwardDeclaredBar(), ForwardDeclaredBarSub()]
@@ -967,6 +967,35 b' class Instance(ClassBasedTraitType):'
967 967 return dv
968 968
969 969
970 class ForwardDeclaredMixin(object):
971 """
972 Mixin for forward-declared versions of Instance and Type.
973 """
974 def _resolve_classes(self):
975 """
976 Find the specified class name by looking for it in the module in which
977 our this_class attribute was defined.
978 """
979 try:
980 modname = self.this_class.__module__
981 self.klass = import_item('.'.join([modname, self.klass]))
982 except AttributeError:
983 raise ImportError(
984 "Module {} has no attribute {}".format(modname, self.klass)
985 )
986
987 class ForwardDeclaredType(ForwardDeclaredMixin, Type):
988 """
989 Forward-declared version of Type.
990 """
991 pass
992
993 class ForwardDeclaredInstance(ForwardDeclaredMixin, Instance):
994 """
995 Forward-declared version of Instance.
996 """
997 pass
998
970 999 class This(ClassBasedTraitType):
971 1000 """A trait for instances of the class containing this trait.
972 1001
General Comments 0
You need to be logged in to leave comments. Login now