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