Project

General

Profile

Actions

Feature #21346

open

Introduce `String#ensure_suffix`

Added by matheusrich (Matheus Richard) 12 days ago. Updated 10 days ago.

Status:
Open
Assignee:
-
Target version:
-
[ruby-core:122154]

Description

Problem

Ensuring a string has a specific suffix or prefix is a common operation in many applications.
Bundler itself uses it:

https://github.com/rubygems/rubygems/blob/d409ec8b5fc647fabe30e37e17cd1ea857634f6b/bundler/lib/bundler/uri_normalizer.rb#L17

Here are GitHub search queries that might find this pattern in other places:

  1. for Ruby: /end(?:s)?_with\?\(['"].*['"]\) \?/ lang:ruby -is:fork
  2. for Crystal (a language very similar to Ruby): /ends_with\?\(['"].*['"]\) \?/ lang:crystal -is:fork

Suggested solution

I believe Ruby would benefit from having a first-class method for this purpose.
I suggest the String#ensure_suffix and String#ensure_prefix methods.

I think these names are intuitive enough (here are 2 examples of people using ensure for this purpose (1, 2)).

I've gone ahead and implemented String#ensure_suffix in a pull request but the suggested behavior is this:

"Hell".ensure_suffix("o!")   # => "Hello!"
"Hello!".ensure_suffix("o!") # => "Hello!"

s = "Hello!"
s.ensure_suffix("!").equal?(s) # => true # returns same object if already suffixed

Updated by matheusrich (Matheus Richard) 12 days ago

If approved, I can add String#ensure_prefix and the bang versions of those methods.

Updated by duerst (Martin Dürst) 12 days ago

You say "queries that might find this pattern". That seems to say that you haven't found it yet.

What's the result for

"Hello".ensure_suffix("o!")

Is it "Helloo!", or is it "Hello!"?

Updated by matheusrich (Matheus Richard) 11 days ago · Edited

You say "queries that might find this pattern". That seems to say that you haven't found it yet.

I'm not sure what you mean. I just meant that the regex can find this pattern, but I can't guarantee it will only find that.

What's the result for

"Hello".ensure_suffix("o!")

Is it "Helloo!", or is it "Hello!"?

As currently implemented, it returns "Helloo!"

Updated by nobu (Nobuyoshi Nakada) 11 days ago

matheusrich (Matheus Richard) wrote in #note-3:

You say "queries that might find this pattern". That seems to say that you haven't found it yet.

I'm not sure what you mean. I just meant that the regex can find this pattern, but I can't guarantee it will only find that.

Maybe like this?

"Hell".sub(/(?<!o!)\z/, "o!")   #=> "Hello!"
"Hello!".sub(/(?<!o!)\z/, "o!") #=> "Hello!"
"o!Hell".sub(/(?<!o!)\z/, "o!") #=> "o!Hello!"

What's the result for

"Hello".ensure_suffix("o!")

Is it "Helloo!", or is it "Hello!"?

As currently implemented, it returns "Helloo!"

You should describe the corner case in the doc, and the test preferably.

Actions

Also available in: Atom PDF

Like1
Like0Like0Like0Like0Like0