1
0
Fork 0
mirror of https://github.com/pry/pry.git synced 2022-11-09 12:35:05 -05:00

Filter out JRuby autogenerated aliases in ls [Fixes #474]

This commit is contained in:
Conrad Irwin 2012-04-01 19:25:11 -07:00
parent af2ce66877
commit 95a8f4aaf6
2 changed files with 69 additions and 1 deletions

View file

@ -35,6 +35,9 @@ class Pry
opt.on :i, "ivars", "Show instance variables (in blue) and class variables (in bright blue)"
opt.on :G, "grep", "Filter output by regular expression", :optional => false
if jruby?
opt.on :J, "all-java", "Show all the aliases for methods from java (default is to show only prettiest)"
end
end
def process
@ -110,7 +113,58 @@ class Pry
# Get all the methods that we'll want to output
def all_methods(obj)
opts.present?(:'instance-methods') ? Pry::Method.all_from_class(obj) : Pry::Method.all_from_obj(obj)
methods = opts.present?(:'instance-methods') ? Pry::Method.all_from_class(obj) : Pry::Method.all_from_obj(obj)
if jruby? && !opts.present?(:J)
trim_jruby_aliases(methods)
else
methods
end
end
# JRuby creates lots of aliases for methods imported from java in an attempt to
# make life easier for ruby programmers.
# (e.g. getFooBar becomes get_foo_bar and foo_bar, and maybe foo_bar? if it
# returns a Boolean).
# The full transformations are in the assignAliases method of:
# https://github.com/jruby/jruby/blob/master/src/org/jruby/javasupport/JavaClass.java
#
# This has the unfortunate side-effect of making the output of ls even more
# incredibly verbose than it normally would be for these objects; and so we filter
# out all but the nicest of these aliases here.
#
# TODO: This is a little bit vague, better heuristics could be used.
# JRuby also has a lot of scala-specific logic, which we don't copy.
#
def trim_jruby_aliases(methods)
grouped = methods.group_by do |m|
m.name.sub(/\A(is|get|set)(?=[A-Z_])/, '').gsub(/[_?=]/, '').downcase
end
grouped.map do |key, values|
values = values.sort_by do |m|
rubbishness(m.name)
end
found = []
values.select do |x|
(!found.any?{ |y| x == y }) && found << x
end
end.flatten(1)
end
# When removing jruby aliases, we want to keep the alias that is "least rubbish"
# according to this metric.
def rubbishness(name)
name.each_char.map{ |x|
case x
when /[A-Z]/
1
when '?', '=', '!'
-2
else
0
end
}.inject(&:+) + (name.size / 100.0)
end
def resolution_order(obj)

View file

@ -124,4 +124,18 @@ describe "ls" do
end
end
end
if Pry::Helpers::BaseHelpers.jruby?
describe 'on java objects' do
it 'should omit java-esque aliases by default' do
mock_pry('ls java.lang.Thread.current_thread').should =~ / thread_group /
mock_pry('ls java.lang.Thread.current_thread').should.not =~ / getThreadGroup /
end
it 'should include java-esque aliases if requested' do
mock_pry('ls java.lang.Thread.current_thread -J').should =~ / thread_group /
mock_pry('ls java.lang.Thread.current_thread -J').should =~ / getThreadGroup /
end
end
end
end