google-api-python-client icon indicating copy to clipboard operation
google-api-python-client copied to clipboard

HttpMockSequence is missing close() method

Open bramp opened this issue 1 year ago • 1 comments

Environment details

  • OS type and version: macOS 14.3.1 (23D60)
  • Python version: Python 3.12.2
  • pip version: pip 24.0
  • google-api-python-client version: Version: 2.122.0

Steps to reproduce

  1. Use a HttpMockSequence to mock out the http client
  2. Create a service
  3. Call close() on the service
  4. AttributeError :(

Code example

from googleapiclient.http import HttpMockSequence
from googleapiclient.discovery import build

http = HttpMockSequence([
	({'status': '200'}, {})
])

with build('drive', 'v3', http=http) as service:
	pass

# or
# build('drive', 'v3', http=http).close()

Using build in a context manager is recommended by https://github.com/googleapis/google-api-python-client/blob/main/docs/start.md to ensure that service (and underlying http resources) are cleaned up.

Httplib2 has close() method that was added ~5 years ago.

Stack trace

Traceback (most recent call last):
  File "~/test.py", line 8, in <module>
    with build('drive', 'v3', http=http) as service:
  File "~/.venv/lib/python3.12/site-packages/googleapiclient/discovery.py", line 1422, in __exit__
    self.close()
  File "~/.venv/lib/python3.12/site-packages/googleapiclient/discovery.py", line 1429, in close
    self._http.close()
    ^^^^^^^^^^^^^^^^
AttributeError: 'HttpMockSequence' object has no attribute 'close'

I think HttpMockSequence is just missing the close() method. TBH I just started using this library, but after a bunch of searching I think I'm using it as recommended, and I'm surprised that I'm the first to stumbled across this / report this.

Thanks for any help, and I'm happy to send a PR fixing the issue.

bramp avatar Mar 19 '24 01:03 bramp

FYI A workaround is to

http = HttpMockSequence([
	({'status': '200'}, {})
])
http.close = lambda: None

bramp avatar Mar 19 '24 01:03 bramp