Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sagemath
GitHub Repository: sagemath/sagesmc
Path: blob/master/src/sage/dev/test/server_proxy.py
8815 views
1
r"""
2
Trac Server Proxy for Doctesting
3
4
This module provides substitutes for the server proxy used by
5
:class:`sage.dev.trac_interface.TracInterface` for doctesting.
6
7
AUTHORS:
8
9
- Julian Rueth: initial version
10
11
"""
12
#*****************************************************************************
13
# Copyright (C) 2013 Julian Rueth <[email protected]>
14
#
15
# Distributed under the terms of the GNU General Public License (GPL)
16
# as published by the Free Software Foundation; either version 2 of
17
# the License, or (at your option) any later version.
18
# http://www.gnu.org/licenses/
19
#*****************************************************************************
20
21
import sage.dev.trac_interface
22
23
class DoctestServerProxy(object):
24
r"""
25
A server proxy which can be used by
26
:meth:`sage.dev.test.trac_interface.DoctestTracInterface._anonymous_server_proxy`
27
for doctesting.
28
29
EXAMPLES::
30
31
sage: from sage.dev.test.server_proxy import DoctestServerProxy
32
sage: from sage.dev.test.trac_server import DoctestTracServer
33
sage: DoctestServerProxy(DoctestTracServer())
34
<sage.dev.test.server_proxy.DoctestServerProxy object at 0x...>
35
36
"""
37
def __init__(self, server):
38
r"""
39
Initialization.
40
41
TESTS::
42
43
sage: from sage.dev.test.trac_interface import DoctestTracInterface
44
sage: from sage.dev.test.config import DoctestConfig
45
sage: from sage.dev.test.user_interface import DoctestUserInterface
46
sage: from sage.dev.test.trac_server import DoctestTracServer
47
sage: config = DoctestConfig()
48
sage: UI = DoctestUserInterface(config['UI'])
49
sage: trac = DoctestTracInterface(config['trac'], UI, DoctestTracServer())
50
sage: type(trac._anonymous_server_proxy)
51
<class 'sage.dev.test.server_proxy.DoctestServerProxy'>
52
53
"""
54
self._server = server
55
56
self.ticket = DoctestTicketProxy(self)
57
self.sshkeys = DoctestSshkeysProxy(self)
58
59
def _check_authentication(self, privilege):
60
r"""
61
Check whether the user has sufficient permissions to perform an action
62
which requires ``privilege``.
63
64
EXAMPLES::
65
66
sage: from sage.dev.test.trac_interface import DoctestTracInterface
67
sage: from sage.dev.test.config import DoctestConfig
68
sage: from sage.dev.test.user_interface import DoctestUserInterface
69
sage: from sage.dev.test.trac_server import DoctestTracServer
70
sage: config = DoctestConfig()
71
sage: config['trac']['password'] = 'secret'
72
sage: UI = DoctestUserInterface(config['UI'])
73
sage: trac = DoctestTracInterface(config['trac'], UI, DoctestTracServer())
74
sage: trac._anonymous_server_proxy._check_authentication("TICKET_CREATE")
75
Traceback (most recent call last):
76
...
77
TracInternalError: <Fault 403: "TICKET_CREATE privileges are required to perform this operation. You don't have the required permissions.">
78
sage: trac._authenticated_server_proxy._check_authentication("TICKET_CREATE")
79
80
"""
81
from sage.dev.trac_error import TracInternalError
82
import xmlrpclib
83
raise TracInternalError(xmlrpclib.Fault(403, "%s privileges are required to perform this operation. You don't have the required permissions."%privilege))
84
85
class AuthenticatedDoctestServerProxy(DoctestServerProxy):
86
r"""
87
A server proxy which can be used by
88
:meth:`sage.dev.test.trac_interface.DoctestTracInterface._anonymous_server_proxy`
89
for doctesting.
90
91
EXAMPLES::
92
93
sage: from sage.dev.test.server_proxy import AuthenticatedDoctestServerProxy
94
sage: from sage.dev.test.trac_server import DoctestTracServer
95
sage: AuthenticatedDoctestServerProxy(DoctestTracServer(), 'username', 'password')
96
<sage.dev.test.server_proxy.AuthenticatedDoctestServerProxy object at 0x...>
97
98
"""
99
def __init__(self, server, username, password):
100
r"""
101
Initialization.
102
103
TESTS::
104
105
sage: from sage.dev.test.trac_interface import DoctestTracInterface
106
sage: from sage.dev.test.config import DoctestConfig
107
sage: from sage.dev.test.user_interface import DoctestUserInterface
108
sage: from sage.dev.test.trac_server import DoctestTracServer
109
sage: config = DoctestConfig()
110
sage: config['trac']['password'] = 'secret'
111
sage: UI = DoctestUserInterface(config['UI'])
112
sage: trac = DoctestTracInterface(config['trac'], UI, DoctestTracServer())
113
sage: type(trac._authenticated_server_proxy)
114
<class 'sage.dev.test.server_proxy.AuthenticatedDoctestServerProxy'>
115
116
"""
117
DoctestServerProxy.__init__(self, server)
118
119
self._username = username
120
self._password = password
121
122
def _check_authentication(self, privilege):
123
r"""
124
Check whether the user has sufficient permissions to perform an action
125
which requires ``privilege``.
126
127
EXAMPLES::
128
129
sage: from sage.dev.test.trac_interface import DoctestTracInterface
130
sage: from sage.dev.test.config import DoctestConfig
131
sage: from sage.dev.test.user_interface import DoctestUserInterface
132
sage: from sage.dev.test.trac_server import DoctestTracServer
133
sage: config = DoctestConfig()
134
sage: config['trac']['password'] = 'secret'
135
sage: UI = DoctestUserInterface(config['UI'])
136
sage: trac = DoctestTracInterface(config['trac'], UI, DoctestTracServer())
137
sage: trac._anonymous_server_proxy._check_authentication("TICKET_CREATE")
138
Traceback (most recent call last):
139
...
140
TracInternalError: <Fault 403: "TICKET_CREATE privileges are required to perform this operation. You don't have the required permissions.">
141
sage: trac._authenticated_server_proxy._check_authentication("TICKET_CREATE")
142
143
"""
144
pass
145
146
class DoctestSshkeysProxy(object):
147
r"""
148
A proxy object for the ``sshkeys`` property of a
149
:class:`DoctestServerProxy`.
150
151
EXAMPLES::
152
153
sage: from sage.dev.test.server_proxy import DoctestServerProxy
154
sage: from sage.dev.test.trac_server import DoctestTracServer
155
sage: DoctestServerProxy(DoctestTracServer()).sshkeys
156
<sage.dev.test.server_proxy.DoctestSshkeysProxy object at 0x...>
157
158
"""
159
def __init__(self, server_proxy):
160
r"""
161
Initialization.
162
163
TESTS::
164
165
sage: from sage.dev.test.trac_interface import DoctestTracInterface
166
sage: from sage.dev.test.config import DoctestConfig
167
sage: from sage.dev.test.user_interface import DoctestUserInterface
168
sage: from sage.dev.test.trac_server import DoctestTracServer
169
sage: config = DoctestConfig()
170
sage: UI = DoctestUserInterface(config['UI'])
171
sage: trac = DoctestTracInterface(config['trac'], UI, DoctestTracServer())
172
sage: type(trac._anonymous_server_proxy.sshkeys)
173
<class 'sage.dev.test.server_proxy.DoctestSshkeysProxy'>
174
175
"""
176
self._server_proxy = server_proxy
177
178
def addkey(self, public_key):
179
r"""
180
Add public key ``public_key`` for the authenticated user.
181
182
INPUT:
183
184
- ``public_key`` -- a string
185
186
EXAMPLES::
187
188
sage: from sage.dev.test.trac_interface import DoctestTracInterface
189
sage: from sage.dev.test.config import DoctestConfig
190
sage: from sage.dev.test.user_interface import DoctestUserInterface
191
sage: from sage.dev.test.trac_server import DoctestTracServer
192
sage: config = DoctestConfig()
193
sage: config['trac']['password'] = 'secret'
194
sage: UI = DoctestUserInterface(config['UI'])
195
sage: trac = DoctestTracInterface(config['trac'], UI, DoctestTracServer())
196
sage: trac._authenticated_server_proxy.sshkeys.addkey('foo')
197
0
198
199
"""
200
from sage.dev.trac_error import TracInternalError
201
try:
202
self._server_proxy._check_authentication('SSHKEYS')
203
except TracInternalError:
204
import xmlrpclib
205
raise TracInternalError(xmlrpclib.Fault(1, "'cannot set ssh keys for anonymous users' while executing 'sshkeys.addkey()'"))
206
207
pass # we don't implement the full interface
208
209
return 0
210
211
class DoctestTicketProxy(object):
212
r"""
213
A proxy object for the ``ticket`` property of a
214
:class:`DoctestServerProxy`.
215
216
EXAMPLES::
217
218
sage: from sage.dev.test.server_proxy import DoctestServerProxy
219
sage: from sage.dev.test.trac_server import DoctestTracServer
220
sage: DoctestServerProxy(DoctestTracServer()).ticket
221
<sage.dev.test.server_proxy.DoctestTicketProxy object at 0x...>
222
223
"""
224
def __init__(self, server_proxy):
225
r"""
226
Initialization.
227
228
TESTS::
229
230
sage: from sage.dev.test.trac_interface import DoctestTracInterface
231
sage: from sage.dev.test.config import DoctestConfig
232
sage: from sage.dev.test.user_interface import DoctestUserInterface
233
sage: from sage.dev.test.trac_server import DoctestTracServer
234
sage: config = DoctestConfig()
235
sage: UI = DoctestUserInterface(config['UI'])
236
sage: trac = DoctestTracInterface(config['trac'], UI, DoctestTracServer())
237
sage: type(trac._anonymous_server_proxy.ticket)
238
<class 'sage.dev.test.server_proxy.DoctestTicketProxy'>
239
240
"""
241
self._server_proxy = server_proxy
242
243
def create(self, summary, description, attributes, notify=False):
244
r"""
245
Create a new ticket and return its ticket number.
246
247
EXAMPLES::
248
249
sage: from sage.dev.test.trac_interface import DoctestTracInterface
250
sage: from sage.dev.test.config import DoctestConfig
251
sage: from sage.dev.test.user_interface import DoctestUserInterface
252
sage: from sage.dev.test.trac_server import DoctestTracServer
253
sage: config = DoctestConfig()
254
sage: config['trac']['password'] = 'secret'
255
sage: UI = DoctestUserInterface(config['UI'])
256
sage: trac = DoctestTracInterface(config['trac'], UI, DoctestTracServer())
257
sage: trac._authenticated_server_proxy.ticket.create('summary', 'description', {})
258
1
259
260
"""
261
self._server_proxy._check_authentication("TICKET_CREATE")
262
263
from trac_server import Ticket
264
ticket = len(self._server_proxy._server.tickets)+1
265
self._server_proxy._server.tickets[ticket] = Ticket(ticket, summary, description, attributes)
266
return ticket
267
268
def update(self, ticket, comment, attributes, notify=False):
269
r"""
270
Add a ``comment`` and update ``attributes`` of ``ticket``.
271
272
OUTPUT:
273
274
Returns a fake URL of the ticket.
275
276
EXAMPLES::
277
278
sage: from sage.dev.test.trac_interface import DoctestTracInterface
279
sage: from sage.dev.test.config import DoctestConfig
280
sage: from sage.dev.test.user_interface import DoctestUserInterface
281
sage: from sage.dev.test.trac_server import DoctestTracServer
282
sage: config = DoctestConfig()
283
sage: config['trac']['password'] = 'secret'
284
sage: UI = DoctestUserInterface(config['UI'])
285
sage: trac = DoctestTracInterface(config['trac'], UI, DoctestTracServer())
286
sage: ticket = trac._authenticated_server_proxy.ticket.create('summary', 'description', {})
287
sage: trac._authenticated_server_proxy.ticket.update(ticket, 'comment', {'component':'algebra'})
288
'https://trac.sagemath.org/ticket/1#comment:1'
289
290
"""
291
self._server_proxy._check_authentication("TICKET_MODIFY")
292
293
ticket = self._server_proxy._server.tickets[ticket]
294
ticket.comments.append(comment)
295
ticket.attributes = attributes
296
297
from sage.env import TRAC_SERVER_URI
298
import urlparse
299
return urlparse.urljoin(TRAC_SERVER_URI, 'ticket/%s#comment:%s'%(ticket.id, len(ticket.comments)))
300
301
def get(self, ticket):
302
r"""
303
Return a tuple ``(ticket, time_created, time_changed, attributes)`` for
304
``ticket``.
305
306
EXAMPLES::
307
308
sage: from sage.dev.test.trac_interface import DoctestTracInterface
309
sage: from sage.dev.test.config import DoctestConfig
310
sage: from sage.dev.test.user_interface import DoctestUserInterface
311
sage: from sage.dev.test.trac_server import DoctestTracServer
312
sage: config = DoctestConfig()
313
sage: config['trac']['password'] = 'secret'
314
sage: UI = DoctestUserInterface(config['UI'])
315
sage: trac = DoctestTracInterface(config['trac'], UI, DoctestTracServer())
316
sage: ticket = trac._authenticated_server_proxy.ticket.create('summary', 'description', {})
317
sage: trac._anonymous_server_proxy.ticket.get(ticket)
318
[1, 'not implemented', 'not implemented', {'description': 'description', 'summary': 'summary'}]
319
320
"""
321
if ticket not in self._server_proxy._server.tickets:
322
from sage.dev.trac_error import TracInternalError
323
import xmlrpclib
324
raise TracInternalError(xmlrpclib.Fault(404, "ticket does not exist"))
325
ticket = self._server_proxy._server.tickets[ticket]
326
return [ticket.id, ticket.time_created, ticket.time_changed, ticket.attributes]
327
328
def listAttachments(self, ticket):
329
r"""
330
Return a list of attachments to this ticket.
331
332
EXAMPLES::
333
334
sage: from sage.dev.test.trac_interface import DoctestTracInterface
335
sage: from sage.dev.test.config import DoctestConfig
336
sage: from sage.dev.test.user_interface import DoctestUserInterface
337
sage: from sage.dev.test.trac_server import DoctestTracServer
338
sage: config = DoctestConfig()
339
sage: config['trac']['password'] = 'secret'
340
sage: UI = DoctestUserInterface(config['UI'])
341
sage: trac = DoctestTracInterface(config['trac'], UI, DoctestTracServer())
342
sage: ticket = trac._authenticated_server_proxy.ticket.create('summary', 'description', {})
343
sage: trac._anonymous_server_proxy.ticket.listAttachments(ticket)
344
[]
345
346
"""
347
if ticket not in self._server_proxy._server.tickets:
348
from sage.dev.trac_error import TracInternalError
349
import xmlrpclib
350
raise TracInternalError(xmlrpclib.Fault(404, "ticket does not exist"))
351
ticket = self._server_proxy._server.tickets[ticket]
352
return [ [k,None,None,None,None] for k in ticket.attachments.keys()]
353
354