##// END OF EJS Templates
py3: handle keyword arguments correctly in hgext/patchbomb.py...
py3: handle keyword arguments correctly in hgext/patchbomb.py The keys of keyword arguments must be str on Python 3 which is unicode. This patch make sure we pass keyword arguments with keys are str everywhere in this file and access the keys depending on whether they are bytes or str. This patch uses pycompat.{byteskwargs|strkwargs} and somewhere it also added r'' to prevent transformer from adding a b'' over there. Differential Revision: https://phab.mercurial-scm.org/D974

File last commit:

r34308:afcbc6f6 default
r35035:71e63fe6 default
Show More
test-check-interfaces.py
77 lines | 2.1 KiB | text/x-python | PythonLexer
/ tests / test-check-interfaces.py
# Test that certain objects conform to well-defined interfaces.
from __future__ import absolute_import, print_function
from mercurial import (
bundlerepo,
httppeer,
localrepo,
sshpeer,
statichttprepo,
ui as uimod,
unionrepo,
)
def checkobject(o):
"""Verify a constructed object conforms to interface rules.
An object must have __abstractmethods__ defined.
All "public" attributes of the object (attributes not prefixed with
an underscore) must be in __abstractmethods__ or appear on a base class
with __abstractmethods__.
"""
name = o.__class__.__name__
allowed = set()
for cls in o.__class__.__mro__:
if not getattr(cls, '__abstractmethods__', set()):
continue
allowed |= cls.__abstractmethods__
allowed |= {a for a in dir(cls) if not a.startswith('_')}
if not allowed:
print('%s does not have abstract methods' % name)
return
public = {a for a in dir(o) if not a.startswith('_')}
for attr in sorted(public - allowed):
print('public attributes not in abstract interface: %s.%s' % (
name, attr))
# Facilitates testing localpeer.
class dummyrepo(object):
def __init__(self):
self.ui = uimod.ui()
def filtered(self, name):
pass
def _restrictcapabilities(self, caps):
pass
# Facilitates testing sshpeer without requiring an SSH server.
class testingsshpeer(sshpeer.sshpeer):
def _validaterepo(self, *args, **kwargs):
pass
class badpeer(httppeer.httppeer):
def __init__(self):
super(badpeer, self).__init__(uimod.ui(), 'http://localhost')
self.badattribute = True
def badmethod(self):
pass
def main():
ui = uimod.ui()
checkobject(badpeer())
checkobject(httppeer.httppeer(ui, 'http://localhost'))
checkobject(localrepo.localpeer(dummyrepo()))
checkobject(testingsshpeer(ui, 'ssh://localhost/foo'))
checkobject(bundlerepo.bundlepeer(dummyrepo()))
checkobject(statichttprepo.statichttppeer(dummyrepo()))
checkobject(unionrepo.unionpeer(dummyrepo()))
main()