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

fix: preserve hyperlinks with hyphens #1140

Merged
merged 4 commits into from
Jan 25, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions gapic/utils/lines.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,9 +78,12 @@ def wrap(text: str, width: int, *, offset: int = None, indent: int = 0) -> str:
# Break off the first line of the string to address non-zero offsets.
first = text.split('\n')[0] + '\n'
if len(first) > width - offset:
# Ensure `break_on_hyphens` is set to `False` when using
# `textwrap.wrap` to avoid breaking hyperlinks with hyphens.
initial = textwrap.wrap(first,
break_long_words=False,
width=width - offset,
break_on_hyphens=False,
)
# Strip the first \n from the text so it is not misidentified as an
# intentionally short line below.
Expand All @@ -107,11 +110,14 @@ def wrap(text: str, width: int, *, offset: int = None, indent: int = 0) -> str:
# Wrap the remainder of the string at the desired width.
return '{first}{text}'.format(
first=first,
# Ensure `break_on_hyphens` is set to `False` when using
# `textwrap.fill` to avoid breaking hyperlinks with hyphens.
text='\n'.join([textwrap.fill(
break_long_words=False,
initial_indent=' ' * indent,
subsequent_indent=' ' * indent,
text=token,
width=width,
break_on_hyphens=False,
) for token in tokens]),
).rstrip('\n')
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,8 @@ class IAMCredentialsAsyncClient:

Service account credentials are used to temporarily assume the
identity of the service account. Supported credential types
include OAuth 2.0 access tokens, OpenID Connect ID tokens, self-
signed JSON Web Tokens (JWTs), and more.
include OAuth 2.0 access tokens, OpenID Connect ID tokens,
self-signed JSON Web Tokens (JWTs), and more.
"""

_client: IAMCredentialsClient
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,8 +83,8 @@ class IAMCredentialsClient(metaclass=IAMCredentialsClientMeta):

Service account credentials are used to temporarily assume the
identity of the service account. Supported credential types
include OAuth 2.0 access tokens, OpenID Connect ID tokens, self-
signed JSON Web Tokens (JWTs), and more.
include OAuth 2.0 access tokens, OpenID Connect ID tokens,
self-signed JSON Web Tokens (JWTs), and more.
"""

@staticmethod
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,8 @@ class IAMCredentialsGrpcTransport(IAMCredentialsTransport):

Service account credentials are used to temporarily assume the
identity of the service account. Supported credential types
include OAuth 2.0 access tokens, OpenID Connect ID tokens, self-
signed JSON Web Tokens (JWTs), and more.
include OAuth 2.0 access tokens, OpenID Connect ID tokens,
self-signed JSON Web Tokens (JWTs), and more.

This class defines the same methods as the primary client, so the
primary client can load the underlying transport implementation
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,8 @@ class IAMCredentialsGrpcAsyncIOTransport(IAMCredentialsTransport):

Service account credentials are used to temporarily assume the
identity of the service account. Supported credential types
include OAuth 2.0 access tokens, OpenID Connect ID tokens, self-
signed JSON Web Tokens (JWTs), and more.
include OAuth 2.0 access tokens, OpenID Connect ID tokens,
self-signed JSON Web Tokens (JWTs), and more.

This class defines the same methods as the primary client, so the
primary client can load the underlying transport implementation
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2418,8 +2418,8 @@ def sample_get_cmek_settings():
The request object. The parameters to
[GetCmekSettings][google.logging.v2.ConfigServiceV2.GetCmekSettings].
See [Enabling CMEK for Logs
Router](https://cloud.google.com/logging/docs/routing/managed-
encryption) for more information.
Router](https://cloud.google.com/logging/docs/routing/managed-encryption)
for more information.
retry (google.api_core.retry.Retry): Designation of what errors, if any,
should be retried.
timeout (float): The timeout for this request.
Expand Down Expand Up @@ -2520,8 +2520,8 @@ def sample_update_cmek_settings():
The request object. The parameters to
[UpdateCmekSettings][google.logging.v2.ConfigServiceV2.UpdateCmekSettings].
See [Enabling CMEK for Logs
Router](https://cloud.google.com/logging/docs/routing/managed-
encryption) for more information.
Router](https://cloud.google.com/logging/docs/routing/managed-encryption)
for more information.
retry (google.api_core.retry.Retry): Designation of what errors, if any,
should be retried.
timeout (float): The timeout for this request.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2616,8 +2616,8 @@ def sample_get_cmek_settings():
The request object. The parameters to
[GetCmekSettings][google.logging.v2.ConfigServiceV2.GetCmekSettings].
See [Enabling CMEK for Logs
Router](https://cloud.google.com/logging/docs/routing/managed-
encryption) for more information.
Router](https://cloud.google.com/logging/docs/routing/managed-encryption)
for more information.
retry (google.api_core.retry.Retry): Designation of what errors, if any,
should be retried.
timeout (float): The timeout for this request.
Expand Down Expand Up @@ -2720,8 +2720,8 @@ def sample_update_cmek_settings():
The request object. The parameters to
[UpdateCmekSettings][google.logging.v2.ConfigServiceV2.UpdateCmekSettings].
See [Enabling CMEK for Logs
Router](https://cloud.google.com/logging/docs/routing/managed-
encryption) for more information.
Router](https://cloud.google.com/logging/docs/routing/managed-encryption)
for more information.
retry (google.api_core.retry.Retry): Designation of what errors, if any,
should be retried.
timeout (float): The timeout for this request.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -144,8 +144,7 @@ class LogView(proto.Message):
name (str):
The resource name of the view.
For example
"projects/my-project-id/locations/my-
location/buckets/my-bucket-id/views/my-view
"projects/my-project-id/locations/my-location/buckets/my-bucket-id/views/my-view
description (str):
Describes this view.
create_time (google.protobuf.timestamp_pb2.Timestamp):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,8 +95,8 @@ class Instance(proto.Message):
addresses that are reserved for this instance.
If not provided, the service will choose an
unused /29 block, for example, 10.0.0.0/29 or
192.168.0.0/29. Ranges must be unique and non-
overlapping with existing subnets in an
192.168.0.0/29. Ranges must be unique and
non-overlapping with existing subnets in an
authorized network.
host (str):
Output only. Hostname or IP address of the
Expand Down
4 changes: 4 additions & 0 deletions tests/unit/utils/test_lines.py
Original file line number Diff line number Diff line change
Expand Up @@ -87,3 +87,7 @@ def test_wrap_indent_short():

def test_wrap_short_line_preserved():
assert lines.wrap('foo\nbar\nbaz', width=80) == 'foo\nbar\nbaz'


def test_wrap_does_not_break_hyphenated_word():
assert lines.wrap('do-not-break', width=5) == 'do-not-break'