Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make sample.content handle bytes and files. #2850

Merged

Conversation

daspecster
Copy link
Contributor

@daspecster daspecster commented Dec 9, 2016

Towards: #2842

See: #2680 (comment)

This PR attempts to handle both bytes and file objects passed to Sample.content.

I added Sample.stream to distinguish between raw bytes and a file like object.
Sample.stream cannot be set, and is derived from Sample._content, which can be either bytes or a file.

I'm sure you guys will have some great feedback for this. I'm totally open to suggestions.

@daspecster daspecster added the api: speech Issues related to the Speech-to-Text API. label Dec 9, 2016
@googlebot googlebot added the cla: yes This human has signed the Contributor License Agreement. label Dec 9, 2016
@daspecster daspecster force-pushed the speech-check-file-like-object branch from 8b3d65a to 8f33865 Compare December 16, 2016 22:52
@daspecster
Copy link
Contributor Author

daspecster commented Dec 17, 2016

I should have fixed this sooner. But I think I have at least a working path that we can discuss now.

LMKWYT!

@@ -99,8 +99,7 @@ def async_recognize(self, sample, language_code=None,
profanity_filter=profanity_filter,
speech_context=SpeechContext(phrases=speech_context))

audio = RecognitionAudio(content=sample.content,
uri=sample.source_uri)
audio = RecognitionAudio(content=sample.content, uri=sample.source_uri)

This comment was marked as spam.


audio = RecognitionAudio(content=sample.content,
uri=sample.source_uri)
audio = RecognitionAudio(content=sample.content, uri=sample.source_uri)

This comment was marked as spam.

:type content: bytes
:param content: (Optional) Byte stream of audio.
:type content: bytes or file
:param content: (Optional) Byte stream of audio or file like object.

This comment was marked as spam.

:type content: bytes
:param content: (Optional) Byte stream of audio.
:type content: bytes or file
:param content: (Optional) Byte stream of audio or file like object.

This comment was marked as spam.

from google.cloud.speech.encoding import Encoding
from google.cloud.speech.result import StreamingSpeechResult


class Sample(object):
"""Representation of an audio sample to be used with Google Speech API.

:type content: bytes
:param content: (Optional) Byte stream of audio.
:type content: bytes or file

This comment was marked as spam.

This comment was marked as spam.

This comment was marked as spam.

This comment was marked as spam.

return self._content
content = self._content
if getattr(self._content, 'read', None) is not None:
content = self._content.read()

This comment was marked as spam.

This comment was marked as spam.

"""
stream = self._content
if stream is not None and getattr(stream, 'read', None) is None:
stream = BytesIO(_to_bytes(stream))

This comment was marked as spam.

This comment was marked as spam.

@@ -13,7 +13,6 @@
# limitations under the License.

import unittest

This comment was marked as spam.

encoding=Encoding.FLAC,
sample_rate=self.SAMPLE_RATE)

self.assertIsNotNone(getattr(sample.stream, 'read', None))

This comment was marked as spam.

sample_rate=self.SAMPLE_RATE)
self.assertEqual(sample.content, test_bytes)

def test_bytes_converts_to_file_like_object(self):

This comment was marked as spam.

This comment was marked as spam.

This comment was marked as spam.

@daspecster daspecster force-pushed the speech-check-file-like-object branch 2 times, most recently from de718b9 to 0cd0e1c Compare January 10, 2017 19:43
Copy link
Contributor

@dhermes dhermes left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This PR feels much "smaller" after adding stream 👍 on the right track

if getattr(sample.content, 'closed', None) is None:
raise ValueError('Please use file-like object for data stream.')
if sample.content.closed:
if sample.stream is None or sample.stream.closed:
raise ValueError('Stream is closed.')

This comment was marked as spam.

no_source = content is None and source_uri is None and stream is None
both_source = (content is not None
and source_uri is not None
and stream is not None)

This comment was marked as spam.

This comment was marked as spam.

@@ -22,7 +23,7 @@ class Sample(object):
"""Representation of an audio sample to be used with Google Speech API.

:type content: bytes
:param content: (Optional) Byte stream of audio.
:param content: (Optional) Bytes object containing audio data.

This comment was marked as spam.

"""
if getattr(self._stream, 'read', None) is None:
return None
return self._stream

This comment was marked as spam.

if no_source or both_source:
raise ValueError('Supply one of \'content\' or \'source_uri\'')
raise ValueError('Supply one of '

This comment was marked as spam.

raise ValueError('Supply one of \'content\' or \'source_uri\'')
sources = [content is not None, source_uri is not None,
stream is not None]
if sources.count(True) != 1:

This comment was marked as spam.

This comment was marked as spam.

@daspecster daspecster force-pushed the speech-check-file-like-object branch from 92fe2a6 to cf7378f Compare January 12, 2017 22:07
@daspecster
Copy link
Contributor Author

Squashed! Will merge per offline discussion once CI passes.

@daspecster daspecster merged commit 54781d3 into googleapis:master Jan 12, 2017
@daspecster daspecster deleted the speech-check-file-like-object branch January 12, 2017 22:13
richkadel pushed a commit to richkadel/google-cloud-python that referenced this pull request May 6, 2017
…like-object

Make sample.content handle bytes and files.
gcf-merge-on-green bot pushed a commit that referenced this pull request Oct 5, 2023
Bumps [urllib3](https://togithub.com/urllib3/urllib3) from 1.26.12 to 1.26.17.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://togithub.com/urllib3/urllib3/releases">urllib3's releases</a>.</em></p>
<blockquote>
<h2>1.26.17</h2>
<ul>
<li>Added the <code>Cookie</code> header to the list of headers to strip from requests when redirecting to a different host. As before, different headers can be set via <code>Retry.remove_headers_on_redirect</code>. (GHSA-v845-jxx5-vc9f)</li>
</ul>
<h2>1.26.16</h2>
<ul>
<li>Fixed thread-safety issue where accessing a <code>PoolManager</code> with many distinct origins would cause connection pools to be closed while requests are in progress (<a href="https://redirect.github.com/urllib3/urllib3/issues/2954">#2954</a>)</li>
</ul>
<h2>1.26.15</h2>
<ul>
<li>Fix socket timeout value when HTTPConnection is reused (<a href="https://redirect.github.com/urllib3/urllib3/issues/2645">urllib3/urllib3#2645</a>)</li>
<li>Remove &quot;!&quot; character from the unreserved characters in IPv6 Zone ID parsing (<a href="https://redirect.github.com/urllib3/urllib3/issues/2899">urllib3/urllib3#2899</a>)</li>
<li>Fix IDNA handling of 'x80' byte (<a href="https://redirect.github.com/urllib3/urllib3/issues/2901">urllib3/urllib3#2901</a>)</li>
</ul>
<h2>1.26.14</h2>
<ul>
<li>Fixed parsing of port 0 (zero) returning None, instead of 0 (<a href="https://redirect.github.com/urllib3/urllib3/issues/2850">#2850</a>)</li>
<li>Removed deprecated <code>HTTPResponse.getheaders()</code> calls in <code>urllib3.contrib</code> module.</li>
</ul>
<h2>1.26.13</h2>
<ul>
<li>Deprecated the <code>HTTPResponse.getheaders()</code> and <code>HTTPResponse.getheader()</code> methods.</li>
<li>Fixed an issue where parsing a URL with leading zeroes in the port would be rejected even when the port number after removing the zeroes was valid.</li>
<li>Fixed a deprecation warning when using cryptography v39.0.0.</li>
<li>Removed the <code>&lt;4</code> in the <code>Requires-Python</code> packaging metadata field.</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a href="https://togithub.com/urllib3/urllib3/blob/main/CHANGES.rst">urllib3's changelog</a>.</em></p>
<blockquote>
<h1>1.26.17 (2023-10-02)</h1>
<ul>
<li>Added the <code>Cookie</code> header to the list of headers to strip from requests when redirecting to a different host. As before, different headers can be set via <code>Retry.remove_headers_on_redirect</code>. (<code>[#3139](https://togithub.com/urllib3/urllib3/issues/3139) &lt;https://togithub.com/urllib3/urllib3/pull/3139&gt;</code>_)</li>
</ul>
<h1>1.26.16 (2023-05-23)</h1>
<ul>
<li>Fixed thread-safety issue where accessing a <code>PoolManager</code> with many distinct origins
would cause connection pools to be closed while requests are in progress (<code>[#2954](https://togithub.com/urllib3/urllib3/issues/2954) &lt;https://togithub.com/urllib3/urllib3/pull/2954&gt;</code>_)</li>
</ul>
<h1>1.26.15 (2023-03-10)</h1>
<ul>
<li>Fix socket timeout value when <code>HTTPConnection</code> is reused (<code>[#2645](https://togithub.com/urllib3/urllib3/issues/2645) &lt;https://togithub.com/urllib3/urllib3/issues/2645&gt;</code>__)</li>
<li>Remove &quot;!&quot; character from the unreserved characters in IPv6 Zone ID parsing
(<code>[#2899](https://togithub.com/urllib3/urllib3/issues/2899) &lt;https://togithub.com/urllib3/urllib3/issues/2899&gt;</code>__)</li>
<li>Fix IDNA handling of '\x80' byte (<code>[#2901](https://togithub.com/urllib3/urllib3/issues/2901) &lt;https://togithub.com/urllib3/urllib3/issues/2901&gt;</code>__)</li>
</ul>
<h1>1.26.14 (2023-01-11)</h1>
<ul>
<li>Fixed parsing of port 0 (zero) returning None, instead of 0. (<code>[#2850](https://togithub.com/urllib3/urllib3/issues/2850) &lt;https://togithub.com/urllib3/urllib3/issues/2850&gt;</code>__)</li>
<li>Removed deprecated getheaders() calls in contrib module. Fixed the type hint of <code>PoolKey.key_retries</code> by adding <code>bool</code> to the union. (<code>[#2865](https://togithub.com/urllib3/urllib3/issues/2865) &lt;https://togithub.com/urllib3/urllib3/issues/2865&gt;</code>__)</li>
</ul>
<h1>1.26.13 (2022-11-23)</h1>
<ul>
<li>Deprecated the <code>HTTPResponse.getheaders()</code> and <code>HTTPResponse.getheader()</code> methods.</li>
<li>Fixed an issue where parsing a URL with leading zeroes in the port would be rejected
even when the port number after removing the zeroes was valid.</li>
<li>Fixed a deprecation warning when using cryptography v39.0.0.</li>
<li>Removed the <code>&lt;4</code> in the <code>Requires-Python</code> packaging metadata field.</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="https://togithub.com/urllib3/urllib3/commit/c9016bf464751a02b7e46f8b86504f47d4238784"><code>c9016bf</code></a> Release 1.26.17</li>
<li><a href="https://togithub.com/urllib3/urllib3/commit/01220354d389cd05474713f8c982d05c9b17aafb"><code>0122035</code></a> Backport GHSA-v845-jxx5-vc9f (<a href="https://redirect.github.com/urllib3/urllib3/issues/3139">#3139</a>)</li>
<li><a href="https://togithub.com/urllib3/urllib3/commit/e63989f97d206e839ab9170c8a76e3e097cc60e8"><code>e63989f</code></a> Fix installing <code>brotli</code> extra on Python 2.7</li>
<li><a href="https://togithub.com/urllib3/urllib3/commit/2e7a24d08713a0131f0b3c7197889466d645cc49"><code>2e7a24d</code></a> [1.26] Configure OS for RTD to fix building docs</li>
<li><a href="https://togithub.com/urllib3/urllib3/commit/57181d6ea910ac7cb2ff83345d9e5e0eb816a0d0"><code>57181d6</code></a> [1.26] Improve error message when calling urllib3.request() (<a href="https://redirect.github.com/urllib3/urllib3/issues/3058">#3058</a>)</li>
<li><a href="https://togithub.com/urllib3/urllib3/commit/3c0148048a523325819377b23fc67f8d46afc3aa"><code>3c01480</code></a> [1.26] Run coverage even with failed jobs</li>
<li><a href="https://togithub.com/urllib3/urllib3/commit/d94029b7e2193ff47b627906a70e06377a09aae8"><code>d94029b</code></a> Release 1.26.16</li>
<li><a href="https://togithub.com/urllib3/urllib3/commit/18e92145e9cddbabdf51c98f54202aa37fd5d4c8"><code>18e9214</code></a> Use trusted publishing for PyPI</li>
<li><a href="https://togithub.com/urllib3/urllib3/commit/d25cf83bbae850a290fe34ed1610ae55c0558b36"><code>d25cf83</code></a> [1.26] Fix invalid test_ssl_failure_midway_through_conn</li>
<li><a href="https://togithub.com/urllib3/urllib3/commit/25cca389496b86ee809c21e5b641aeaa74809263"><code>25cca38</code></a> [1.26] Fix test_ssl_object_attributes</li>
<li>Additional commits viewable in <a href="https://togithub.com/urllib3/urllib3/compare/1.26.12...1.26.17">compare view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=urllib3&package-manager=pip&previous-version=1.26.12&new-version=1.26.17)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the [Security Alerts page](https://togithub.com/googleapis/google-cloud-python/network/alerts).

</details>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
api: speech Issues related to the Speech-to-Text API. cla: yes This human has signed the Contributor License Agreement.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants