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:
@@ -11,6 +11,7 @@
|
|||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
import json
|
import json
|
||||||
|
import weakref
|
||||||
|
|
||||||
import requests
|
import requests
|
||||||
from requests.adapters import BaseAdapter
|
from requests.adapters import BaseAdapter
|
||||||
@@ -87,7 +88,13 @@ class _RequestObjectProxy(object):
|
|||||||
|
|
||||||
@property
|
@property
|
||||||
def matcher(self):
|
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):
|
class _RequestHistoryTracker(object):
|
||||||
@@ -237,11 +244,11 @@ class Adapter(BaseAdapter, _RequestHistoryTracker):
|
|||||||
try:
|
try:
|
||||||
resp = matcher(request)
|
resp = matcher(request)
|
||||||
except Exception:
|
except Exception:
|
||||||
request._matcher = matcher
|
request._matcher = weakref.ref(matcher)
|
||||||
raise
|
raise
|
||||||
|
|
||||||
if resp is not None:
|
if resp is not None:
|
||||||
request._matcher = matcher
|
request._matcher = weakref.ref(matcher)
|
||||||
resp.connection = self
|
resp.connection = self
|
||||||
return resp
|
return resp
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user