Mercurial > public > mercurial-scm > hg
comparison mercurial/wireprototypes.py @ 37296:78103e4138b1
wireproto: port protocol handler to zope.interface
zope.interface is superior to the abc module. Let's port to it.
As part of this, we add tests for interface conformance for
classes implementing the interface.
Differential Revision: https://phab.mercurial-scm.org/D2983
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Fri, 23 Mar 2018 16:24:53 -0700 |
parents | 27527d8cff5c |
children | afcfdf53e4b5 |
comparison
equal
deleted
inserted
replaced
37295:45b39c69fae0 | 37296:78103e4138b1 |
---|---|
3 # This software may be used and distributed according to the terms of the | 3 # This software may be used and distributed according to the terms of the |
4 # GNU General Public License version 2 or any later version. | 4 # GNU General Public License version 2 or any later version. |
5 | 5 |
6 from __future__ import absolute_import | 6 from __future__ import absolute_import |
7 | 7 |
8 import abc | 8 from .thirdparty.zope import ( |
9 interface as zi, | |
10 ) | |
9 | 11 |
10 # Names of the SSH protocol implementations. | 12 # Names of the SSH protocol implementations. |
11 SSHV1 = 'ssh-v1' | 13 SSHV1 = 'ssh-v1' |
12 # These are advertised over the wire. Increment the counters at the end | 14 # These are advertised over the wire. Increment the counters at the end |
13 # to reflect BC breakages. | 15 # to reflect BC breakages. |
93 using the application/mercurial-0.1 media type. | 95 using the application/mercurial-0.1 media type. |
94 """ | 96 """ |
95 def __init__(self, gen=None): | 97 def __init__(self, gen=None): |
96 self.gen = gen | 98 self.gen = gen |
97 | 99 |
98 class baseprotocolhandler(object): | 100 class baseprotocolhandler(zi.Interface): |
99 """Abstract base class for wire protocol handlers. | 101 """Abstract base class for wire protocol handlers. |
100 | 102 |
101 A wire protocol handler serves as an interface between protocol command | 103 A wire protocol handler serves as an interface between protocol command |
102 handlers and the wire protocol transport layer. Protocol handlers provide | 104 handlers and the wire protocol transport layer. Protocol handlers provide |
103 methods to read command arguments, redirect stdio for the duration of | 105 methods to read command arguments, redirect stdio for the duration of |
104 the request, handle response types, etc. | 106 the request, handle response types, etc. |
105 """ | 107 """ |
106 | 108 |
107 __metaclass__ = abc.ABCMeta | 109 name = zi.Attribute( |
108 | |
109 @abc.abstractproperty | |
110 def name(self): | |
111 """The name of the protocol implementation. | 110 """The name of the protocol implementation. |
112 | 111 |
113 Used for uniquely identifying the transport type. | 112 Used for uniquely identifying the transport type. |
114 """ | 113 """) |
115 | 114 |
116 @abc.abstractmethod | 115 def getargs(args): |
117 def getargs(self, args): | |
118 """return the value for arguments in <args> | 116 """return the value for arguments in <args> |
119 | 117 |
120 returns a list of values (same order as <args>)""" | 118 returns a list of values (same order as <args>)""" |
121 | 119 |
122 @abc.abstractmethod | 120 def forwardpayload(fp): |
123 def forwardpayload(self, fp): | |
124 """Read the raw payload and forward to a file. | 121 """Read the raw payload and forward to a file. |
125 | 122 |
126 The payload is read in full before the function returns. | 123 The payload is read in full before the function returns. |
127 """ | 124 """ |
128 | 125 |
129 @abc.abstractmethod | 126 def mayberedirectstdio(): |
130 def mayberedirectstdio(self): | |
131 """Context manager to possibly redirect stdio. | 127 """Context manager to possibly redirect stdio. |
132 | 128 |
133 The context manager yields a file-object like object that receives | 129 The context manager yields a file-object like object that receives |
134 stdout and stderr output when the context manager is active. Or it | 130 stdout and stderr output when the context manager is active. Or it |
135 yields ``None`` if no I/O redirection occurs. | 131 yields ``None`` if no I/O redirection occurs. |
138 so it may be sent in the response. Some transports support streaming | 134 so it may be sent in the response. Some transports support streaming |
139 stdio to the client in real time. For these transports, stdio output | 135 stdio to the client in real time. For these transports, stdio output |
140 won't be captured. | 136 won't be captured. |
141 """ | 137 """ |
142 | 138 |
143 @abc.abstractmethod | 139 def client(): |
144 def client(self): | |
145 """Returns a string representation of this client (as bytes).""" | 140 """Returns a string representation of this client (as bytes).""" |
146 | 141 |
147 @abc.abstractmethod | 142 def addcapabilities(repo, caps): |
148 def addcapabilities(self, repo, caps): | |
149 """Adds advertised capabilities specific to this protocol. | 143 """Adds advertised capabilities specific to this protocol. |
150 | 144 |
151 Receives the list of capabilities collected so far. | 145 Receives the list of capabilities collected so far. |
152 | 146 |
153 Returns a list of capabilities. The passed in argument can be returned. | 147 Returns a list of capabilities. The passed in argument can be returned. |
154 """ | 148 """ |
155 | 149 |
156 @abc.abstractmethod | 150 def checkperm(perm): |
157 def checkperm(self, perm): | |
158 """Validate that the client has permissions to perform a request. | 151 """Validate that the client has permissions to perform a request. |
159 | 152 |
160 The argument is the permission required to proceed. If the client | 153 The argument is the permission required to proceed. If the client |
161 doesn't have that permission, the exception should raise or abort | 154 doesn't have that permission, the exception should raise or abort |
162 in a protocol specific manner. | 155 in a protocol specific manner. |