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

prompt: refactor to reduce duplication

Since we always need to define two procs that look almost the same, duplication
was unavoidable. With help of method wrappers around procs we can reduce it.

As a bonus, the class has some YARD annotations now.
This commit is contained in:
Kyrylo Silin 2018-10-28 16:12:39 +08:00
parent 8236bc0d2d
commit 456f251675

View file

@ -1,37 +1,75 @@
class Pry
class Prompt
# Prompt represents the Pry prompt and holds necessary procs and constants to
# be used with Readline-like libraries.
#
# @since v0.11.0
# @api private
module Prompt
# @return [String]
DEFAULT_NAME = 'pry'.freeze
# @return [Array<Object>] the list of objects that are known to have a
# 1-line #inspect output suitable for prompt
SAFE_CONTEXTS = [String, Numeric, Symbol, nil, true, false].freeze
# @return [String]
DEFAULT_TEMPLATE =
"[%<in_count>s] %<name>s(%<context>s)%<nesting>s%<separator>s ".freeze
# @return [String]
SHELL_TEMPLATE = "%<name>s %<context>s:%<pwd>s %<separator>s ".freeze
# @return [String]
NAV_TEMPLATE = "[%<in_count>s] (%<name>s) %<tree>s: %<stack_size>s> ".freeze
class << self
private
# @return [Proc] the default prompt
def default(separator)
proc do |context, nesting, _pry_|
format(
DEFAULT_TEMPLATE,
in_count: _pry_.input_ring.count,
name: _pry_.config.prompt_name,
context: Pry.view_clip(context),
nesting: (nesting > 0 ? ":#{nesting}" : ''),
separator: separator
)
end
end
# @return [Proc] the shell prompt
def shell(separator)
proc do |context, _nesting, _pry_|
format(
SHELL_TEMPLATE,
name: _pry_.config.prompt_name,
context: Pry.view_clip(context),
pwd: Dir.pwd,
separator: separator
)
end
end
# @return [Proc] the nav prompt
def nav
proc do |_context, _nesting, _pry_|
tree = _pry_.binding_stack.map { |b| Pry.view_clip(b.eval('self')) }
format(
NAV_TEMPLATE,
in_count: _pry_.input_ring.count,
name: _pry_.config.prompt_name,
tree: tree.join(' / '),
stack_size: _pry_.binding_stack.size - 1
)
end
end
end
# The default Pry prompt, which includes the context and nesting level.
# @return [Array<Proc>]
DEFAULT = [
proc { |context, nesting, _pry_|
format(
DEFAULT_TEMPLATE,
in_count: _pry_.input_ring.count,
name: _pry_.config.prompt_name,
context: Pry.view_clip(context),
nesting: (nesting > 0 ? ":#{nesting}" : ''),
separator: '>'
)
},
proc { |context, nesting, _pry_|
format(
DEFAULT_TEMPLATE,
in_count: _pry_.input_ring.count,
name: _pry_.config.prompt_name,
context: Pry.view_clip(context),
nesting: (nesting > 0 ? ":#{nesting}" : ''),
separator: '*'
)
}
].freeze
DEFAULT = [default('>'), default('*')].freeze
# Simple prompt doesn't display target or nesting level.
# @return [Array<Proc>]
@ -40,46 +78,14 @@ class Pry
# @return [Array<Proc>]
NO_PROMPT = Array.new(2) { proc { '' } }.freeze
SHELL_TEMPLATE = "%<name>s %<context>s:%<pwd>s %<separator>s ".freeze
SHELL = [
proc do |context, _nesting, _pry_|
format(
SHELL_TEMPLATE,
name: _pry_.config.prompt_name,
context: Pry.view_clip(context),
pwd: Dir.pwd,
separator: '$'
)
end,
proc do |context, _nesting, _pry_|
format(
SHELL_TEMPLATE,
name: _pry_.config.prompt_name,
context: Pry.view_clip(context),
pwd: Dir.pwd,
separator: '*'
)
end
].freeze
NAV_TEMPLATE = "[%<in_count>s] (%<name>s) %<tree>s: %<stack_size>s> ".freeze
# @return [Array<Proc>]
SHELL = [shell('$'), shell('*')].freeze
# A prompt that includes the full object path as well as
# input/output (_in_ and _out_) information. Good for navigation.
NAV = Array.new(2) do
proc do |_context, _nesting, _pry_|
tree = _pry_.binding_stack.map { |b| Pry.view_clip(b.eval('self')) }
format(
NAV_TEMPLATE,
in_count: _pry_.input_ring.count,
name: _pry_.config.prompt_name,
tree: tree.join(' / '),
stack_size: _pry_.binding_stack.size - 1
)
end
end.freeze
NAV = Array.new(2) { nav }.freeze
# @return [Hash{String=>Hash}]
MAP = {
"default" => {
value: DEFAULT,