def checkName(self, name, object): """Limit ids Ids can only contain printable, non-space, 7-bit ASCII strings: >>> from zope.pluggableauth.plugins.idpicker import IdPicker >>> IdPicker({}).checkName(u'1', None) True >>> IdPicker({}).checkName(u'bob', None) True >>> try: ... IdPicker({}).checkName(u'bob\xfa', None) ... except UserError, e: ... print(e) ... # doctest: +NORMALIZE_WHITESPACE Ids must contain only printable 7-bit non-space ASCII characters >>> try: ... IdPicker({}).checkName(u'big bob', None) ... except UserError, e: ... print(e) ... # doctest: +NORMALIZE_WHITESPACE Ids must contain only printable 7-bit non-space ASCII characters Ids also can't be over 100 characters long: >>> IdPicker({}).checkName(u'x' * 100, None) True >>> IdPicker({}).checkName(u'x' * 101, None) Traceback (most recent call last): ... UserError: Ids can't be more than 100 characters long. """ NameChooser.checkName(self, name, object) if not ok(name): raise UserError( _("Ids must contain only printable 7-bit non-space" " ASCII characters") ) if len(name) > 100: raise UserError( _("Ids can't be more than 100 characters long.") ) return True
def test_checkName(self): container = SampleContainer() container['foo'] = 'bar' checkName = NameChooser(container).checkName # invalid type for the name self.assertRaises(TypeError, checkName, 2, object()) self.assertRaises(TypeError, checkName, [], object()) self.assertRaises(TypeError, checkName, None, object()) self.assertRaises(TypeError, checkName, None, None) # invalid names self.assertRaises(ValueError, checkName, '+foo', object()) self.assertRaises(ValueError, checkName, '@foo', object()) self.assertRaises(ValueError, checkName, 'f/oo', object()) self.assertRaises(ValueError, checkName, '', object()) # existing names self.assertRaises(KeyError, checkName, 'foo', object()) self.assertRaises(KeyError, checkName, u'foo', object()) # correct names self.assertEqual(True, checkName('2', object())) self.assertEqual(True, checkName(u'2', object())) self.assertEqual(True, checkName('other', object())) self.assertEqual(True, checkName(u'reserved', object())) self.assertEqual(True, checkName(u'r\xe9served', object())) # reserved names class ReservedNames(object): zope.component.adapts(IContainer) zope.interface.implements(IReservedNames) def __init__(self, context): self.reservedNames = set(('reserved', 'other')) zope.component.getSiteManager().registerAdapter(ReservedNames) self.assertRaises(NameReserved, checkName, 'reserved', object()) self.assertRaises(NameReserved, checkName, 'other', object()) self.assertRaises(NameReserved, checkName, u'reserved', object()) self.assertRaises(NameReserved, checkName, u'other', object())
def test_chooseName(self): container = SampleContainer() container['foo.old.rst'] = 'rst doc' nc = NameChooser(container) # correct name without changes self.assertEqual(nc.chooseName('foobar.rst', None), u'foobar.rst') self.assertEqual(nc.chooseName(u'\xe9', None), u'\xe9') # automatically modified named self.assertEqual(nc.chooseName('foo.old.rst', None), u'foo.old-2.rst') self.assertEqual(nc.chooseName('+@[email protected]', None), u'foo.old-2.rst') self.assertEqual(nc.chooseName('+@+@foo/foo+@', None), u'foo-foo+@') # empty name self.assertEqual(nc.chooseName('', None), u'NoneType') self.assertEqual(nc.chooseName('@+@', []), u'list') # if the name is not a string it is converted self.assertEqual(nc.chooseName(None, None), u'None') self.assertEqual(nc.chooseName(2, None), u'2') self.assertEqual(nc.chooseName([], None), u'[]') container['None'] = 'something' self.assertEqual(nc.chooseName(None, None), u'None-2') container['None-2'] = 'something' self.assertEqual(nc.chooseName(None, None), u'None-3') # even if the given name cannot be converted to unicode class BadBoy(object): def __unicode__(self): raise Exception # Py3: Support __str__ = __unicode__ self.assertEqual(nc.chooseName(BadBoy(), set()), u'set')
def test_chooseName(self): container = SampleContainer() container['foo.old.rst'] = 'rst doc' nc = NameChooser(container) # correct name without changes self.assertEqual(nc.chooseName('foobar.rst', None), u'foobar.rst') self.assertEqual(nc.chooseName(u'\xe9', None), u'\xe9') # automatically modified named self.assertEqual(nc.chooseName('foo.old.rst', None), u'foo.old-2.rst') self.assertEqual(nc.chooseName('+@[email protected]', None), u'foo.old-2.rst') self.assertEqual(nc.chooseName('+@+@foo/foo+@', None), u'foo-foo+@') # empty name self.assertEqual(nc.chooseName('', None), u'NoneType') self.assertEqual(nc.chooseName('@+@', []), u'list') # if the name is not a string it is converted self.assertEqual(nc.chooseName(None, None), u'None') self.assertEqual(nc.chooseName(2, None), u'2') self.assertEqual(nc.chooseName([], None), u'[]') container['None'] = 'something' self.assertEqual(nc.chooseName(None, None), u'None-2') container['None-2'] = 'something' self.assertEqual(nc.chooseName(None, None), u'None-3') # even if the given name cannot be converted to unicode class BadBoy: def __unicode__(self): raise Exception self.assertEqual(nc.chooseName(BadBoy(), set()), u'set')
def __init__(self, context): NameChooser.__init__(self, context) self.context = context