Skip to content

Commit 2a4eaf8

Browse files
committed
Reverting back to using str/list values in Translate.
1 parent 92e92a2 commit 2a4eaf8

3 files changed

Lines changed: 116 additions & 45 deletions

File tree

docs/translate-usage.rst

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,17 @@ To create a client:
3030
>>> from gcloud import translate
3131
>>> client = translate.Client('my-api-key')
3232
33-
The API has three supported methods:
33+
By default, the client targets English when doing detections
34+
and translations, but a non-default value can be used as
35+
well:
36+
37+
.. code::
38+
39+
>>> from gcloud import translate
40+
>>> client = translate.Client('my-api-key', target_language='es')
41+
42+
The Google Translate API has three supported methods, and they
43+
map to three methods on a client:
3444
:meth:`~gcloud.translate.client.Client.get_languages`,
3545
:meth:`~gcloud.translate.client.Client.detect_language` and
3646
:meth:`~gcloud.translate.client.Client.translate`.
@@ -41,7 +51,7 @@ To get a list of languages supported by Google Translate
4151
4252
>>> from gcloud import translate
4353
>>> client = translate.Client('my-api-key')
44-
>>> client.get_languages('en')
54+
>>> client.get_languages()
4555
[
4656
{
4757
'language': 'af',
@@ -76,21 +86,20 @@ To translate text:
7686
>>> from gcloud import translate
7787
>>> client = translate.Client('my-api-key')
7888
>>> client.translate('koszula')
79-
[
80-
{
81-
'translatedText': 'shirt',
82-
'detectedSourceLanguage': 'pl',
83-
'input': 'koszula',
84-
},
85-
]
89+
{
90+
'translatedText': 'shirt',
91+
'detectedSourceLanguage': 'pl',
92+
'input': 'koszula',
93+
}
8694
8795
or to use a non-default target language:
8896

8997
.. code::
9098
9199
>>> from gcloud import translate
92100
>>> client = translate.Client('my-api-key')
93-
>>> client.translate(['Me llamo Jeff', 'My name is Jeff'], 'de')
101+
>>> client.translate(['Me llamo Jeff', 'My name is Jeff'],
102+
... target_language='de')
94103
[
95104
{
96105
'translatedText': 'Mein Name ist Jeff',

gcloud/translate/client.py

Lines changed: 55 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -79,16 +79,17 @@ def get_languages(self, target_language=None):
7979
method='GET', path='/languages', query_params=query_params)
8080
return response.get('data', {}).get('languages', ())
8181

82-
def detect_language(self, *values):
82+
def detect_language(self, values):
8383
"""Detect the language of a string or list of strings.
8484
8585
See: https://cloud.google.com/translate/v2/\
8686
detecting-language-with-rest
8787
88-
:type values: tuple
89-
:param values: Tuple of strings that will have language detected.
88+
:type values: str or list
89+
:param values: String or list of strings that will have
90+
language detected.
9091
91-
:rtype: list
92+
:rtype: str or list
9293
:returns: A list of dictionaries for each queried value. Each
9394
dictionary typically contains three keys (though not
9495
all will be present in all cases)
@@ -99,15 +100,19 @@ def detect_language(self, *values):
99100
* ``language``: The detected language (as an ISO 639-1
100101
language code).
101102
102-
If multiple languages are detected for a given input, then
103-
the there will be a list of dictionaries (instead of a single
104-
dictionary) for that queried value.
103+
If only a single value is passed, then only a single
104+
dictionary will be returned.
105105
:raises: :class:`ValueError <exceptions.ValueError>` if the number of
106106
detections is not equal to the number of values.
107107
:class:`ValueError <exceptions.ValueError>` if a value
108108
produces a list of detections with 0 or multiple results
109109
in it.
110110
"""
111+
single_value = False
112+
if isinstance(values, six.string_types):
113+
single_value = True
114+
values = [values]
115+
111116
query_params = [('key', self.key)]
112117
query_params.extend(('q', _to_bytes(value, 'utf-8'))
113118
for value in values)
@@ -134,32 +139,40 @@ def detect_language(self, *values):
134139
# The ``isReliable`` field is deprecated.
135140
detections[index].pop('isReliable', None)
136141

137-
return detections
142+
if single_value:
143+
return detections[0]
144+
else:
145+
return detections
138146

139-
def translate(self, *values, **kwargs):
147+
def translate(self, values, target_language=None, format_=None,
148+
source_language=None, customization_ids=()):
140149
"""Translate a string or list of strings.
141150
142151
See: https://cloud.google.com/translate/v2/\
143152
translating-text-with-rest
144153
145-
Accepted keyword arguments are:
154+
:type values: str or list
155+
:param values: String or list of strings to translate.
146156
147-
* ``target_language`` (str): The language to translate results into.
148-
This is required by the API and defaults to :data:`ENGLISH_ISO_639`.
149-
* ``format`` (str): (Optional) One of ``text`` or ``html``, to specify
150-
if the input text is plain text or HTML.
151-
* ``source_language`` (str): (Optional) The language of the text to
152-
be translated.
153-
* ``customization_ids`` (list): (Optional) List of customization IDs
154-
for translation. Sets the ``cid`` parameter in the query.
157+
:type target_language: str
158+
:param target_language: The language to translate results into. This
159+
is required by the API and defaults to
160+
the target language of the current instance.
155161
156-
:type values: tuple
157-
:param values: Tuple of strings to translate.
162+
:type format_: str
163+
:param format_: (Optional) One of ``text`` or ``html``, to specify
164+
if the input text is plain text or HTML.
158165
159-
:type kwargs: dict
160-
:param kwargs: Keyword arguments to be passed in.
166+
:type source_language: str
167+
:param source_language: (Optional) The language of the text to
168+
be translated.
161169
162-
:rtype: list
170+
:type customization_ids: str or list
171+
:param customization_ids: (Optional) ID or list of customization IDs
172+
for translation. Sets the ``cid`` parameter
173+
in the query.
174+
175+
:rtype: str or list list
163176
:returns: A list of dictionaries for each queried value. Each
164177
dictionary typically contains three keys (though not
165178
all will be present in all cases)
@@ -169,22 +182,30 @@ def translate(self, *values, **kwargs):
169182
* ``translatedText``: The translation of the text into the
170183
target language.
171184
* ``input``: The corresponding input value.
185+
186+
If only a single value is passed, then only a single
187+
dictionary will be returned.
172188
:raises: :class:`ValueError <exceptions.ValueError>` if the number of
173189
values and translations differ.
174190
"""
175-
target_language = kwargs.get('target_language', self.target_language)
176-
customization_ids = kwargs.get('customization_ids', ())
191+
single_value = False
192+
if isinstance(values, six.string_types):
193+
single_value = True
194+
values = [values]
195+
196+
if target_language is None:
197+
target_language = self.target_language
177198
if isinstance(customization_ids, six.string_types):
178199
customization_ids = [customization_ids]
179200

180201
query_params = [('key', self.key), ('target', target_language)]
181202
query_params.extend(('q', _to_bytes(value, 'utf-8'))
182203
for value in values)
183204
query_params.extend(('cid', cid) for cid in customization_ids)
184-
if 'format' in kwargs:
185-
query_params.append(('format', kwargs['format']))
186-
if 'source_language' in kwargs:
187-
query_params.append(('source', kwargs['source_language']))
205+
if format_ is not None:
206+
query_params.append(('format', format_))
207+
if source_language is not None:
208+
query_params.append(('source', source_language))
188209

189210
response = self.connection.api_request(
190211
method='GET', path='', query_params=query_params)
@@ -195,4 +216,8 @@ def translate(self, *values, **kwargs):
195216
values, translations)
196217
for value, translation in six.moves.zip(values, translations):
197218
translation['input'] = value
198-
return translations
219+
220+
if single_value:
221+
return translations[0]
222+
else:
223+
return translations

gcloud/translate/test_client.py

Lines changed: 42 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ def test_detect_language_single_value(self):
161161
conn = client.connection = _Connection(data)
162162

163163
result = client.detect_language(value)
164-
self.assertEqual(result, [detection])
164+
self.assertEqual(result, detection)
165165

166166
# Verify requested.
167167
self.assertEqual(len(conn._requested), 1)
@@ -200,7 +200,7 @@ def test_detect_language_multiple_values(self):
200200
}
201201
conn = client.connection = _Connection(data)
202202

203-
result = client.detect_language(value1, value2)
203+
result = client.detect_language([value1, value2])
204204
self.assertEqual(result, [detection1, detection2])
205205

206206
# Verify requested.
@@ -276,7 +276,7 @@ def test_translate_defaults(self):
276276
conn = client.connection = _Connection(data)
277277

278278
result = client.translate(value)
279-
self.assertEqual(result, [translation])
279+
self.assertEqual(result, translation)
280280

281281
# Verify requested.
282282
self.assertEqual(len(conn._requested), 1)
@@ -290,6 +290,43 @@ def test_translate_defaults(self):
290290
]
291291
self.assertEqual(req['query_params'], query_params)
292292

293+
def test_translate_multiple(self):
294+
client = self._makeOne(self.KEY)
295+
value1 = 'hvala ti'
296+
translation1 = {
297+
'detectedSourceLanguage': 'hr',
298+
'translatedText': 'thank you',
299+
'input': value1,
300+
}
301+
value2 = 'Dankon'
302+
translation2 = {
303+
'detectedSourceLanguage': 'eo',
304+
'translatedText': 'thank you',
305+
'input': value2,
306+
}
307+
data = {
308+
'data': {
309+
'translations': [translation1, translation2],
310+
},
311+
}
312+
conn = client.connection = _Connection(data)
313+
314+
result = client.translate([value1, value2])
315+
self.assertEqual(result, [translation1, translation2])
316+
317+
# Verify requested.
318+
self.assertEqual(len(conn._requested), 1)
319+
req = conn._requested[0]
320+
self.assertEqual(req['method'], 'GET')
321+
self.assertEqual(req['path'], '')
322+
query_params = [
323+
('key', self.KEY),
324+
('target', 'en'),
325+
('q', value1.encode('utf-8')),
326+
('q', value2.encode('utf-8')),
327+
]
328+
self.assertEqual(req['query_params'], query_params)
329+
293330
def test_translate_explicit(self):
294331
client = self._makeOne(self.KEY)
295332
value = 'thank you'
@@ -310,8 +347,8 @@ def test_translate_explicit(self):
310347
format_ = 'text'
311348
result = client.translate(value, target_language=target_language,
312349
source_language=source_language,
313-
format=format_, customization_ids=cid)
314-
self.assertEqual(result, [translation])
350+
format_=format_, customization_ids=cid)
351+
self.assertEqual(result, translation)
315352

316353
# Verify requested.
317354
self.assertEqual(len(conn._requested), 1)

0 commit comments

Comments
 (0)