Commit 4b3b0281 authored by Hanno Schlichting's avatar Hanno Schlichting

Remove support for repoze.tm2.

parent 2f444231
...@@ -31,6 +31,8 @@ Features Added ...@@ -31,6 +31,8 @@ Features Added
Restructuring Restructuring
+++++++++++++ +++++++++++++
- Remove support for repoze.tm2.
- Change Testing to use the WSGI publisher for functional and testbrowser - Change Testing to use the WSGI publisher for functional and testbrowser
based tests incl. functional doctests. Alternatives are available based tests incl. functional doctests. Alternatives are available
in `ZServer.Testing`. in `ZServer.Testing`.
...@@ -165,8 +167,6 @@ Bugs Fixed ...@@ -165,8 +167,6 @@ Bugs Fixed
Features Added Features Added
++++++++++++++ ++++++++++++++
- Make repoze.tm2 optional when using the WSGIPublisher.
- Include waitress as a default WSGI app server. - Include waitress as a default WSGI app server.
- Add `egg:Zope2#httpexceptions` WSGI middleware. - Add `egg:Zope2#httpexceptions` WSGI middleware.
......
...@@ -17,7 +17,6 @@ import sys ...@@ -17,7 +17,6 @@ import sys
from thread import allocate_lock from thread import allocate_lock
import time import time
import transaction
from zExceptions import ( from zExceptions import (
HTTPOk, HTTPOk,
HTTPRedirection, HTTPRedirection,
...@@ -197,7 +196,7 @@ class WSGIResponse(HTTPResponse): ...@@ -197,7 +196,7 @@ class WSGIResponse(HTTPResponse):
raise NotImplementedError raise NotImplementedError
def publish(request, module_info, repoze_tm_active=False): def publish(request, module_info):
(bobo_before, (bobo_before,
bobo_after, bobo_after,
object, object,
...@@ -231,7 +230,7 @@ def publish(request, module_info, repoze_tm_active=False): ...@@ -231,7 +230,7 @@ def publish(request, module_info, repoze_tm_active=False):
request['PARENTS'] = [object] request['PARENTS'] = [object]
if not repoze_tm_active and transactions_manager: if transactions_manager:
transactions_manager.begin() transactions_manager.begin()
object = request.traverse(path, validated_hook=validated_hook) object = request.traverse(path, validated_hook=validated_hook)
...@@ -261,7 +260,7 @@ def publish(request, module_info, repoze_tm_active=False): ...@@ -261,7 +260,7 @@ def publish(request, module_info, repoze_tm_active=False):
notify(pubevents.PubBeforeCommit(request)) notify(pubevents.PubBeforeCommit(request))
if not repoze_tm_active and transactions_manager: if transactions_manager:
transactions_manager.commit() transactions_manager.commit()
notify(pubevents.PubSuccess(request)) notify(pubevents.PubSuccess(request))
...@@ -274,44 +273,15 @@ def publish(request, module_info, repoze_tm_active=False): ...@@ -274,44 +273,15 @@ def publish(request, module_info, repoze_tm_active=False):
return response return response
class _RequestCloserForTransaction(object):
"""Unconditionally close the request at the end of a transaction.
See transaction.interfaces.ISynchronizer
"""
def __init__(self):
self.requests = {}
def add(self, txn, request):
assert txn not in self.requests
self.requests[txn] = request
def beforeCompletion(self, txn):
pass
newTransaction = beforeCompletion
def afterCompletion(self, txn):
request = self.requests.pop(txn, None)
if request is not None:
if txn.status == 'Committed':
notify(pubevents.PubSuccess(request))
request.close()
_request_closer_for_repoze_tm = _RequestCloserForTransaction()
def publish_module(environ, start_response, def publish_module(environ, start_response,
_publish=publish, # only for testing _publish=publish, # only for testing
_response=None, _response=None,
_response_factory=WSGIResponse, _response_factory=WSGIResponse,
_request=None, _request=None,
_request_factory=HTTPRequest, _request_factory=HTTPRequest,
module_name='Zope2', _module_name='Zope2',
): ):
module_info = get_module_info(module_name) module_info = get_module_info(_module_name)
transactions_manager = module_info[7] transactions_manager = module_info[7]
status = 200 status = 200
...@@ -329,26 +299,18 @@ def publish_module(environ, start_response, ...@@ -329,26 +299,18 @@ def publish_module(environ, start_response,
else: else:
request = _request request = _request
repoze_tm_active = 'repoze.tm.active' in environ
if repoze_tm_active:
# NOTE: registerSynch is a no-op after the first request
transaction.manager.registerSynch(_request_closer_for_repoze_tm)
txn = transaction.get()
_request_closer_for_repoze_tm.add(txn, request)
setDefaultSkin(request) setDefaultSkin(request)
try: try:
try: try:
response = _publish(request, module_info, repoze_tm_active) response = _publish(request, module_info)
except Exception: except Exception:
try: try:
exc_info = sys.exc_info() exc_info = sys.exc_info()
notify(pubevents.PubBeforeAbort( notify(pubevents.PubBeforeAbort(
request, exc_info, request.supports_retry())) request, exc_info, request.supports_retry()))
if not repoze_tm_active and transactions_manager: if transactions_manager:
transactions_manager.abort() transactions_manager.abort()
notify(pubevents.PubFailure( notify(pubevents.PubFailure(
...@@ -374,9 +336,7 @@ def publish_module(environ, start_response, ...@@ -374,9 +336,7 @@ def publish_module(environ, start_response,
# stdout StringIO, so we put that before the body. # stdout StringIO, so we put that before the body.
result = (stdout.getvalue(), response.body) result = (stdout.getvalue(), response.body)
if not repoze_tm_active: request.close() # this aborts the transaction!
request.close() # this aborts the transaction!
stdout.close() stdout.close()
for func in response.after_list: for func in response.after_list:
......
...@@ -297,9 +297,8 @@ class TestPublishModule(unittest.TestCase): ...@@ -297,9 +297,8 @@ class TestPublishModule(unittest.TestCase):
self.assertEqual(status, '204 No Content') self.assertEqual(status, '204 No Content')
self.assertEqual(headers, [('Content-Length', '0')]) self.assertEqual(headers, [('Content-Length', '0')])
self.assertEqual(kw, {}) self.assertEqual(kw, {})
(request, module_info, repoze_tm_active), kw = _publish._called_with (request, module_info), kw = _publish._called_with
self.assertTrue(isinstance(request, HTTPRequest)) self.assertTrue(isinstance(request, HTTPRequest))
self.assertEqual(repoze_tm_active, False)
self.assertEqual(kw, {}) self.assertEqual(kw, {})
self.assertTrue(_response._finalized) self.assertTrue(_response._finalized)
self.assertEqual(_after1._called_with, ((), {})) self.assertEqual(_after1._called_with, ((), {}))
...@@ -403,7 +402,7 @@ class TestPublishModule(unittest.TestCase): ...@@ -403,7 +402,7 @@ class TestPublishModule(unittest.TestCase):
app_iter = self._callFUT(environ, start_response, _publish) app_iter = self._callFUT(environ, start_response, _publish)
self.assertTrue(app_iter is body) self.assertTrue(app_iter is body)
def test_request_closed_when_tm_middleware_not_active(self): def test_request_closed(self):
environ = self._makeEnviron() environ = self._makeEnviron()
start_response = DummyCallable() start_response = DummyCallable()
_request = DummyRequest() _request = DummyRequest()
...@@ -421,48 +420,6 @@ class TestPublishModule(unittest.TestCase): ...@@ -421,48 +420,6 @@ class TestPublishModule(unittest.TestCase):
_request_factory=_request_factory) _request_factory=_request_factory)
self.assertTrue(_request._closed) self.assertTrue(_request._closed)
def test_request_not_closed_when_tm_middleware_active(self):
import transaction
from ZPublisher import WSGIPublisher
environ = self._makeEnviron()
environ['repoze.tm.active'] = 1
start_response = DummyCallable()
_request = DummyRequest()
_request._closed = False
def _close():
_request._closed = True
_request.close = _close
def _request_factory(stdin, environ, response):
return _request
_publish = DummyCallable()
_publish._result = DummyResponse()
self._callFUT(environ, start_response, _publish,
_request_factory=_request_factory)
self.assertFalse(_request._closed)
txn = transaction.get()
self.assertTrue(
txn in WSGIPublisher._request_closer_for_repoze_tm.requests)
txn.commit()
self.assertTrue(_request._closed)
self.assertFalse(
txn in WSGIPublisher._request_closer_for_repoze_tm.requests)
# try again, but this time raise an exception and abort
_request._closed = False
_publish._raise = Exception('oops')
self.assertRaises(Exception, self._callFUT,
environ, start_response, _publish,
_request_factory=_request_factory)
self.assertFalse(_request._closed)
txn = transaction.get()
self.assertTrue(
txn in WSGIPublisher._request_closer_for_repoze_tm.requests)
txn.abort()
self.assertFalse(
txn in WSGIPublisher._request_closer_for_repoze_tm.requests)
self.assertTrue(_request._closed)
class DummyRequest(dict): class DummyRequest(dict):
_processedInputs = False _processedInputs = False
......
...@@ -82,7 +82,7 @@ class TestPubEvents(TestCase): ...@@ -82,7 +82,7 @@ class TestPubEvents(TestCase):
'SERVER_NAME': 'localhost', 'SERVER_NAME': 'localhost',
'SERVER_PORT': 'localhost', 'SERVER_PORT': 'localhost',
'REQUEST_METHOD': 'GET', 'REQUEST_METHOD': 'GET',
}, start_response, _request=request, module_name=module_name) }, start_response, _request=request, _module_name=module_name)
def testSuccess(self): def testSuccess(self):
r = self.request r = self.request
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment