pry 0.10.pre.1-i386-mingw32 → 0.10.0.pre3-i386-mingw32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (214) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +702 -0
  3. data/LICENSE +2 -2
  4. data/{README.markdown → README.md} +41 -35
  5. data/lib/pry.rb +82 -139
  6. data/lib/pry/cli.rb +77 -30
  7. data/lib/pry/code.rb +122 -183
  8. data/lib/pry/code/code_file.rb +103 -0
  9. data/lib/pry/code/code_range.rb +71 -0
  10. data/lib/pry/code/loc.rb +92 -0
  11. data/lib/pry/code_object.rb +172 -0
  12. data/lib/pry/color_printer.rb +55 -0
  13. data/lib/pry/command.rb +184 -28
  14. data/lib/pry/command_set.rb +113 -59
  15. data/lib/pry/commands.rb +4 -27
  16. data/lib/pry/commands/amend_line.rb +99 -0
  17. data/lib/pry/commands/bang.rb +20 -0
  18. data/lib/pry/commands/bang_pry.rb +17 -0
  19. data/lib/pry/commands/cat.rb +62 -0
  20. data/lib/pry/commands/cat/abstract_formatter.rb +27 -0
  21. data/lib/pry/commands/cat/exception_formatter.rb +77 -0
  22. data/lib/pry/commands/cat/file_formatter.rb +67 -0
  23. data/lib/pry/commands/cat/input_expression_formatter.rb +43 -0
  24. data/lib/pry/commands/cd.rb +41 -0
  25. data/lib/pry/commands/change_inspector.rb +27 -0
  26. data/lib/pry/commands/change_prompt.rb +26 -0
  27. data/lib/pry/commands/code_collector.rb +165 -0
  28. data/lib/pry/commands/disable_pry.rb +27 -0
  29. data/lib/pry/commands/disabled_commands.rb +2 -0
  30. data/lib/pry/commands/easter_eggs.rb +112 -0
  31. data/lib/pry/commands/edit.rb +195 -0
  32. data/lib/pry/commands/edit/exception_patcher.rb +25 -0
  33. data/lib/pry/commands/edit/file_and_line_locator.rb +36 -0
  34. data/lib/pry/commands/exit.rb +42 -0
  35. data/lib/pry/commands/exit_all.rb +29 -0
  36. data/lib/pry/commands/exit_program.rb +23 -0
  37. data/lib/pry/commands/find_method.rb +193 -0
  38. data/lib/pry/commands/fix_indent.rb +19 -0
  39. data/lib/pry/commands/gem_cd.rb +26 -0
  40. data/lib/pry/commands/gem_install.rb +32 -0
  41. data/lib/pry/commands/gem_list.rb +33 -0
  42. data/lib/pry/commands/gem_open.rb +29 -0
  43. data/lib/pry/commands/gist.rb +101 -0
  44. data/lib/pry/commands/help.rb +164 -0
  45. data/lib/pry/commands/hist.rb +180 -0
  46. data/lib/pry/commands/import_set.rb +22 -0
  47. data/lib/pry/commands/install_command.rb +53 -0
  48. data/lib/pry/commands/jump_to.rb +29 -0
  49. data/lib/pry/commands/list_inspectors.rb +35 -0
  50. data/lib/pry/commands/list_prompts.rb +35 -0
  51. data/lib/pry/commands/ls.rb +114 -0
  52. data/lib/pry/commands/ls/constants.rb +47 -0
  53. data/lib/pry/commands/ls/formatter.rb +49 -0
  54. data/lib/pry/commands/ls/globals.rb +48 -0
  55. data/lib/pry/commands/ls/grep.rb +21 -0
  56. data/lib/pry/commands/ls/instance_vars.rb +39 -0
  57. data/lib/pry/commands/ls/interrogatable.rb +18 -0
  58. data/lib/pry/commands/ls/jruby_hacks.rb +49 -0
  59. data/lib/pry/commands/ls/local_names.rb +35 -0
  60. data/lib/pry/commands/ls/local_vars.rb +39 -0
  61. data/lib/pry/commands/ls/ls_entity.rb +70 -0
  62. data/lib/pry/commands/ls/methods.rb +57 -0
  63. data/lib/pry/commands/ls/methods_helper.rb +46 -0
  64. data/lib/pry/commands/ls/self_methods.rb +32 -0
  65. data/lib/pry/commands/nesting.rb +25 -0
  66. data/lib/pry/commands/play.rb +103 -0
  67. data/lib/pry/commands/pry_backtrace.rb +25 -0
  68. data/lib/pry/commands/pry_version.rb +17 -0
  69. data/lib/pry/commands/raise_up.rb +32 -0
  70. data/lib/pry/commands/reload_code.rb +62 -0
  71. data/lib/pry/commands/reset.rb +18 -0
  72. data/lib/pry/commands/ri.rb +60 -0
  73. data/lib/pry/commands/save_file.rb +61 -0
  74. data/lib/pry/commands/shell_command.rb +48 -0
  75. data/lib/pry/commands/shell_mode.rb +25 -0
  76. data/lib/pry/commands/show_doc.rb +83 -0
  77. data/lib/pry/commands/show_info.rb +195 -0
  78. data/lib/pry/commands/show_input.rb +17 -0
  79. data/lib/pry/commands/show_source.rb +50 -0
  80. data/lib/pry/commands/simple_prompt.rb +22 -0
  81. data/lib/pry/commands/stat.rb +40 -0
  82. data/lib/pry/commands/switch_to.rb +23 -0
  83. data/lib/pry/commands/toggle_color.rb +24 -0
  84. data/lib/pry/commands/watch_expression.rb +105 -0
  85. data/lib/pry/commands/watch_expression/expression.rb +38 -0
  86. data/lib/pry/commands/whereami.rb +190 -0
  87. data/lib/pry/commands/wtf.rb +57 -0
  88. data/lib/pry/config.rb +20 -229
  89. data/lib/pry/config/behavior.rb +139 -0
  90. data/lib/pry/config/convenience.rb +26 -0
  91. data/lib/pry/config/default.rb +165 -0
  92. data/lib/pry/core_extensions.rb +59 -38
  93. data/lib/pry/editor.rb +133 -0
  94. data/lib/pry/exceptions.rb +77 -0
  95. data/lib/pry/helpers.rb +1 -0
  96. data/lib/pry/helpers/base_helpers.rb +40 -154
  97. data/lib/pry/helpers/command_helpers.rb +19 -130
  98. data/lib/pry/helpers/documentation_helpers.rb +21 -11
  99. data/lib/pry/helpers/table.rb +109 -0
  100. data/lib/pry/helpers/text.rb +8 -9
  101. data/lib/pry/history.rb +61 -45
  102. data/lib/pry/history_array.rb +11 -1
  103. data/lib/pry/hooks.rb +10 -32
  104. data/lib/pry/indent.rb +110 -38
  105. data/lib/pry/input_completer.rb +242 -0
  106. data/lib/pry/input_lock.rb +132 -0
  107. data/lib/pry/inspector.rb +27 -0
  108. data/lib/pry/last_exception.rb +61 -0
  109. data/lib/pry/method.rb +199 -200
  110. data/lib/pry/method/disowned.rb +53 -0
  111. data/lib/pry/method/patcher.rb +125 -0
  112. data/lib/pry/method/weird_method_locator.rb +186 -0
  113. data/lib/pry/module_candidate.rb +39 -33
  114. data/lib/pry/object_path.rb +82 -0
  115. data/lib/pry/output.rb +50 -0
  116. data/lib/pry/pager.rb +234 -0
  117. data/lib/pry/plugins.rb +4 -3
  118. data/lib/pry/prompt.rb +26 -0
  119. data/lib/pry/pry_class.rb +199 -227
  120. data/lib/pry/pry_instance.rb +344 -403
  121. data/lib/pry/rbx_path.rb +1 -1
  122. data/lib/pry/repl.rb +202 -0
  123. data/lib/pry/repl_file_loader.rb +20 -26
  124. data/lib/pry/rubygem.rb +82 -0
  125. data/lib/pry/terminal.rb +79 -0
  126. data/lib/pry/test/helper.rb +170 -0
  127. data/lib/pry/version.rb +1 -1
  128. data/lib/pry/wrapped_module.rb +133 -48
  129. metadata +132 -197
  130. data/.document +0 -2
  131. data/.gemtest +0 -0
  132. data/.gitignore +0 -16
  133. data/.travis.yml +0 -17
  134. data/.yardopts +0 -1
  135. data/CHANGELOG +0 -387
  136. data/CONTRIBUTORS +0 -36
  137. data/Gemfile +0 -2
  138. data/Rakefile +0 -137
  139. data/TODO +0 -117
  140. data/examples/example_basic.rb +0 -15
  141. data/examples/example_command_override.rb +0 -32
  142. data/examples/example_commands.rb +0 -36
  143. data/examples/example_hooks.rb +0 -9
  144. data/examples/example_image_edit.rb +0 -67
  145. data/examples/example_input.rb +0 -7
  146. data/examples/example_input2.rb +0 -29
  147. data/examples/example_output.rb +0 -11
  148. data/examples/example_print.rb +0 -6
  149. data/examples/example_prompt.rb +0 -9
  150. data/examples/helper.rb +0 -6
  151. data/lib/pry/completion.rb +0 -221
  152. data/lib/pry/custom_completions.rb +0 -6
  153. data/lib/pry/default_commands/cd.rb +0 -81
  154. data/lib/pry/default_commands/commands.rb +0 -62
  155. data/lib/pry/default_commands/context.rb +0 -98
  156. data/lib/pry/default_commands/easter_eggs.rb +0 -95
  157. data/lib/pry/default_commands/editing.rb +0 -420
  158. data/lib/pry/default_commands/find_method.rb +0 -169
  159. data/lib/pry/default_commands/gems.rb +0 -84
  160. data/lib/pry/default_commands/gist.rb +0 -187
  161. data/lib/pry/default_commands/help.rb +0 -127
  162. data/lib/pry/default_commands/hist.rb +0 -120
  163. data/lib/pry/default_commands/input_and_output.rb +0 -306
  164. data/lib/pry/default_commands/introspection.rb +0 -410
  165. data/lib/pry/default_commands/ls.rb +0 -272
  166. data/lib/pry/default_commands/misc.rb +0 -38
  167. data/lib/pry/default_commands/navigating_pry.rb +0 -110
  168. data/lib/pry/default_commands/whereami.rb +0 -92
  169. data/lib/pry/extended_commands/experimental.rb +0 -7
  170. data/lib/pry/rbx_method.rb +0 -13
  171. data/man/pry.1 +0 -195
  172. data/man/pry.1.html +0 -204
  173. data/man/pry.1.ronn +0 -141
  174. data/pry.gemspec +0 -46
  175. data/test/candidate_helper1.rb +0 -11
  176. data/test/candidate_helper2.rb +0 -8
  177. data/test/helper.rb +0 -223
  178. data/test/test_cli.rb +0 -78
  179. data/test/test_code.rb +0 -201
  180. data/test/test_command.rb +0 -712
  181. data/test/test_command_helpers.rb +0 -9
  182. data/test/test_command_integration.rb +0 -668
  183. data/test/test_command_set.rb +0 -610
  184. data/test/test_completion.rb +0 -62
  185. data/test/test_control_d_handler.rb +0 -45
  186. data/test/test_default_commands/example.erb +0 -5
  187. data/test/test_default_commands/test_cd.rb +0 -318
  188. data/test/test_default_commands/test_context.rb +0 -280
  189. data/test/test_default_commands/test_documentation.rb +0 -314
  190. data/test/test_default_commands/test_find_method.rb +0 -50
  191. data/test/test_default_commands/test_gems.rb +0 -18
  192. data/test/test_default_commands/test_help.rb +0 -57
  193. data/test/test_default_commands/test_input.rb +0 -428
  194. data/test/test_default_commands/test_introspection.rb +0 -511
  195. data/test/test_default_commands/test_ls.rb +0 -151
  196. data/test/test_default_commands/test_shell.rb +0 -343
  197. data/test/test_default_commands/test_show_source.rb +0 -432
  198. data/test/test_exception_whitelist.rb +0 -21
  199. data/test/test_history_array.rb +0 -65
  200. data/test/test_hooks.rb +0 -521
  201. data/test/test_indent.rb +0 -277
  202. data/test/test_input_stack.rb +0 -86
  203. data/test/test_method.rb +0 -401
  204. data/test/test_pry.rb +0 -463
  205. data/test/test_pry_defaults.rb +0 -419
  206. data/test/test_pry_history.rb +0 -84
  207. data/test/test_pry_output.rb +0 -41
  208. data/test/test_sticky_locals.rb +0 -155
  209. data/test/test_syntax_checking.rb +0 -65
  210. data/test/test_wrapped_module.rb +0 -174
  211. data/test/testrc +0 -2
  212. data/test/testrcbad +0 -2
  213. data/wiki/Customizing-pry.md +0 -397
  214. data/wiki/Home.md +0 -4
@@ -15,53 +15,29 @@ class Pry
15
15
  file.close(true) if file
16
16
  end
17
17
 
18
- def render_output(str, opts={})
19
- if opts[:flood]
20
- output.puts str
21
- else
22
- stagger_output str
23
- end
24
- end
25
-
26
- # Return the file and line for a Binding.
27
- # @param [Binding] target The binding
28
- # @return [Array] The file and line
29
- def file_and_line_from_binding(target)
30
- file = target.eval('__FILE__')
31
- line_num = target.eval('__LINE__')
32
- if rbx?
33
- if !target.instance_variable_defined?(:@__actual_file__)
34
- target.instance_variable_set(:@__actual_file__, RbxPath.convert_path_to_full(target.variables.method.file.to_s))
35
- end
36
- file = target.instance_variable_get(:@__actual_file__).to_s
37
- end
38
-
39
- [file, line_num]
40
- end
41
-
42
18
  def internal_binding?(target)
43
- m = target.eval("__method__").to_s
19
+ m = target.eval("::Kernel.__method__").to_s
44
20
  # class_eval is here because of http://jira.codehaus.org/browse/JRUBY-6753
45
- ["__binding__", "__binding_impl__", "class_eval"].include?(m)
21
+ ["__binding__", "__pry__", "class_eval"].include?(m)
46
22
  end
47
23
 
48
24
  def get_method_or_raise(name, target, opts={}, omit_help=false)
49
25
  meth = Pry::Method.from_str(name, target, opts)
50
26
 
51
27
  if name && !meth
52
- command_error("The method '#{name}' could not be found.", omit_help)
28
+ command_error("The method '#{name}' could not be found.", omit_help, MethodNotFound)
53
29
  end
54
30
 
55
31
  (opts[:super] || 0).times do
56
32
  if meth.super
57
33
  meth = meth.super
58
34
  else
59
- command_error("'#{meth.name_with_owner}' has no super method.", omit_help)
35
+ command_error("'#{meth.name_with_owner}' has no super method.", omit_help, MethodNotFound)
60
36
  end
61
37
  end
62
38
 
63
39
  if !meth || (!name && internal_binding?(target))
64
- command_error("No method name given, and context is not a method.", omit_help, NonMethodContextError)
40
+ command_error("No method name given, and context is not a method.", omit_help, MethodNotFound)
65
41
  end
66
42
 
67
43
  set_file_and_dir_locals(meth.source_file)
@@ -73,104 +49,6 @@ class Pry
73
49
  raise klass, message
74
50
  end
75
51
 
76
- def make_header(meth, content=meth.source)
77
- header = "\n#{Pry::Helpers::Text.bold('From:')} #{meth.source_file} "
78
-
79
- if meth.source_type == :c
80
- header << "(C Method):\n"
81
- else
82
- header << "@ line #{meth.source_line}:\n"
83
- end
84
-
85
- header << "#{Pry::Helpers::Text.bold("Number of lines:")} #{content.each_line.count.to_s}\n"
86
- end
87
-
88
- def invoke_editor(file, line, reloading)
89
- raise CommandError, "Please set Pry.config.editor or export $VISUAL or $EDITOR" unless Pry.config.editor
90
- if Pry.config.editor.respond_to?(:call)
91
- args = [file, line, reloading][0...(Pry.config.editor.arity)]
92
- editor_invocation = Pry.config.editor.call(*args)
93
- else
94
- editor_invocation = "#{Pry.config.editor} #{blocking_flag_for_editor(reloading)} #{start_line_syntax_for_editor(file, line)}"
95
- end
96
- return nil unless editor_invocation
97
-
98
- if jruby?
99
- begin
100
- require 'spoon'
101
- pid = Spoon.spawnp(*editor_invocation.split)
102
- Process.waitpid(pid)
103
- rescue FFI::NotFoundError
104
- system(editor_invocation)
105
- end
106
- else
107
- # Note we dont want to use Pry.config.system here as that
108
- # may be invoked non-interactively (i.e via Open4), whereas we want to
109
- # ensure the editor is always interactive
110
- system(editor_invocation) or raise CommandError, "`#{editor_invocation}` gave exit status: #{$?.exitstatus}"
111
- end
112
- end
113
-
114
- # Some editors that run outside the terminal allow you to control whether or
115
- # not to block the process from which they were launched (in this case, Pry).
116
- # For those editors, return the flag that produces the desired behavior.
117
- def blocking_flag_for_editor(block)
118
- case editor_name
119
- when /^emacsclient/
120
- '--no-wait' unless block
121
- when /^[gm]vim/
122
- '--nofork' if block
123
- when /^jedit/
124
- '-wait' if block
125
- when /^mate/, /^subl/
126
- '-w' if block
127
- end
128
- end
129
-
130
- # Return the syntax for a given editor for starting the editor
131
- # and moving to a particular line within that file
132
- def start_line_syntax_for_editor(file_name, line_number)
133
- if windows?
134
- file_name = file_name.gsub(/\//, '\\')
135
- end
136
-
137
- # special case for 1st line
138
- return file_name if line_number <= 1
139
-
140
- case editor_name
141
- when /^[gm]?vi/, /^emacs/, /^nano/, /^pico/, /^gedit/, /^kate/
142
- "+#{line_number} #{file_name}"
143
- when /^mate/, /^geany/
144
- "-l #{line_number} #{file_name}"
145
- when /^subl/
146
- "#{file_name}:#{line_number}"
147
- when /^uedit32/
148
- "#{file_name}/#{line_number}"
149
- when /^jedit/
150
- "#{file_name} +line:#{line_number}"
151
- else
152
- if windows?
153
- "#{file_name}"
154
- else
155
- "+#{line_number} #{file_name}"
156
- end
157
- end
158
- end
159
-
160
- # Get the name of the binary that Pry.config.editor points to.
161
- #
162
- # This is useful for deciding which flags we pass to the editor as
163
- # we can just use the program's name and ignore any absolute paths.
164
- #
165
- # @example
166
- # Pry.config.editor="/home/conrad/bin/textmate -w"
167
- # editor_name
168
- # # => textmate
169
- #
170
- def editor_name
171
- File.basename(Pry.config.editor).split(" ").first
172
- end
173
-
174
52
  # Remove any common leading whitespace from every line in `text`.
175
53
  #
176
54
  # This can be used to make a HEREDOC line up with the left margin, without
@@ -193,12 +71,14 @@ class Pry
193
71
  #
194
72
  # @param [String] text The text from which to remove indentation
195
73
  # @return [String] The text with indentation stripped.
196
- def unindent(text)
74
+ def unindent(text, left_padding = 0)
197
75
  # Empty blank lines
198
76
  text = text.sub(/^[ \t]+$/, '')
199
77
 
200
78
  # Find the longest common whitespace to all indented lines
201
- margin = text.scan(/^[ \t]*(?=[^ \t\n])/).inject do |current_margin, next_indent|
79
+ # Ignore lines containing just -- or ++ as these seem to be used by
80
+ # comment authors as delimeters.
81
+ margin = text.scan(/^[ \t]*(?!--\n|\+\+\n)(?=[^ \t\n])/).inject do |current_margin, next_indent|
202
82
  if next_indent.start_with?(current_margin)
203
83
  current_margin
204
84
  elsif current_margin.start_with?(next_indent)
@@ -208,7 +88,7 @@ class Pry
208
88
  end
209
89
  end
210
90
 
211
- text.gsub(/^#{margin}/, '')
91
+ text.gsub(/^#{margin}/, ' ' * left_padding)
212
92
  end
213
93
 
214
94
  # Restrict a string to the given range of lines (1-indexed)
@@ -261,6 +141,15 @@ class Pry
261
141
 
262
142
  Range.new(a, b)
263
143
  end
144
+
145
+ def set_file_and_dir_locals(file_name, _pry_=_pry_(), target=target())
146
+ return if !target or !file_name
147
+ _pry_.last_file = File.expand_path(file_name)
148
+ _pry_.inject_local("_file_", _pry_.last_file, target)
149
+
150
+ _pry_.last_dir = File.dirname(_pry_.last_file)
151
+ _pry_.inject_local("_dir_", _pry_.last_dir, target)
152
+ end
264
153
  end
265
154
 
266
155
  end
@@ -4,14 +4,17 @@ class Pry
4
4
  # This class contains methods useful for extracting
5
5
  # documentation from methods and classes.
6
6
  module DocumentationHelpers
7
- def process_rdoc(comment, code_type)
7
+
8
+ module_function
9
+
10
+ def process_rdoc(comment)
8
11
  comment = comment.dup
9
- comment.gsub(/<code>(?:\s*\n)?(.*?)\s*<\/code>/m) { Pry.color ? CodeRay.scan($1, code_type).term : $1 }.
10
- gsub(/<em>(?:\s*\n)?(.*?)\s*<\/em>/m) { Pry.color ? "\e[1m#{$1}\e[0m": $1 }.
11
- gsub(/<i>(?:\s*\n)?(.*?)\s*<\/i>/m) { Pry.color ? "\e[1m#{$1}\e[0m" : $1 }.
12
- gsub(/\B\+(\w*?)\+\B/) { Pry.color ? "\e[32m#{$1}\e[0m": $1 }.
13
- gsub(/((?:^[ \t]+.+(?:\n+|\Z))+)/) { Pry.color ? CodeRay.scan($1, code_type).term : $1 }.
14
- gsub(/`(?:\s*\n)?([^\e]*?)\s*`/) { "`#{Pry.color ? CodeRay.scan($1, code_type).term : $1}`" }
12
+ comment.gsub(/<code>(?:\s*\n)?(.*?)\s*<\/code>/m) { CodeRay.scan($1, :ruby).term }.
13
+ gsub(/<em>(?:\s*\n)?(.*?)\s*<\/em>/m) { "\e[1m#{$1}\e[0m" }.
14
+ gsub(/<i>(?:\s*\n)?(.*?)\s*<\/i>/m) { "\e[1m#{$1}\e[0m" }.
15
+ gsub(/\B\+(\w+?)\+\B/) { "\e[32m#{$1}\e[0m" }.
16
+ gsub(/((?:^[ \t]+.+(?:\n+|\Z))+)/) { CodeRay.scan($1, :ruby).term }.
17
+ gsub(/`(?:\s*\n)?([^\e]*?)\s*`/) { "`#{CodeRay.scan($1, :ruby).term}`" }
15
18
  end
16
19
 
17
20
  def process_yardoc_tag(comment, tag)
@@ -33,11 +36,11 @@ class Pry
33
36
  yard_tags = ["param", "return", "option", "yield", "attr", "attr_reader", "attr_writer",
34
37
  "deprecate", "example", "raise"]
35
38
  (yard_tags - ["example"]).inject(comment) { |a, v| process_yardoc_tag(a, v) }.
36
- gsub(/^@(#{yard_tags.join("|")})/) { Pry.color ? "\e[33m#{$1}\e[0m": $1 }
39
+ gsub(/^@(#{yard_tags.join("|")})/) { "\e[33m#{$1}\e[0m" }
37
40
  end
38
41
 
39
- def process_comment_markup(comment, code_type)
40
- process_yardoc process_rdoc(comment, code_type)
42
+ def process_comment_markup(comment)
43
+ process_yardoc process_rdoc(comment)
41
44
  end
42
45
 
43
46
  # @param [String] code
@@ -46,10 +49,17 @@ class Pry
46
49
  code.sub(/\A\s*\/\*.*?\*\/\s*/m, '')
47
50
  end
48
51
 
52
+ # Given a string that makes up a comment in a source-code file parse out the content
53
+ # that the user is intended to read. (i.e. without leading indentation, #-characters
54
+ # or shebangs)
55
+ #
49
56
  # @param [String] comment
50
57
  # @return [String]
51
- def strip_leading_hash_and_whitespace_from_ruby_comments(comment)
58
+ def get_comment_content(comment)
52
59
  comment = comment.dup
60
+ # Remove #!/usr/bin/ruby
61
+ comment.gsub!(/\A\#!.*$/, '')
62
+ # Remove leading empty comment lines
53
63
  comment.gsub!(/\A\#+?$/, '')
54
64
  comment.gsub!(/^\s*#/, '')
55
65
  strip_leading_whitespace(comment)
@@ -0,0 +1,109 @@
1
+ class Pry
2
+ module Helpers
3
+ def self.tablify_or_one_line(heading, things)
4
+ plain_heading = Pry::Helpers::Text.strip_color(heading)
5
+ attempt = Table.new(things, :column_count => things.size)
6
+ if attempt.fits_on_line?(Terminal.width! - plain_heading.size - 2)
7
+ "#{heading}: #{attempt}\n"
8
+ else
9
+ "#{heading}: \n#{tablify_to_screen_width(things, :indent => ' ')}\n"
10
+ end
11
+ end
12
+
13
+ def self.tablify_to_screen_width(things, options = {})
14
+ things = things.compact
15
+ if indent = options[:indent]
16
+ usable_width = Terminal.width! - indent.size
17
+ tablify(things, usable_width).to_s.gsub(/^/, indent)
18
+ else
19
+ tablify(things, Terminal.width!).to_s
20
+ end
21
+ end
22
+
23
+ def self.tablify(things, line_length)
24
+ table = Table.new(things, :column_count => things.size)
25
+ table.column_count -= 1 until 1 == table.column_count or
26
+ table.fits_on_line?(line_length)
27
+ table
28
+ end
29
+
30
+ class Table
31
+ attr_reader :items, :column_count
32
+ def initialize items, args = {}
33
+ @column_count = args[:column_count]
34
+ self.items = items
35
+ end
36
+
37
+ def to_s
38
+ rows_to_s.join("\n")
39
+ end
40
+
41
+ def rows_to_s style = :color_on
42
+ widths = columns.map{|e| _max_width(e)}
43
+ @rows_without_colors.map do |r|
44
+ padded = []
45
+ r.each_with_index do |e,i|
46
+ next unless e
47
+ item = e.ljust(widths[i])
48
+ item.sub! e, _recall_color_for(e) if :color_on == style
49
+ padded << item
50
+ end
51
+ padded.join(Pry.config.ls.separator)
52
+ end
53
+ end
54
+
55
+ def items= items
56
+ @items = items
57
+ _rebuild_colorless_cache
58
+ _recolumn
59
+ items
60
+ end
61
+
62
+ def column_count= n
63
+ @column_count = n
64
+ _recolumn
65
+ end
66
+
67
+ def fits_on_line? line_length
68
+ _max_width(rows_to_s :no_color) <= line_length
69
+ end
70
+
71
+ def columns
72
+ @rows_without_colors.transpose
73
+ end
74
+
75
+ def ==(other); items == other.to_a end
76
+ def to_a; items.to_a end
77
+
78
+ private
79
+ def _max_width(things)
80
+ things.compact.map(&:size).max || 0
81
+ end
82
+
83
+ def _rebuild_colorless_cache
84
+ @colorless_cache = {}
85
+ @plain_items = []
86
+ items.map do |e|
87
+ plain = Pry::Helpers::Text.strip_color(e)
88
+ @colorless_cache[plain] = e
89
+ @plain_items << plain
90
+ end
91
+ end
92
+
93
+ def _recolumn
94
+ @rows_without_colors = []
95
+ return if items.size.zero?
96
+ row_count = (items.size.to_f/column_count).ceil
97
+ row_count.times do |i|
98
+ row_indices = (0...column_count).map{|e| row_count*e+i}
99
+ @rows_without_colors << row_indices.map{|e| @plain_items[e]}
100
+ end
101
+ end
102
+
103
+ def _recall_color_for thing
104
+ @colorless_cache[thing]
105
+ end
106
+ end
107
+
108
+ end
109
+ end
@@ -21,11 +21,11 @@ class Pry
21
21
 
22
22
  COLORS.each_pair do |color, value|
23
23
  define_method color do |text|
24
- Pry.color ? "\033[0;#{30+value}m#{text}\033[0m" : text.to_s
24
+ "\033[0;#{30+value}m#{text}\033[0m"
25
25
  end
26
26
 
27
27
  define_method "bright_#{color}" do |text|
28
- Pry.color ? "\033[1;#{30+value}m#{text}\033[0m" : text.to_s
28
+ "\033[1;#{30+value}m#{text}\033[0m"
29
29
  end
30
30
  end
31
31
 
@@ -33,17 +33,16 @@ class Pry
33
33
  #
34
34
  # @param [String, #to_s] text
35
35
  # @return [String] _text_ stripped of any color codes.
36
- def strip_color text
36
+ def strip_color(text)
37
37
  text.to_s.gsub(/\e\[.*?(\d)+m/ , '')
38
38
  end
39
39
 
40
40
  # Returns _text_ as bold text for use on a terminal.
41
- # _Pry.color_ must be true for this method to perform any transformations.
42
41
  #
43
42
  # @param [String, #to_s] text
44
43
  # @return [String] _text_
45
- def bold text
46
- Pry.color ? "\e[1m#{text}\e[0m" : text.to_s
44
+ def bold(text)
45
+ "\e[1m#{text}\e[0m"
47
46
  end
48
47
 
49
48
  # Returns `text` in the default foreground colour.
@@ -56,10 +55,10 @@ class Pry
56
55
  end
57
56
  alias_method :bright_default, :bold
58
57
 
59
- # Executes the block with `Pry.color` set to false.
58
+ # Executes the block with `Pry.config.color` set to false.
60
59
  # @yield
61
60
  # @return [void]
62
- def no_color &block
61
+ def no_color(&block)
63
62
  boolean = Pry.config.color
64
63
  Pry.config.color = false
65
64
  yield
@@ -70,7 +69,7 @@ class Pry
70
69
  # Executes the block with `Pry.config.pager` set to false.
71
70
  # @yield
72
71
  # @return [void]
73
- def no_pager &block
72
+ def no_pager(&block)
74
73
  boolean = Pry.config.pager
75
74
  Pry.config.pager = false
76
75
  yield
data/lib/pry/history.rb CHANGED
@@ -1,21 +1,33 @@
1
1
  class Pry
2
- # The History class is responsible for maintaining the user's input history, both
3
- # internally and within Readline.
2
+ # The History class is responsible for maintaining the user's input history,
3
+ # both internally and within Readline.
4
4
  class History
5
5
  attr_accessor :loader, :saver, :pusher, :clearer
6
6
 
7
- def initialize
7
+ # @return [Fixnum] Number of lines in history when Pry first loaded.
8
+ attr_reader :original_lines
9
+
10
+ def initialize(options={})
8
11
  @history = []
9
- @saved_lines = 0
12
+ @original_lines = 0
13
+ @file_path = options[:file_path]
10
14
  restore_default_behavior
11
15
  end
12
16
 
13
17
  # Assign the default methods for loading, saving, pushing, and clearing.
14
18
  def restore_default_behavior
15
- @loader = method(:read_from_file)
16
- @saver = method(:write_to_file)
17
- @pusher = method(:push_to_readline)
18
- @clearer = method(:clear_readline)
19
+ Pry.config.input # force Readline to load if applicable
20
+
21
+ @loader = method(:read_from_file)
22
+ @saver = method(:save_to_file)
23
+
24
+ if defined?(Readline)
25
+ @pusher = method(:push_to_readline)
26
+ @clearer = method(:clear_readline)
27
+ else
28
+ @pusher = proc { }
29
+ @clearer = proc { }
30
+ end
19
31
  end
20
32
 
21
33
  # Load the input history using `History.loader`.
@@ -24,17 +36,8 @@ class Pry
24
36
  @loader.call do |line|
25
37
  @pusher.call(line.chomp)
26
38
  @history << line.chomp
39
+ @original_lines += 1
27
40
  end
28
- @saved_lines = @history.length
29
- end
30
-
31
- # Write this session's history using `History.saver`.
32
- # @return [Integer] The number of lines saved
33
- def save
34
- history_to_save = @history[@saved_lines..-1]
35
- @saver.call(history_to_save)
36
- @saved_lines = @history.length
37
- history_to_save.length
38
41
  end
39
42
 
40
43
  # Add a line to the input history, ignoring blank and duplicate lines.
@@ -44,18 +47,27 @@ class Pry
44
47
  unless line.empty? || (@history.last && line == @history.last)
45
48
  @pusher.call(line)
46
49
  @history << line
50
+ @saver.call(line) if Pry.config.history.should_save
47
51
  end
48
52
  line
49
53
  end
50
54
  alias << push
51
55
 
52
- # Clear all history. Anything the user entered before this point won't be
53
- # saved, but anything they put in afterwards will still be appended to the
54
- # history file on exit.
56
+ # Clear this session's history. This won't affect the contents of the
57
+ # history file.
55
58
  def clear
56
59
  @clearer.call
57
60
  @history = []
58
- @saved_lines = 0
61
+ end
62
+
63
+ # @return [Fixnum] The number of lines in history.
64
+ def history_line_count
65
+ @history.count
66
+ end
67
+
68
+ # @return [Fixnum] The number of lines in history from just this session.
69
+ def session_line_count
70
+ @history.count - @original_lines
59
71
  end
60
72
 
61
73
  # Return an Array containing all stored history.
@@ -66,33 +78,16 @@ class Pry
66
78
  end
67
79
 
68
80
  private
81
+
69
82
  # The default loader. Yields lines from `Pry.history.config.file`.
70
83
  def read_from_file
71
- begin
72
- history_file = File.expand_path(Pry.config.history.file)
73
- if File.exists?(history_file)
74
- File.foreach(history_file) { |line| yield(line) }
75
- end
76
- rescue => error
77
- unless error.message.empty?
78
- warn "History file not loaded, received an error: #{error.message}"
79
- end
80
- end
81
- end
84
+ filename = File.expand_path(Pry.config.history.file)
82
85
 
83
- # The default saver. Appends the given lines to `Pry.history.config.file`.
84
- # @param [Array<String>] lines
85
- def write_to_file(lines)
86
- history_file = File.expand_path(Pry.config.history.file)
87
-
88
- begin
89
- File.open(history_file, 'a') do |f|
90
- lines.each { |ln| f.puts ln }
91
- end
92
- rescue Errno::EACCES
93
- # We should probably create an option Pry.show_warnings?!?!?!
94
- warn 'Unable to write to your history file, history not saved'
86
+ if File.exists?(filename)
87
+ File.foreach(filename) { |line| yield(line) }
95
88
  end
89
+ rescue => error
90
+ warn "History file not loaded: #{error.message}"
96
91
  end
97
92
 
98
93
  # The default pusher. Appends the given line to Readline::HISTORY.
@@ -105,5 +100,26 @@ class Pry
105
100
  def clear_readline
106
101
  Readline::HISTORY.shift until Readline::HISTORY.empty?
107
102
  end
103
+
104
+ # The default saver. Appends the given line to `Pry.history.config.file`.
105
+ def save_to_file(line)
106
+ history_file.puts line if history_file
107
+ end
108
+
109
+ # The history file, opened for appending.
110
+ def history_file
111
+ if defined?(@history_file)
112
+ @history_file
113
+ else
114
+ @history_file = File.open(file_path, 'a', 0600).tap { |f| f.sync = true }
115
+ end
116
+ rescue Errno::EACCES
117
+ warn 'History not saved; unable to open your history file for writing.'
118
+ @history_file = false
119
+ end
120
+
121
+ def file_path
122
+ @file_path || Pry.config.history.file
123
+ end
108
124
  end
109
125
  end