diff --git a/Library/Homebrew/rubocops/components_order.rb b/Library/Homebrew/rubocops/components_order.rb index e07af84e11..c84766adc4 100644 --- a/Library/Homebrew/rubocops/components_order.rb +++ b/Library/Homebrew/rubocops/components_order.rb @@ -3,9 +3,7 @@ require "ast_constants" require "rubocops/extend/formula_cop" - -# TODO: remove this (and avoid further active support in rubocops) -require "active_support/core_ext/array/conversions" +require "utils/array" module RuboCop module Cop diff --git a/Library/Homebrew/utils.rb b/Library/Homebrew/utils.rb index a6435344f0..f231d698f5 100644 --- a/Library/Homebrew/utils.rb +++ b/Library/Homebrew/utils.rb @@ -4,6 +4,7 @@ require "time" require "utils/analytics" +require "utils/array" require "utils/curl" require "utils/fork" require "utils/formatter" @@ -133,49 +134,4 @@ module Utils suffix = (count == 1) ? singular : plural "#{stem}#{suffix}" end - - # Converts the array to a comma-separated sentence where the last element is - # joined by the connector word. - # - # You can pass the following options to change the default behavior. If you - # pass an option key that doesn't exist in the list below, it will raise an - # ArgumentError. - # - # ==== Options - # - # * :words_connector - The sign or word used to join all but the last - # element in arrays with three or more elements (default: ", "). - # * :last_word_connector - The sign or word used to join the last element - # in arrays with three or more elements (default: ", and "). - # * :two_words_connector - The sign or word used to join the elements - # in arrays with two elements (default: " and "). - # - # ==== Examples - # - # [].to_sentence # => "" - # ['one'].to_sentence # => "one" - # ['one', 'two'].to_sentence # => "one and two" - # ['one', 'two', 'three'].to_sentence # => "one, two, and three" - # - # ['one', 'two'].to_sentence(two_words_connector: '-') - # # => "one-two" - # - # ['one', 'two', 'three'].to_sentence(words_connector: ' or ', last_word_connector: ' or at least ') - # # => "one or two or at least three" - sig { - params(array: T::Array[String], words_connector: String, two_words_connector: String, last_word_connector: String) - .returns(String) - } - def self.to_sentence(array, words_connector: ", ", two_words_connector: " and ", last_word_connector: ", and ") - case array.length - when 0 - +"" - when 1 - +(array[0]).to_s - when 2 - +"#{array[0]}#{two_words_connector}#{array[1]}" - else - +"#{array[0...-1].join(words_connector)}#{last_word_connector}#{array[-1]}" - end - end end diff --git a/Library/Homebrew/utils/array.rb b/Library/Homebrew/utils/array.rb new file mode 100644 index 0000000000..7fad9154a9 --- /dev/null +++ b/Library/Homebrew/utils/array.rb @@ -0,0 +1,53 @@ +# typed: strict +# frozen_string_literal: true + +module Utils + extend T::Sig + + # Converts the array to a comma-separated sentence where the last element is + # joined by the connector word. + # + # You can pass the following options to change the default behavior. If you + # pass an option key that doesn't exist in the list below, it will raise an + # ArgumentError. + # + # ==== Options + # + # * :words_connector - The sign or word used to join all but the last + # element in arrays with three or more elements (default: ", "). + # * :last_word_connector - The sign or word used to join the last element + # in arrays with three or more elements (default: ", and "). + # * :two_words_connector - The sign or word used to join the elements + # in arrays with two elements (default: " and "). + # + # ==== Examples + # + # [].to_sentence # => "" + # ['one'].to_sentence # => "one" + # ['one', 'two'].to_sentence # => "one and two" + # ['one', 'two', 'three'].to_sentence # => "one, two, and three" + # + # ['one', 'two'].to_sentence(two_words_connector: '-') + # # => "one-two" + # + # ['one', 'two', 'three'].to_sentence(words_connector: ' or ', last_word_connector: ' or at least ') + # # => "one or two or at least three" + # @see https://github.com/rails/rails/blob/v6.1.7.2/activesupport/lib/active_support/core_ext/array/conversions.rb#L10-L85 + # ActiveSupport implementation + sig { + params(array: T::Array[String], words_connector: String, two_words_connector: String, last_word_connector: String) + .returns(String) + } + def self.to_sentence(array, words_connector: ", ", two_words_connector: " and ", last_word_connector: ", and ") + case array.length + when 0 + +"" + when 1 + +(array[0]).to_s + when 2 + +"#{array[0]}#{two_words_connector}#{array[1]}" + else + +"#{array[0...-1].join(words_connector)}#{last_word_connector}#{array[-1]}" + end + end +end