pry 0.11.3 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +139 -1
  3. data/LICENSE +1 -1
  4. data/README.md +13 -30
  5. data/bin/pry +0 -4
  6. data/lib/pry.rb +17 -47
  7. data/lib/pry/cli.rb +17 -24
  8. data/lib/pry/code.rb +6 -6
  9. data/lib/pry/code/code_file.rb +5 -4
  10. data/lib/pry/code/code_range.rb +3 -3
  11. data/lib/pry/code/loc.rb +14 -8
  12. data/lib/pry/code_object.rb +4 -4
  13. data/lib/pry/color_printer.rb +1 -0
  14. data/lib/pry/command.rb +36 -29
  15. data/lib/pry/command_set.rb +17 -52
  16. data/lib/pry/commands/amend_line.rb +3 -4
  17. data/lib/pry/commands/bang.rb +1 -1
  18. data/lib/pry/commands/cat.rb +7 -6
  19. data/lib/pry/commands/cat/exception_formatter.rb +9 -8
  20. data/lib/pry/commands/cat/input_expression_formatter.rb +1 -1
  21. data/lib/pry/commands/change_prompt.rb +29 -9
  22. data/lib/pry/commands/clear_screen.rb +14 -0
  23. data/lib/pry/commands/code_collector.rb +9 -9
  24. data/lib/pry/commands/easter_eggs.rb +3 -3
  25. data/lib/pry/commands/edit.rb +8 -7
  26. data/lib/pry/commands/exit.rb +2 -1
  27. data/lib/pry/commands/find_method.rb +11 -13
  28. data/lib/pry/commands/gem_cd.rb +1 -1
  29. data/lib/pry/commands/gem_install.rb +2 -2
  30. data/lib/pry/commands/gem_list.rb +2 -2
  31. data/lib/pry/commands/gem_open.rb +1 -1
  32. data/lib/pry/commands/gem_search.rb +2 -2
  33. data/lib/pry/commands/gem_stats.rb +83 -0
  34. data/lib/pry/commands/gist.rb +7 -6
  35. data/lib/pry/commands/help.rb +3 -3
  36. data/lib/pry/commands/hist.rb +9 -8
  37. data/lib/pry/commands/import_set.rb +2 -1
  38. data/lib/pry/commands/install_command.rb +7 -6
  39. data/lib/pry/commands/list_inspectors.rb +2 -2
  40. data/lib/pry/commands/ls.rb +27 -30
  41. data/lib/pry/commands/ls/constants.rb +4 -4
  42. data/lib/pry/commands/ls/formatter.rb +3 -2
  43. data/lib/pry/commands/ls/globals.rb +0 -2
  44. data/lib/pry/commands/ls/grep.rb +0 -2
  45. data/lib/pry/commands/ls/instance_vars.rb +0 -1
  46. data/lib/pry/commands/ls/local_names.rb +0 -2
  47. data/lib/pry/commands/ls/local_vars.rb +0 -2
  48. data/lib/pry/commands/ls/ls_entity.rb +0 -1
  49. data/lib/pry/commands/ls/methods.rb +0 -3
  50. data/lib/pry/commands/ls/methods_helper.rb +1 -1
  51. data/lib/pry/commands/ls/self_methods.rb +0 -1
  52. data/lib/pry/commands/play.rb +1 -2
  53. data/lib/pry/commands/pry_backtrace.rb +1 -1
  54. data/lib/pry/commands/raise_up.rb +2 -1
  55. data/lib/pry/commands/ri.rb +5 -4
  56. data/lib/pry/commands/shell_command.rb +3 -2
  57. data/lib/pry/commands/shell_mode.rb +6 -6
  58. data/lib/pry/commands/show_doc.rb +5 -7
  59. data/lib/pry/commands/show_info.rb +25 -18
  60. data/lib/pry/commands/show_source.rb +5 -2
  61. data/lib/pry/commands/stat.rb +1 -1
  62. data/lib/pry/commands/watch_expression.rb +9 -7
  63. data/lib/pry/commands/whereami.rb +4 -4
  64. data/lib/pry/commands/wtf.rb +15 -2
  65. data/lib/pry/config.rb +33 -9
  66. data/lib/pry/config/behavior.rb +229 -205
  67. data/lib/pry/config/convenience.rb +24 -21
  68. data/lib/pry/config/default.rb +153 -143
  69. data/lib/pry/config/memoization.rb +41 -37
  70. data/lib/pry/core_extensions.rb +4 -3
  71. data/lib/pry/editor.rb +5 -12
  72. data/lib/pry/exceptions.rb +0 -2
  73. data/lib/pry/helpers.rb +1 -0
  74. data/lib/pry/helpers/base_helpers.rb +133 -4
  75. data/lib/pry/helpers/command_helpers.rb +5 -4
  76. data/lib/pry/helpers/documentation_helpers.rb +2 -2
  77. data/lib/pry/helpers/options_helpers.rb +5 -5
  78. data/lib/pry/helpers/platform.rb +58 -0
  79. data/lib/pry/helpers/table.rb +20 -15
  80. data/lib/pry/helpers/text.rb +3 -4
  81. data/lib/pry/history.rb +21 -8
  82. data/lib/pry/hooks.rb +3 -3
  83. data/lib/pry/indent.rb +15 -17
  84. data/lib/pry/input_completer.rb +12 -7
  85. data/lib/pry/input_lock.rb +0 -2
  86. data/lib/pry/last_exception.rb +1 -1
  87. data/lib/pry/method.rb +37 -31
  88. data/lib/pry/method/disowned.rb +2 -1
  89. data/lib/pry/method/patcher.rb +2 -2
  90. data/lib/pry/method/weird_method_locator.rb +7 -8
  91. data/lib/pry/object_path.rb +5 -4
  92. data/lib/pry/output.rb +3 -2
  93. data/lib/pry/pager.rb +4 -3
  94. data/lib/pry/platform.rb +79 -81
  95. data/lib/pry/plugins.rb +7 -3
  96. data/lib/pry/prompt.rb +144 -25
  97. data/lib/pry/pry_class.rb +53 -29
  98. data/lib/pry/pry_instance.rb +88 -55
  99. data/lib/pry/repl.rb +33 -4
  100. data/lib/pry/repl_file_loader.rb +1 -2
  101. data/lib/pry/ring.rb +84 -0
  102. data/lib/pry/rubygem.rb +6 -6
  103. data/lib/pry/slop.rb +17 -17
  104. data/lib/pry/slop/commands.rb +3 -4
  105. data/lib/pry/slop/option.rb +19 -21
  106. data/lib/pry/terminal.rb +2 -1
  107. data/lib/pry/testable/mockable.rb +2 -2
  108. data/lib/pry/testable/pry_tester.rb +1 -1
  109. data/lib/pry/testable/utility.rb +2 -2
  110. data/lib/pry/testable/variables.rb +1 -1
  111. data/lib/pry/version.rb +1 -1
  112. data/lib/pry/wrapped_module.rb +15 -15
  113. data/lib/pry/wrapped_module/candidate.rb +2 -2
  114. metadata +17 -29
  115. data/lib/pry/commands/list_prompts.rb +0 -35
  116. data/lib/pry/commands/simple_prompt.rb +0 -22
  117. data/lib/pry/history_array.rb +0 -121
  118. data/lib/pry/rbx_path.rb +0 -22
@@ -8,7 +8,7 @@ module Pry::Testable::Variables
8
8
  # Foo # => NameError
9
9
  # Bar # => NameError
10
10
  #
11
- # @param [Array<Symbol>] *names
11
+ # @param [Array<Symbol>] names
12
12
  # An array of constant names that be defined by a block,
13
13
  # and removed by this method afterwards.
14
14
  #
@@ -1,3 +1,3 @@
1
1
  class Pry
2
- VERSION = "0.11.3"
2
+ VERSION = '0.12.0'
3
3
  end
@@ -26,7 +26,7 @@ class Pry
26
26
  # @return [Module, nil] The module or `nil` (if conversion failed).
27
27
  # @example
28
28
  # Pry::WrappedModule.from_str("Pry::Code")
29
- def self.from_str(mod_name, target=TOPLEVEL_BINDING)
29
+ def self.from_str(mod_name, target = TOPLEVEL_BINDING)
30
30
  if safe_to_evaluate?(mod_name, target)
31
31
  Pry::WrappedModule.new(target.eval(mod_name))
32
32
  else
@@ -49,6 +49,7 @@ class Pry
49
49
  def safe_to_evaluate?(str, target)
50
50
  return true if str.strip == "self"
51
51
  return false if str =~ /%/
52
+
52
53
  kind = target.eval("defined?(#{str})")
53
54
  kind =~ /variable|constant/
54
55
  end
@@ -58,6 +59,7 @@ class Pry
58
59
  # @param [Module] mod
59
60
  def initialize(mod)
60
61
  raise ArgumentError, "Tried to initialize a WrappedModule with a non-module #{mod.inspect}" unless ::Module === mod
62
+
61
63
  @wrapped = mod
62
64
  @memoized_candidates = []
63
65
  @host_file_lines = nil
@@ -109,10 +111,6 @@ class Pry
109
111
  def singleton_class?
110
112
  if Pry::Method.safe_send(wrapped, :respond_to?, :singleton_class?)
111
113
  Pry::Method.safe_send(wrapped, :singleton_class?)
112
- elsif defined?(Rubinius)
113
- # https://github.com/rubinius/rubinius/commit/2e71722dba53d1a92c54d5e3968d64d1042486fe singleton_class? added 30 Jul 2014
114
- # https://github.com/rubinius/rubinius/commit/4310f6b2ef3c8fc88135affe697db4e29e4621c4 has been around since 2011
115
- !!Rubinius::Type.singleton_class_object(wrapped)
116
114
  else
117
115
  wrapped != Pry::Method.safe_send(wrapped, :ancestors).first
118
116
  end
@@ -138,10 +136,10 @@ class Pry
138
136
  def singleton_instance
139
137
  raise ArgumentError, "tried to get instance of non singleton class" unless singleton_class?
140
138
 
141
- if Helpers::BaseHelpers.jruby?
139
+ if Helpers::Platform.jruby?
142
140
  wrapped.to_java.attached
143
141
  else
144
- @singleton_instance ||= ObjectSpace.each_object(wrapped).detect{ |x| (class << x; self; end) == wrapped }
142
+ @singleton_instance ||= ObjectSpace.each_object(wrapped).detect { |x| (class << x; self; end) == wrapped }
145
143
  end
146
144
  end
147
145
 
@@ -150,7 +148,7 @@ class Pry
150
148
  wrapped.send(method_name, *args, &block)
151
149
  end
152
150
 
153
- def respond_to?(method_name, include_all=false)
151
+ def respond_to?(method_name, include_all = false)
154
152
  super || wrapped.respond_to?(method_name, include_all)
155
153
  end
156
154
 
@@ -253,7 +251,7 @@ class Pry
253
251
  y.yield candidate(num)
254
252
  end
255
253
  end
256
- Pry::Helpers::BaseHelpers.jruby_19? ? enum.to_a : enum
254
+ Helpers::Platform.jruby_19? ? enum.to_a : enum
257
255
  end
258
256
 
259
257
  # @return [Boolean] Whether YARD docs are available for this module.
@@ -267,7 +265,7 @@ class Pry
267
265
  # When `self` is a `Module` then return the
268
266
  # nth ancestor, otherwise (in the case of classes) return the
269
267
  # nth ancestor that is a class.
270
- def super(times=1)
268
+ def super(times = 1)
271
269
  return self if times.zero?
272
270
 
273
271
  if wrapped.is_a?(Class)
@@ -302,7 +300,7 @@ class Pry
302
300
  # speed up source code extraction.
303
301
  def method_candidates
304
302
  @method_candidates ||= all_source_locations_by_popularity.map do |group|
305
- methods_sorted_by_source_line = group.last.sort_by(&:source_line)
303
+ methods_sorted_by_source_line = group.last.sort_by(&:source_line)
306
304
  [methods_sorted_by_source_line.first, methods_sorted_by_source_line.last]
307
305
  end
308
306
  end
@@ -315,7 +313,7 @@ class Pry
315
313
  @all_source_locations_by_popularity = ims.group_by { |v| Array(v.source_location).first }.
316
314
  sort_by do |path, methods|
317
315
  expanded = File.expand_path(path)
318
- load_order = $LOADED_FEATURES.index{ |file| expanded.end_with?(file) }
316
+ load_order = $LOADED_FEATURES.index { |file| expanded.end_with?(file) }
319
317
 
320
318
  [-methods.size, load_order || (1.0 / 0.0)]
321
319
  end
@@ -323,16 +321,16 @@ class Pry
323
321
 
324
322
  # We only want methods that have a non-nil `source_location`. We also
325
323
  # skip some spooky internal methods.
326
- # (i.e we skip `__class_init__` because it's an odd rbx specific thing that causes tests to fail.)
324
+ #
327
325
  # @return [Array<Pry::Method>]
328
326
  def all_relevant_methods_for(mod)
329
327
  methods = all_methods_for(mod).select(&:source_location).
330
- reject{ |x| x.name == '__class_init__' || method_defined_by_forwardable_module?(x) }
328
+ reject { |x| method_defined_by_forwardable_module?(x) }
331
329
 
332
330
  return methods unless methods.empty?
333
331
 
334
332
  safe_send(mod, :constants).flat_map do |const_name|
335
- if const = nested_module?(mod, const_name)
333
+ if (const = nested_module?(mod, const_name))
336
334
  all_relevant_methods_for(const)
337
335
  else
338
336
  []
@@ -349,9 +347,11 @@ class Pry
349
347
 
350
348
  def nested_module?(parent, name)
351
349
  return if safe_send(parent, :autoload?, name)
350
+
352
351
  child = safe_send(parent, :const_get, name)
353
352
  return unless Module === child
354
353
  return unless safe_send(child, :name) == "#{safe_send(parent, :name)}::#{name}"
354
+
355
355
  child
356
356
  end
357
357
 
@@ -2,7 +2,6 @@ require 'pry/helpers/documentation_helpers'
2
2
 
3
3
  class Pry
4
4
  class WrappedModule
5
-
6
5
  # This class represents a single candidate for a module/class definition.
7
6
  # It provides access to the source, documentation, line and file
8
7
  # for a monkeypatch (reopening) of a class/module.
@@ -64,6 +63,7 @@ class Pry
64
63
  # @return [String] The documentation for the candidate.
65
64
  def doc
66
65
  return nil if file.nil?
66
+
67
67
  @doc ||= get_comment_content(Pry::Code.from_file(file).comment_describing(line))
68
68
  end
69
69
 
@@ -76,7 +76,7 @@ class Pry
76
76
  file, line = first_method_source_location
77
77
  return nil if !file.is_a?(String)
78
78
 
79
- @source_location = [file, first_line_of_module_definition(file, line)]
79
+ @source_location = [file, first_line_of_module_definition(file, line)]
80
80
  rescue Pry::RescuableException
81
81
  nil
82
82
  end
metadata CHANGED
@@ -1,64 +1,52 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pry
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.3
4
+ version: 0.12.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Mair (banisterfiend)
8
8
  - Conrad Irwin
9
9
  - Ryan Fitzgerald
10
- autorequire:
10
+ - Kyrylo Silin
11
+ autorequire:
11
12
  bindir: bin
12
13
  cert_chain: []
13
- date: 2017-11-14 00:00:00.000000000 Z
14
+ date: 2018-11-04 00:00:00.000000000 Z
14
15
  dependencies:
15
16
  - !ruby/object:Gem::Dependency
16
- name: coderay
17
17
  requirement: !ruby/object:Gem::Requirement
18
18
  requirements:
19
19
  - - "~>"
20
20
  - !ruby/object:Gem::Version
21
21
  version: 1.1.0
22
- type: :runtime
22
+ name: coderay
23
23
  prerelease: false
24
+ type: :runtime
24
25
  version_requirements: !ruby/object:Gem::Requirement
25
26
  requirements:
26
27
  - - "~>"
27
28
  - !ruby/object:Gem::Version
28
29
  version: 1.1.0
29
30
  - !ruby/object:Gem::Dependency
30
- name: method_source
31
31
  requirement: !ruby/object:Gem::Requirement
32
32
  requirements:
33
33
  - - "~>"
34
34
  - !ruby/object:Gem::Version
35
35
  version: 0.9.0
36
- type: :runtime
36
+ name: method_source
37
37
  prerelease: false
38
+ type: :runtime
38
39
  version_requirements: !ruby/object:Gem::Requirement
39
40
  requirements:
40
41
  - - "~>"
41
42
  - !ruby/object:Gem::Version
42
43
  version: 0.9.0
43
- - !ruby/object:Gem::Dependency
44
- name: bundler
45
- requirement: !ruby/object:Gem::Requirement
46
- requirements:
47
- - - "~>"
48
- - !ruby/object:Gem::Version
49
- version: '1.0'
50
- type: :development
51
- prerelease: false
52
- version_requirements: !ruby/object:Gem::Requirement
53
- requirements:
54
- - - "~>"
55
- - !ruby/object:Gem::Version
56
- version: '1.0'
57
44
  description: An IRB alternative and runtime developer console
58
45
  email:
59
46
  - jrmair@gmail.com
60
47
  - conrad.irwin@gmail.com
61
48
  - rwfitzge@gmail.com
49
+ - silin@kyrylo.org
62
50
  executables:
63
51
  - pry
64
52
  extensions: []
@@ -91,6 +79,7 @@ files:
91
79
  - lib/pry/commands/cd.rb
92
80
  - lib/pry/commands/change_inspector.rb
93
81
  - lib/pry/commands/change_prompt.rb
82
+ - lib/pry/commands/clear_screen.rb
94
83
  - lib/pry/commands/code_collector.rb
95
84
  - lib/pry/commands/disable_pry.rb
96
85
  - lib/pry/commands/disabled_commands.rb
@@ -109,6 +98,7 @@ files:
109
98
  - lib/pry/commands/gem_open.rb
110
99
  - lib/pry/commands/gem_readme.rb
111
100
  - lib/pry/commands/gem_search.rb
101
+ - lib/pry/commands/gem_stats.rb
112
102
  - lib/pry/commands/gist.rb
113
103
  - lib/pry/commands/help.rb
114
104
  - lib/pry/commands/hist.rb
@@ -116,7 +106,6 @@ files:
116
106
  - lib/pry/commands/install_command.rb
117
107
  - lib/pry/commands/jump_to.rb
118
108
  - lib/pry/commands/list_inspectors.rb
119
- - lib/pry/commands/list_prompts.rb
120
109
  - lib/pry/commands/ls.rb
121
110
  - lib/pry/commands/ls/constants.rb
122
111
  - lib/pry/commands/ls/formatter.rb
@@ -146,7 +135,6 @@ files:
146
135
  - lib/pry/commands/show_info.rb
147
136
  - lib/pry/commands/show_input.rb
148
137
  - lib/pry/commands/show_source.rb
149
- - lib/pry/commands/simple_prompt.rb
150
138
  - lib/pry/commands/stat.rb
151
139
  - lib/pry/commands/switch_to.rb
152
140
  - lib/pry/commands/toggle_color.rb
@@ -168,10 +156,10 @@ files:
168
156
  - lib/pry/helpers/command_helpers.rb
169
157
  - lib/pry/helpers/documentation_helpers.rb
170
158
  - lib/pry/helpers/options_helpers.rb
159
+ - lib/pry/helpers/platform.rb
171
160
  - lib/pry/helpers/table.rb
172
161
  - lib/pry/helpers/text.rb
173
162
  - lib/pry/history.rb
174
- - lib/pry/history_array.rb
175
163
  - lib/pry/hooks.rb
176
164
  - lib/pry/indent.rb
177
165
  - lib/pry/input_completer.rb
@@ -190,9 +178,9 @@ files:
190
178
  - lib/pry/prompt.rb
191
179
  - lib/pry/pry_class.rb
192
180
  - lib/pry/pry_instance.rb
193
- - lib/pry/rbx_path.rb
194
181
  - lib/pry/repl.rb
195
182
  - lib/pry/repl_file_loader.rb
183
+ - lib/pry/ring.rb
196
184
  - lib/pry/rubygem.rb
197
185
  - lib/pry/slop.rb
198
186
  - lib/pry/slop/LICENSE
@@ -212,7 +200,7 @@ homepage: http://pryrepl.org
212
200
  licenses:
213
201
  - MIT
214
202
  metadata: {}
215
- post_install_message:
203
+ post_install_message:
216
204
  rdoc_options: []
217
205
  require_paths:
218
206
  - lib
@@ -227,9 +215,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
227
215
  - !ruby/object:Gem::Version
228
216
  version: '0'
229
217
  requirements: []
230
- rubyforge_project:
231
- rubygems_version: 2.6.13
232
- signing_key:
218
+ rubyforge_project:
219
+ rubygems_version: 2.7.6
220
+ signing_key:
233
221
  specification_version: 4
234
222
  summary: An IRB alternative and runtime developer console
235
223
  test_files: []
@@ -1,35 +0,0 @@
1
- class Pry::Command::ListPrompts < Pry::ClassCommand
2
- match 'list-prompts'
3
- group 'Input and Output'
4
- description 'List the prompts available for use.'
5
- banner <<-BANNER
6
- Usage: list-prompts
7
-
8
- List the available prompts. You can use change-prompt to switch between
9
- them.
10
- BANNER
11
-
12
- def process
13
- output.puts heading("Available prompts") + "\n"
14
- prompt_map.each do |name, prompt|
15
- output.write "Name: #{text.bold(name)}"
16
- output.puts selected_prompt?(prompt) ? selected_text : ""
17
- output.puts prompt[:description]
18
- output.puts
19
- end
20
- end
21
-
22
- private
23
- def prompt_map
24
- Pry::Prompt::MAP
25
- end
26
-
27
- def selected_text
28
- text.red " (selected) "
29
- end
30
-
31
- def selected_prompt?(prompt)
32
- _pry_.prompt == prompt[:value]
33
- end
34
- Pry::Commands.add_command(self)
35
- end
@@ -1,22 +0,0 @@
1
- class Pry
2
- class Command::SimplePrompt < Pry::ClassCommand
3
- match 'simple-prompt'
4
- group 'prompts'
5
- description 'Toggle the simple prompt.'
6
-
7
- banner <<-'BANNER'
8
- Toggle the simple prompt.
9
- BANNER
10
-
11
- def process
12
- case _pry_.prompt
13
- when Pry::SIMPLE_PROMPT
14
- _pry_.pop_prompt
15
- else
16
- _pry_.push_prompt Pry::SIMPLE_PROMPT
17
- end
18
- end
19
- end
20
-
21
- Pry::Commands.add_command(Pry::Command::SimplePrompt)
22
- end
@@ -1,121 +0,0 @@
1
- class Pry
2
- # A history array is an array to which you can only add elements. Older
3
- # entries are removed progressively, so that the array never contains more than
4
- # N elements.
5
- #
6
- # History arrays are used by Pry to store the output of the last commands.
7
- #
8
- # @example
9
- # ary = Pry::HistoryArray.new 10
10
- # ary << 1 << 2 << 3
11
- # ary[0] # => 1
12
- # ary[1] # => 2
13
- # 10.times { |n| ary << n }
14
- # ary[0] # => nil
15
- # ary[-1] # => 9
16
- class HistoryArray
17
- include Enumerable
18
-
19
- # @param [Integer] size Maximum amount of objects in the array
20
- def initialize(size)
21
- @max_size = size
22
-
23
- @hash = {}
24
- @count = 0
25
- end
26
-
27
- # Pushes an object at the end of the array
28
- # @param [Object] value Object to be added
29
- def <<(value)
30
- @hash[@count] = value
31
-
32
- if @hash.size > max_size
33
- @hash.delete(@count - max_size)
34
- end
35
-
36
- @count += 1
37
-
38
- self
39
- end
40
-
41
- # @overload [](index)
42
- # @param [Integer] index Index of the item to access.
43
- # @return [Object, nil] Item at that index or nil if it has been removed.
44
- # @overload [](index, size)
45
- # @param [Integer] index Index of the first item to access.
46
- # @param [Integer] size Amount of items to access
47
- # @return [Array, nil] The selected items. Nil if index is greater than
48
- # the size of the array.
49
- # @overload [](range)
50
- # @param [Range<Integer>] range Range of indices to access.
51
- # @return [Array, nil] The selected items. Nil if index is greater than
52
- # the size of the array.
53
- def [](index_or_range, size = nil)
54
- if index_or_range.is_a? Integer
55
- index = convert_index(index_or_range)
56
-
57
- if size
58
- end_index = index + size
59
- index > @count ? nil : (index...[end_index, @count].min).map do |n|
60
- @hash[n]
61
- end
62
- else
63
- @hash[index]
64
- end
65
- else
66
- range = convert_range(index_or_range)
67
- range.begin > @count ? nil : range.map { |n| @hash[n] }
68
- end
69
- end
70
-
71
- # @return [Integer] Amount of objects in the array
72
- def size
73
- @count
74
- end
75
- alias count size
76
- alias length size
77
-
78
- def empty?
79
- size == 0
80
- end
81
-
82
- def each
83
- ((@count - size)...@count).each do |n|
84
- yield @hash[n]
85
- end
86
- end
87
-
88
- def to_a
89
- ((@count - size)...@count).map { |n| @hash[n] }
90
- end
91
-
92
- # @return [Hash] copy of the internal @hash history
93
- def to_h
94
- @hash.dup
95
- end
96
-
97
- def pop!
98
- @hash.delete @count - 1
99
- @count -= 1
100
- end
101
-
102
- def inspect
103
- "#<#{self.class} size=#{size} first=#{@count - size} max_size=#{max_size}>"
104
- end
105
-
106
- # @return [Integer] Maximum amount of objects in the array
107
- attr_reader :max_size
108
-
109
- private
110
- def convert_index(n)
111
- n >= 0 ? n : @count + n
112
- end
113
-
114
- def convert_range(range)
115
- end_index = convert_index(range.end)
116
- end_index += 1 unless range.exclude_end?
117
-
118
- Range.new(convert_index(range.begin), [end_index, @count].min, true)
119
- end
120
- end
121
- end