Use weakref to hold matcher

There is a cyclical reference here where the matcher holds a list of
requests in history and the requests hold a reference to the matcher.
Break this using a weakref so that it can be cleaned up easily.

In practice I don't see this being a problem as people will want to test
that value as part of the test where the mock is still active.

There has not been a release with this functionality so there is no
compatibility change.

Change-Id: Id1669ea40a48d09432367646a0004866947ff72b
This commit is contained in:
Jamie Lennox
2014-12-19 09:39:36 +10:00
parent 931f2b4989
commit ace78cd9c9

View File

@@ -11,6 +11,7 @@
# under the License.
import json
import weakref
import requests
from requests.adapters import BaseAdapter
@@ -87,7 +88,13 @@ class _RequestObjectProxy(object):
@property
def matcher(self):
return self._matcher
"""The matcher that this request was handled by.
The matcher object is handled by a weakref. It will return the matcher
object if it is still available - so if the mock is still in place. If
the matcher is not available it will return None.
"""
return self._matcher()
class _RequestHistoryTracker(object):
@@ -237,11 +244,11 @@ class Adapter(BaseAdapter, _RequestHistoryTracker):
try:
resp = matcher(request)
except Exception:
request._matcher = matcher
request._matcher = weakref.ref(matcher)
raise
if resp is not None:
request._matcher = matcher
request._matcher = weakref.ref(matcher)
resp.connection = self
return resp