This file is indexed.

/usr/lib/ruby/vendor_ruby/pry/config/behavior.rb is in pry 0.10.3-2.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
module Pry::Config::Behavior
  ASSIGNMENT     = "=".freeze
  NODUP          = [TrueClass, FalseClass, NilClass, Symbol, Numeric, Module, Proc].freeze
  INSPECT_REGEXP = /#{Regexp.escape "default=#<"}/

  module Builder
    def from_hash(hash, default = nil)
      new(default).tap do |config|
        config.merge!(hash)
      end
    end
  end

  def self.included(klass)
    unless defined?(RESERVED_KEYS)
      const_set :RESERVED_KEYS, instance_methods(false).map(&:to_s).freeze
    end
    klass.extend(Builder)
  end

  def initialize(default = Pry.config)
    @default = default
    @lookup = {}
  end

  #
  # @return [Pry::Config::Behavior]
  #   returns the default used if a matching value for a key isn't found in self
  #
  def default
    @default
  end

  def [](key)
    @lookup[key.to_s]
  end

  def []=(key, value)
    key = key.to_s
    if RESERVED_KEYS.include?(key)
      raise ArgumentError, "few things are reserved by pry, but using '#{key}' as a configuration key is."
    end
    @lookup[key] = value
  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)
      # FIXME: refactor Pry::Hook so that it stores config on the config object,
      # so that we can use the normal strategy.
      self[key] = value = value.dup if key == 'hooks'
      value
    else
      nil
    end
  end

  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

  def ==(other)
    @lookup == try_convert_to_hash(other)
  end
  alias_method :eql?, :==

  def respond_to_missing?(key, include_private=false)
    key?(key) or @default.respond_to?(key) or super(key, include_private)
  end

  def key?(key)
    key = key.to_s
    @lookup.key?(key)
  end

  def clear
    @lookup.clear
    true
  end
  alias_method :refresh, :clear

  def forget(key)
    @lookup.delete(key.to_s)
  end

  def keys
    @lookup.keys
  end

  def to_hash
    @lookup.dup
  end
  alias_method :to_h, :to_hash


  def inspect
    key_str = keys.map { |key| "'#{key}'" }.join(",")
    "#<#{_clip_inspect(self)} local_keys=[#{key_str}] default=#{@default.inspect}>"
  end

  def pretty_print(q)
    q.text inspect[1..-1].gsub(INSPECT_REGEXP, "default=<")
  end

private
  def _clip_inspect(obj)
    "#{obj.class}:0x%x" % obj.object_id << 1
  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
end