Skip to content

Be more consistent for where the specs are and which method is the alias#1374

Merged
eregon merged 11 commits into
masterfrom
consistent-aliases
Jun 4, 2026
Merged

Be more consistent for where the specs are and which method is the alias#1374
eregon merged 11 commits into
masterfrom
consistent-aliases

Conversation

@eregon

@eregon eregon commented Jun 4, 2026

Copy link
Copy Markdown
Member

I used:

aliases_originals = []

Dir['**/*_spec.rb'].each do |file|
  contents = File.read(file)
  contents.scan(/describe "(\S+)" do\n\s*it "is an alias of (\S+)" do/) {
    aliased, original = [$1, $2].map { |mod_method|
      mod_method[/^(.+?)(?:#|\.)(.+)$/] or raise mod_method
      [$2.to_sym, mod_method]
    }
    aliases_originals << [aliased, original]
  }
end

alias_to_original = Hash.new { |h,k| h[k] = [] }
aliases_originals.each do |al,org|
  alias_to_original[al[0]] << org[1]
end

original_to_alias = Hash.new { |h,k| h[k] = [] }
aliases_originals.each do |al,org|
  original_to_alias[org[0]] << al[1]
end

conflicted = (alias_to_original.keys & original_to_alias.keys)
# pp alias_to_original
# puts
# pp original_to_alias
# puts
conflicted.each do |name|
  puts "#{name}:\n  alias of=#{alias_to_original[name].join(', ')}\n  original for=#{original_to_alias[name].join(', ')}"
end
p conflicted.size

which after this PR gives:

inspect:
  alias of=ARGF.to_s, Data#to_s, Float#to_s, Method#to_s, Proc#to_s, Set#to_s, Struct#to_s, Thread#to_s, UnboundMethod#to_s, OpenStruct#to_s
  original for=Array#to_s, Hash#to_s
to_a:
  alias of=ARGF.readlines
  original for=Enumerable#entries, Range#entries, Struct#deconstruct, Struct#values
to_i:
  alias of=ARGF.fileno
  original for=Float#to_int, Time#tv_sec, BigDecimal#to_int
length:
  alias of=Array#size, ENV.size, Hash#size, MatchData#size, Set#size, Struct#size, Net::HTTPHeader#size, Tempfile#size
  original for=String#size, Symbol#size, Digest::MD5#size, Digest::SHA256#size, Digest::SHA384#size, Digest::SHA512#size, StringIO#size
to_s:
  alias of=Array#inspect, Encoding#name, Hash#inspect, Addrinfo#to_sockaddr
  original for=ARGF.inspect, Data#inspect, Float#inspect, Method#inspect, Proc#inspect, Set#inspect, String#to_str, Struct#inspect, Symbol#id2name, Thread#inspect, UnboundMethod#inspect, OpenStruct#inspect
next:
  alias of=Integer#succ, String#succ, Symbol#succ
  original for=Date#succ, Prime#succ
[]:
  alias of=Method#call, Proc#call
  original for=Array#slice, String#slice, Symbol#slice
<<:
  alias of=Set#add
  original for=Digest::Instance#update, Digest::MD5#update, Digest::SHA256#update, Digest::SHA384#update, Digest::SHA512#update, StringScanner#concat
+:
  alias of=Set#|
  original for=Pathname#/
size:
  alias of=String#length, Symbol#length, Digest::MD5#length, Digest::SHA256#length, Digest::SHA384#length, Digest::SHA512#length, StringIO#length
  original for=Array#length, ENV.length, Hash#length, MatchData#length, Set#length, Struct#length, Net::HTTPHeader#length, Tempfile#length
succ:
  alias of=Date#next, Prime#next
  original for=Integer#next, String#next, Symbol#next
/:
  alias of=Pathname#+
  original for=Complex#quo, Rational#quo
12

I think no point to try to be consistent with the remaining ones, they make sense as-is.
Regarding Array#inspect and Hash#inspect it's because they call inspect on their elements, so having the specs in inspect_spec.rb is better.
The general rule is the more-used method gets the specs, the lesser-used ones are the aliases.

@eregon eregon force-pushed the consistent-aliases branch from 9561b7a to 7cac60a Compare June 4, 2026 20:15
@eregon eregon merged commit 107cbd2 into master Jun 4, 2026
14 checks passed
@eregon eregon deleted the consistent-aliases branch June 4, 2026 20:22
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

1 participant