Skip to content
This repository has been archived by the owner on Aug 2, 2022. It is now read-only.

Commit

Permalink
Lazy import of urllib3 (+requests, boto3 and friends)
Browse files Browse the repository at this point in the history
This speeds up some simple tasks. Note that lazy imports making
mocking more complicated.
  • Loading branch information
Sean Gillies committed Apr 5, 2017
1 parent bd8e8c6 commit 44b21ef
Show file tree
Hide file tree
Showing 4 changed files with 19 additions and 10 deletions.
5 changes: 2 additions & 3 deletions mapbox/services/base.py
Expand Up @@ -4,9 +4,6 @@
import json
import os

from cachecontrol import CacheControl
import requests

from .. import __version__
from mapbox import errors

Expand All @@ -21,6 +18,7 @@ def Session(access_token=None, env=os.environ):
access_token or
env.get('MapboxAccessToken') or
env.get('MAPBOX_ACCESS_TOKEN'))
import requests
session = requests.Session()
session.params.update(access_token=access_token)
session.headers.update({
Expand All @@ -44,6 +42,7 @@ def __init__(self, access_token=None, host=None, cache=None):
self.session = Session(access_token)
self.host = host or os.environ.get('MAPBOX_HOST', self.default_host)
if cache:
from cachecontrol import CacheControl
self.session = CacheControl(self.session, cache=cache)

@property
Expand Down
1 change: 0 additions & 1 deletion mapbox/services/datasets.py
@@ -1,7 +1,6 @@
# mapbox.datasets
import json

import requests
from uritemplate import URITemplate

from mapbox.services.base import Service
Expand Down
10 changes: 9 additions & 1 deletion mapbox/services/uploads.py
@@ -1,12 +1,19 @@
import os.path

from boto3.session import Session as boto3_session
# from boto3.session import Session as boto3_session
from uritemplate import URITemplate

from mapbox.errors import InvalidFileError
from mapbox.services.base import Service


boto3_session = None


def _import_boto3_session():
from boto3.session import Session as boto3_session


class Uploader(Service):
"""Access to the Upload API.
Expand Down Expand Up @@ -59,6 +66,7 @@ def stage(self, fileobj, creds=None, callback=None):
res = self._get_credentials()
creds = res.json()

_import_boto3_session()
session = boto3_session(
aws_access_key_id=creds['accessKeyId'],
aws_secret_access_key=creds['secretAccessKey'],
Expand Down
13 changes: 8 additions & 5 deletions tests/test_upload.py
Expand Up @@ -198,7 +198,10 @@ def upload_fileobj(self, data, key, Callback=None):

@responses.activate
def test_stage(monkeypatch):

# Cause `from boto3.session import Session as boto3_session` in
# mapbox.services.uploads.
mapbox.services.uploads._import_boto3_session()
# After, monkey patch it.
monkeypatch.setattr(mapbox.services.uploads, 'boto3_session', MockSession)

# Credentials
Expand All @@ -224,7 +227,7 @@ def test_stage(monkeypatch):
@responses.activate
def test_big_stage(tmpdir, monkeypatch):
"""Files larger than 1M are multipart uploaded."""

mapbox.services.uploads._import_boto3_session()
monkeypatch.setattr(mapbox.services.uploads, 'boto3_session', MockSession)

# Credentials
Expand Down Expand Up @@ -255,7 +258,7 @@ def test_big_stage(tmpdir, monkeypatch):
@responses.activate
def test_upload(monkeypatch):
"""Upload a file and create a tileset"""

mapbox.services.uploads._import_boto3_session()
monkeypatch.setattr(mapbox.services.uploads, 'boto3_session', MockSession)

# Credentials
Expand Down Expand Up @@ -295,7 +298,7 @@ def print_cb(num_bytes):
@responses.activate
def test_upload_error(monkeypatch):
"""Upload a file and create a tileset, fails with 409"""

mapbox.services.uploads._import_boto3_session()
monkeypatch.setattr(mapbox.services.uploads, 'boto3_session', MockSession)

# Credentials
Expand Down Expand Up @@ -337,7 +340,7 @@ def test_invalid_fileobj():
@responses.activate
def test_upload_patch(monkeypatch):
"""Upload a file and create a tileset in patch mode"""

mapbox.services.uploads._import_boto3_session()
monkeypatch.setattr(mapbox.services.uploads, 'boto3_session', MockSession)

def ensure_patch(request):
Expand Down

0 comments on commit 44b21ef

Please sign in to comment.