summaryrefslogtreecommitdiff
path: root/lib/pry/config/behavior.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/pry/config/behavior.rb')
-rw-r--r--lib/pry/config/behavior.rb449
1 files changed, 227 insertions, 222 deletions
diff --git a/lib/pry/config/behavior.rb b/lib/pry/config/behavior.rb
index 9ec88dd4..0eb2dff9 100644
--- a/lib/pry/config/behavior.rb
+++ b/lib/pry/config/behavior.rb
@@ -1,250 +1,255 @@
-module Pry::Config::Behavior
- ASSIGNMENT = "=".freeze
- NODUP = [TrueClass, FalseClass, NilClass, Symbol, Numeric, Module, Proc].freeze
- INSPECT_REGEXP = /#{Regexp.escape "default=#<"}/
- ReservedKeyError = Class.new(RuntimeError)
-
- module Builder
- #
- # Returns a new Behavior, non-recursively (unlike {#from_hash}).
- #
- # @param
- # (see #from_hash)
- #
- # @return
- # (see #from_hash)
- #
- def assign(attributes, default = nil)
- new(default).tap do |behavior|
- behavior.merge!(attributes)
- end
- end
+class Pry
+ class Config < Pry::BasicObject
+ module Behavior
+ ASSIGNMENT = "=".freeze
+ NODUP = [TrueClass, FalseClass, NilClass, Symbol, Numeric, Module, Proc].freeze
+ INSPECT_REGEXP = /#{Regexp.escape "default=#<"}/
+ ReservedKeyError = Class.new(RuntimeError)
+
+ module Builder
+ #
+ # Returns a new Behavior, non-recursively (unlike {#from_hash}).
+ #
+ # @param
+ # (see #from_hash)
+ #
+ # @return
+ # (see #from_hash)
+ #
+ def assign(attributes, default = nil)
+ new(default).tap do |behavior|
+ behavior.merge!(attributes)
+ end
+ end
- #
- # Returns a new Behavior, recursively walking attributes.
- #
- # @param [Hash] attributes
- # a hash to initialize an instance of self with.
- #
- # @param [Pry::Config, nil] default
- # a default, or nil for none.
- #
- # @return [Pry::Config]
- # returns an instance of self.
- #
- def from_hash(attributes, default = nil)
- new(default).tap do |config|
- attributes.each do |key,value|
- config[key] = Hash === value ? from_hash(value, nil) : value
+ #
+ # Returns a new Behavior, recursively walking attributes.
+ #
+ # @param [Hash] attributes
+ # a hash to initialize an instance of self with.
+ #
+ # @param [Pry::Config, nil] default
+ # a default, or nil for none.
+ #
+ # @return [Pry::Config]
+ # returns an instance of self.
+ #
+ def from_hash(attributes, default = nil)
+ new(default).tap do |config|
+ attributes.each do |key,value|
+ config[key] = Hash === value ? from_hash(value, nil) : value
+ end
+ end
end
end
- end
- end
- def self.included(klass)
- klass.extend(Builder)
- end
+ def self.included(klass)
+ klass.extend(Builder)
+ end
- def initialize(default = Pry.config)
- @default = default
- @lookup = {}
- @reserved_keys = methods.map(&:to_s).freeze
- end
+ def initialize(default = Pry.config)
+ @default = default
+ @lookup = {}
+ @reserved_keys = methods.map(&:to_s).freeze
+ end
- #
- # @return [Pry::Config::Behavior]
- # returns the default used incase a key isn't found in self.
- #
- def default
- @default
- end
+ #
+ # @return [Pry::Config::Behavior]
+ # returns the default used incase a key isn't found in self.
+ #
+ def default
+ @default
+ end
- #
- # @param [String] key
- # a key (as a String)
- #
- # @return [Object, BasicObject]
- # returns an object from self or one of its defaults.
- #
- def [](key)
- key = key.to_s
- key?(key) ? @lookup[key] : (@default and @default[key])
- end
+ #
+ # @param [String] key
+ # a key (as a String)
+ #
+ # @return [Object, BasicObject]
+ # returns an object from self or one of its defaults.
+ #
+ def [](key)
+ key = key.to_s
+ key?(key) ? @lookup[key] : (@default and @default[key])
+ end
- #
- # Add a key and value pair to self.
- #
- # @param [String] key
- # a key (as a String).
- #
- # @param [Object,BasicObject] value
- # a value.
- #
- # @raise [Pry::Config::ReservedKeyError]
- # when 'key' is a reserved key name.
- #
- def []=(key, value)
- key = key.to_s
- if @reserved_keys.include?(key)
- raise ReservedKeyError, "It is not possible to use '#{key}' as a key name, please choose a different key name."
- end
+ #
+ # Add a key and value pair to self.
+ #
+ # @param [String] key
+ # a key (as a String).
+ #
+ # @param [Object,BasicObject] value
+ # a value.
+ #
+ # @raise [Pry::Config::ReservedKeyError]
+ # when 'key' is a reserved key name.
+ #
+ def []=(key, value)
+ key = key.to_s
+ if @reserved_keys.include?(key)
+ raise ReservedKeyError, "It is not possible to use '#{key}' as a key name, please choose a different key name."
+ end
- __push(key,value)
- end
+ __push(key,value)
+ end
- #
- # Removes a key from self.
- #
- # @param [String] key
- # a key (as a String)
- #
- # @return [void]
- #
- def forget(key)
- key = key.to_s
- __remove(key)
- end
+ #
+ # Removes a key from self.
+ #
+ # @param [String] key
+ # a key (as a String)
+ #
+ # @return [void]
+ #
+ def forget(key)
+ key = key.to_s
+ __remove(key)
+ end
- #
- # @param [Hash, #to_h, #to_hash] other
- # a hash to merge into self.
- #
- # @return [void]
- #
- def merge!(other)
- other = __try_convert_to_hash(other)
- raise TypeError, "unable to convert argument into a Hash" unless other
-
- other.each do |key, value|
- self[key] = value
- end
- end
+ #
+ # @param [Hash, #to_h, #to_hash] other
+ # a hash to merge into self.
+ #
+ # @return [void]
+ #
+ def merge!(other)
+ other = __try_convert_to_hash(other)
+ raise TypeError, "unable to convert argument into a Hash" unless other
+
+ other.each do |key, value|
+ self[key] = value
+ end
+ end
- #
- # @param [Hash, #to_h, #to_hash] other
- # a hash to compare against the lookup table of self.
- #
- def ==(other)
- @lookup == __try_convert_to_hash(other)
- end
- alias_method :eql?, :==
-
- #
- # @param [String] key
- # a key (as a String)
- #
- # @return [Boolean]
- # returns true when "key" is a member of self.
- #
- def key?(key)
- key = key.to_s
- @lookup.key?(key)
- end
+ #
+ # @param [Hash, #to_h, #to_hash] other
+ # a hash to compare against the lookup table of self.
+ #
+ def ==(other)
+ @lookup == __try_convert_to_hash(other)
+ end
+ alias_method :eql?, :==
+
+ #
+ # @param [String] key
+ # a key (as a String)
+ #
+ # @return [Boolean]
+ # returns true when "key" is a member of self.
+ #
+ def key?(key)
+ key = key.to_s
+ @lookup.key?(key)
+ end
- #
- # Clear the lookup table of self.
- #
- # @return [void]
- #
- def clear
- @lookup.clear
- true
- end
+ #
+ # Clear the lookup table of self.
+ #
+ # @return [void]
+ #
+ def clear
+ @lookup.clear
+ true
+ end
- #
- # @return [Array<String>]
- # returns an array of keys in self.
- #
- def keys
- @lookup.keys
- end
+ #
+ # @return [Array<String>]
+ # returns an array of keys in self.
+ #
+ def keys
+ @lookup.keys
+ end
- def eager_load!
- default = @default
- while default
- default.memoized_methods.each {|method| self[key] = default.public_send(key)} if default.respond_to?(:memoized_methods)
- default = @default.default
- end
- end
+ def eager_load!
+ default = @default
+ while default
+ default.memoized_methods.each {|method| self[key] = default.public_send(key)} if default.respond_to?(:memoized_methods)
+ default = @default.default
+ end
+ end
- def last_default
- last = @default
- last = last.default while last and last.default
- last
- end
+ def last_default
+ last = @default
+ last = last.default while last and last.default
+ last
+ end
- #
- # @return [Hash]
- # returns a duplicate copy of the lookup table used by self.
- #
- def to_hash
- @lookup.dup
- end
- alias_method :to_h, :to_hash
+ #
+ # @return [Hash]
+ # returns a duplicate copy of the lookup table used by self.
+ #
+ def to_hash
+ @lookup.dup
+ end
+ alias_method :to_h, :to_hash
- def inspect
- key_str = keys.map { |key| "'#{key}'" }.join(",")
- "#<#{__clip_inspect(self)} keys=[#{key_str}] default=#{@default.inspect}>"
- end
+ def inspect
+ key_str = keys.map { |key| "'#{key}'" }.join(",")
+ "#<#{__clip_inspect(self)} keys=[#{key_str}] default=#{@default.inspect}>"
+ end
- def pretty_print(q)
- q.text inspect[1..-1].gsub(INSPECT_REGEXP, "default=<")
- end
+ def pretty_print(q)
+ q.text inspect[1..-1].gsub(INSPECT_REGEXP, "default=<")
+ end
- def method_missing(name, *args, &block)
- key = name.to_s
- if key[-1] == ASSIGNMENT
- short_key = key[0..-2]
- self[short_key] = args[0]
- elsif key?(key)
- self[key]
- elsif @default.respond_to?(name)
- value = @default.public_send(name, *args, &block)
- self[key] = __dup(value)
- else
- nil
- end
- end
+ def method_missing(name, *args, &block)
+ key = name.to_s
+ if key[-1] == ASSIGNMENT
+ short_key = key[0..-2]
+ self[short_key] = args[0]
+ elsif key?(key)
+ self[key]
+ elsif @default.respond_to?(name)
+ value = @default.public_send(name, *args, &block)
+ self[key] = __dup(value)
+ else
+ nil
+ end
+ end
- def respond_to_missing?(key, include_all=false)
- key = key.to_s.chomp(ASSIGNMENT)
- key?(key) or @default.respond_to?(key) or super(key, include_all)
- end
+ def respond_to_missing?(key, include_all=false)
+ key = key.to_s.chomp(ASSIGNMENT)
+ key?(key) or @default.respond_to?(key) or super(key, include_all)
+ end
-private
- def __clip_inspect(obj)
- "#{obj.class}:0x%x" % obj.object_id
- end
+ private
- def __try_convert_to_hash(obj)
- if Hash === obj
- obj
- elsif obj.respond_to?(:to_h)
- obj.to_h
- elsif obj.respond_to?(:to_hash)
- obj.to_hash
- else
- nil
- end
- end
+ def __clip_inspect(obj)
+ "#{obj.class}:0x%x" % obj.object_id
+ end
- def __dup(value)
- if NODUP.any? { |klass| klass === value }
- value
- else
- value.dup
- end
- end
+ def __try_convert_to_hash(obj)
+ if Hash === obj
+ obj
+ elsif obj.respond_to?(:to_h)
+ obj.to_h
+ elsif obj.respond_to?(:to_hash)
+ obj.to_hash
+ else
+ nil
+ end
+ end
- def __push(key,value)
- unless singleton_class.method_defined? key
- define_singleton_method(key) { self[key] }
- define_singleton_method("#{key}=") { |val| @lookup[key] = val }
- end
- @lookup[key] = value
- end
+ def __dup(value)
+ if NODUP.any? { |klass| klass === value }
+ value
+ else
+ value.dup
+ end
+ end
+
+ def __push(key,value)
+ unless singleton_class.method_defined? key
+ define_singleton_method(key) { self[key] }
+ define_singleton_method("#{key}=") { |val| @lookup[key] = val }
+ end
+ @lookup[key] = value
+ end
- def __remove(key)
- @lookup.delete(key)
+ def __remove(key)
+ @lookup.delete(key)
+ end
+ end
end
end