Source code for pliers.transformers.api.google
import logging
import os
from pliers.transformers import BatchTransformerMixin
from pliers.transformers.api import APITransformer
from pliers.utils import attempt_to_import, verify_dependencies
googleapiclient = attempt_to_import('googleapiclient', fromlist=['discovery'])
google_auth = attempt_to_import('google.oauth2', 'google_auth',
fromlist=['service_account'])
[docs]class GoogleAPITransformer(APITransformer):
''' Base GoogleAPITransformer class.
Args:
discovery_file (str): path to discovery file containing Google
application credentials.
api_version (str): API version to use.
max_results (int): Max number of results per page.
num_retries (int): Number of times to retry query on failure.
rate_limit (int): The minimum number of seconds required between
transform calls on this Transformer.
'''
_env_keys = 'GOOGLE_APPLICATION_CREDENTIALS'
_log_attributes = ('discovery_file', 'api_version')
[docs] def __init__(self, discovery_file=None, api_version='v1', max_results=100,
num_retries=3, rate_limit=None, **kwargs):
verify_dependencies(['googleapiclient', 'google_auth'])
if discovery_file is None:
if 'GOOGLE_APPLICATION_CREDENTIALS' not in os.environ:
raise ValueError("No Google application credentials found. "
"A JSON service account key must be either "
"passed as the discovery_file argument, or "
"set in the GOOGLE_APPLICATION_CREDENTIALS "
"environment variable.")
discovery_file = os.environ['GOOGLE_APPLICATION_CREDENTIALS']
self.discovery_file = discovery_file
try:
self.credentials = google_auth.service_account.Credentials\
.from_service_account_file(discovery_file)
self.service = googleapiclient.discovery.build(
self.api_name, api_version, credentials=self.credentials)
except Exception as e:
logging.warning(str(e))
self.credentials = None
self.service = None
self.max_results = max_results
self.num_retries = num_retries
self.api_version = api_version
super().__init__(rate_limit=rate_limit,
**kwargs)
@property
def api_keys(self):
return [self.credentials]
def check_valid_keys(self):
return self.credentials is not None
[docs]class GoogleVisionAPITransformer(GoogleAPITransformer, BatchTransformerMixin):
''' Base class for transformers using the Google Vision API.
Args:
discovery_file (str): path to discovery file containing Google
application credentials.
api_version (str): API version to use.
max_results (int): Max number of results per page.
num_retries (int): Number of times to retry query on failure.
rate_limit (int): The minimum number of seconds required between
transform calls on this Transformer.
batch_size (int): Number of stims to send per batched API request.
'''
api_name = 'vision'
_batch_size = 1
[docs] def __init__(self, discovery_file=None, api_version='v1', max_results=100,
num_retries=3, rate_limit=None, batch_size=None):
super().__init__(discovery_file=discovery_file,
api_version=api_version,
max_results=max_results,
num_retries=num_retries,
rate_limit=rate_limit,
batch_size=batch_size)
def _query_api(self, request):
request_obj = self.service.images() \
.annotate(body={'requests': request})
return request_obj.execute(num_retries=self.num_retries)['responses']
def _build_request(self, stims):
request = []
for image in stims:
image_desc = {}
if image.url:
image_desc['source'] = {
'imageUri': image.url
}
else:
image_desc['content'] = image.get_bytestring()
request.append(
{
'image': image_desc,
'features': [{
'type': self.request_type,
'maxResults': self.max_results,
}]
})
return request