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:
parent
af2ce66877
commit
95a8f4aaf6
2 changed files with 69 additions and 1 deletions
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue