awesome_print 0.4.0 → 1.0.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 (44) hide show
  1. data/.gitignore +22 -0
  2. data/CHANGELOG +8 -0
  3. data/Gemfile +3 -0
  4. data/Gemfile.lock +26 -0
  5. data/README.md +52 -14
  6. data/Rakefile +2 -46
  7. data/lib/ap.rb +3 -17
  8. data/lib/awesome_print.rb +16 -12
  9. data/lib/{ap → awesome_print}/core_ext/array.rb +0 -0
  10. data/lib/{ap → awesome_print}/core_ext/class.rb +0 -0
  11. data/lib/{ap → awesome_print}/core_ext/kernel.rb +2 -2
  12. data/lib/awesome_print/core_ext/logger.rb +20 -0
  13. data/lib/{ap → awesome_print}/core_ext/method.rb +0 -0
  14. data/lib/{ap → awesome_print}/core_ext/object.rb +0 -0
  15. data/lib/{ap → awesome_print}/core_ext/string.rb +8 -5
  16. data/lib/awesome_print/ext/action_view.rb +18 -0
  17. data/lib/awesome_print/ext/active_record.rb +40 -0
  18. data/lib/awesome_print/ext/active_support.rb +40 -0
  19. data/lib/awesome_print/ext/mongo_mapper.rb +38 -0
  20. data/lib/awesome_print/ext/mongoid.rb +39 -0
  21. data/lib/awesome_print/ext/nokogiri.rb +45 -0
  22. data/lib/awesome_print/formatter.rb +350 -0
  23. data/lib/awesome_print/inspector.rb +140 -0
  24. data/{rails/init.rb → lib/awesome_print/version.rb} +5 -4
  25. data/spec/colors_spec.rb +106 -0
  26. data/spec/{awesome_print_spec.rb → formats_spec.rb} +187 -37
  27. data/spec/methods_spec.rb +20 -0
  28. data/spec/objects_spec.rb +79 -0
  29. data/spec/spec_helper.rb +1 -1
  30. metadata +49 -53
  31. data/VERSION +0 -1
  32. data/init.rb +0 -1
  33. data/lib/ap/awesome_print.rb +0 -352
  34. data/lib/ap/core_ext/logger.rb +0 -18
  35. data/lib/ap/mixin/action_view.rb +0 -17
  36. data/lib/ap/mixin/active_record.rb +0 -54
  37. data/lib/ap/mixin/active_support.rb +0 -46
  38. data/lib/ap/mixin/mongo_mapper.rb +0 -54
  39. data/spec/action_view_spec.rb +0 -25
  40. data/spec/active_record_spec.rb +0 -136
  41. data/spec/colorization_spec.rb +0 -84
  42. data/spec/logger_spec.rb +0 -43
  43. data/spec/mongo_mapper_spec.rb +0 -63
  44. data/spec/string_spec.rb +0 -20
@@ -1,6 +1,10 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
2
 
3
3
  describe "Single method" do
4
+ before do
5
+ stub_dotfile!
6
+ end
7
+
4
8
  after do
5
9
  Object.instance_eval{ remove_const :Hello } if defined?(Hello)
6
10
  end
@@ -77,6 +81,10 @@ describe "Single method" do
77
81
  end
78
82
 
79
83
  describe "Object methods" do
84
+ before do
85
+ stub_dotfile!
86
+ end
87
+
80
88
  after do
81
89
  Object.instance_eval{ remove_const :Hello } if defined?(Hello)
82
90
  end
@@ -194,6 +202,10 @@ describe "Object methods" do
194
202
  end
195
203
 
196
204
  describe "Class methods" do
205
+ before do
206
+ stub_dotfile!
207
+ end
208
+
197
209
  after do
198
210
  Object.instance_eval{ remove_const :Hello } if defined?(Hello)
199
211
  end
@@ -301,6 +313,10 @@ end
301
313
 
302
314
  if RUBY_VERSION >= '1.9.2'
303
315
  describe "Ruby 1.9.2+ Method#parameters" do
316
+ before do
317
+ stub_dotfile!
318
+ end
319
+
304
320
  after do
305
321
  Object.instance_eval{ remove_const :Hello } if defined?(Hello)
306
322
  end
@@ -354,6 +370,7 @@ describe "Methods arrays" do
354
370
  end
355
371
 
356
372
  it "obj1.methods - obj2.methods should be awesome printed" do
373
+ stub_dotfile!
357
374
  class Hello
358
375
  def self.m1; end
359
376
  end
@@ -362,6 +379,7 @@ describe "Methods arrays" do
362
379
  end
363
380
 
364
381
  it "obj1.methods & obj2.methods should be awesome printed" do
382
+ stub_dotfile!
365
383
  class Hello
366
384
  def self.m1; end
367
385
  def self.m2; end
@@ -374,6 +392,7 @@ describe "Methods arrays" do
374
392
  end
375
393
 
376
394
  it "obj1.methods.grep(pattern) should be awesome printed" do
395
+ stub_dotfile!
377
396
  class Hello
378
397
  def self.m1; end
379
398
  def self.m2; end
@@ -396,6 +415,7 @@ describe "Methods arrays" do
396
415
  end
397
416
 
398
417
  it "obj1.methods.grep(pattern, &block) should be awesome printed" do
418
+ stub_dotfile!
399
419
  class Hello
400
420
  def self.m0; end
401
421
  def self.none; end
@@ -0,0 +1,79 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe "Single method" do
4
+ before do
5
+ stub_dotfile!
6
+ end
7
+
8
+ after do
9
+ Object.instance_eval{ remove_const :Hello } if defined?(Hello)
10
+ end
11
+
12
+ describe "object" do
13
+ it "attributes" do
14
+ class Hello
15
+ attr_reader :abra
16
+ attr_writer :ca
17
+ attr_accessor :dabra
18
+
19
+ def initialize
20
+ @abra, @ca, @dabra = 1, 2, 3
21
+ end
22
+ end
23
+
24
+ out = Hello.new.ai(:plain => true)
25
+ str = <<-EOS.strip
26
+ #<Hello:0x01234567
27
+ attr_accessor :dabra = 3,
28
+ attr_reader :abra = 1,
29
+ attr_writer :ca = 2
30
+ >
31
+ EOS
32
+ out.gsub(/0x([a-f\d]+)/, "0x01234567").should == str
33
+ end
34
+
35
+ it "instance variables" do
36
+ class Hello
37
+ def initialize
38
+ @abra, @ca, @dabra = 1, 2, 3
39
+ end
40
+ end
41
+
42
+ out = Hello.new.ai(:plain => true)
43
+ str = <<-EOS.strip
44
+ #<Hello:0x01234567
45
+ @abra = 1,
46
+ @ca = 2,
47
+ @dabra = 3
48
+ >
49
+ EOS
50
+ out.gsub(/0x([a-f\d]+)/, "0x01234567").should == str
51
+ end
52
+
53
+ it "attributes and instance variables" do
54
+ class Hello
55
+ attr_reader :abra
56
+ attr_writer :ca
57
+ attr_accessor :dabra
58
+
59
+ def initialize
60
+ @abra, @ca, @dabra = 1, 2, 3
61
+ @scooby, @dooby, @doo = 3, 2, 1
62
+ end
63
+ end
64
+
65
+ out = Hello.new.ai(:plain => true)
66
+ str = <<-EOS.strip
67
+ #<Hello:0x01234567
68
+ @doo = 1,
69
+ @dooby = 2,
70
+ @scooby = 3,
71
+ attr_accessor :dabra = 3,
72
+ attr_reader :abra = 1,
73
+ attr_writer :ca = 2
74
+ >
75
+ EOS
76
+ out.gsub(/0x([a-f\d]+)/, "0x01234567").should == str
77
+ end
78
+ end
79
+ end
@@ -19,7 +19,7 @@ end
19
19
 
20
20
  # The following is needed for the Infinity Test. It runs tests as subprocesses,
21
21
  # which sets STDOUT.tty? to false and would otherwise prematurely disallow colors.
22
- AwesomePrint.force_colors!
22
+ ### AwesomePrint.force_colors!
23
23
 
24
24
  # Ruby 1.8.6 only: define missing String methods that are needed for the specs to pass.
25
25
  if RUBY_VERSION < '1.8.7'
metadata CHANGED
@@ -1,13 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: awesome_print
3
3
  version: !ruby/object:Gem::Version
4
- hash: 15
5
- prerelease: false
6
- segments:
7
- - 0
8
- - 4
9
- - 0
10
- version: 0.4.0
4
+ prerelease:
5
+ version: 1.0.0
11
6
  platform: ruby
12
7
  authors:
13
8
  - Michael Dvorkin
@@ -15,8 +10,7 @@ autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
12
 
18
- date: 2011-05-13 00:00:00 -07:00
19
- default_executable:
13
+ date: 2011-11-08 00:00:00 Z
20
14
  dependencies:
21
15
  - !ruby/object:Gem::Dependency
22
16
  name: rspec
@@ -26,55 +20,59 @@ dependencies:
26
20
  requirements:
27
21
  - - ">="
28
22
  - !ruby/object:Gem::Version
29
- hash: 27
30
- segments:
31
- - 2
32
- - 5
33
- - 0
34
- version: 2.5.0
23
+ version: 2.6.0
35
24
  type: :development
36
25
  version_requirements: *id001
37
- description: "Great Ruby dubugging companion: pretty print Ruby objects to visualize their structure. Supports Rails ActiveRecord objects via included mixin."
26
+ - !ruby/object:Gem::Dependency
27
+ name: fakefs
28
+ prerelease: false
29
+ requirement: &id002 !ruby/object:Gem::Requirement
30
+ none: false
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: 0.2.1
35
+ type: :development
36
+ version_requirements: *id002
37
+ description: "Great Ruby dubugging companion: pretty print Ruby objects to visualize their structure. Supports custom object formatting via plugins"
38
38
  email: mike@dvorkin.net
39
39
  executables: []
40
40
 
41
41
  extensions: []
42
42
 
43
- extra_rdoc_files:
44
- - LICENSE
45
- - README.md
43
+ extra_rdoc_files: []
44
+
46
45
  files:
47
46
  - CHANGELOG
47
+ - Gemfile
48
+ - Gemfile.lock
48
49
  - LICENSE
49
- - README.md
50
50
  - Rakefile
51
- - VERSION
52
- - init.rb
51
+ - README.md
53
52
  - lib/ap.rb
54
- - lib/ap/awesome_print.rb
55
- - lib/ap/core_ext/array.rb
56
- - lib/ap/core_ext/class.rb
57
- - lib/ap/core_ext/kernel.rb
58
- - lib/ap/core_ext/logger.rb
59
- - lib/ap/core_ext/method.rb
60
- - lib/ap/core_ext/object.rb
61
- - lib/ap/core_ext/string.rb
62
- - lib/ap/mixin/action_view.rb
63
- - lib/ap/mixin/active_record.rb
64
- - lib/ap/mixin/active_support.rb
65
- - lib/ap/mixin/mongo_mapper.rb
53
+ - lib/awesome_print/core_ext/array.rb
54
+ - lib/awesome_print/core_ext/class.rb
55
+ - lib/awesome_print/core_ext/kernel.rb
56
+ - lib/awesome_print/core_ext/logger.rb
57
+ - lib/awesome_print/core_ext/method.rb
58
+ - lib/awesome_print/core_ext/object.rb
59
+ - lib/awesome_print/core_ext/string.rb
60
+ - lib/awesome_print/ext/action_view.rb
61
+ - lib/awesome_print/ext/active_record.rb
62
+ - lib/awesome_print/ext/active_support.rb
63
+ - lib/awesome_print/ext/mongo_mapper.rb
64
+ - lib/awesome_print/ext/mongoid.rb
65
+ - lib/awesome_print/ext/nokogiri.rb
66
+ - lib/awesome_print/formatter.rb
67
+ - lib/awesome_print/inspector.rb
68
+ - lib/awesome_print/version.rb
66
69
  - lib/awesome_print.rb
67
- - rails/init.rb
68
- - spec/action_view_spec.rb
69
- - spec/active_record_spec.rb
70
- - spec/awesome_print_spec.rb
71
- - spec/colorization_spec.rb
72
- - spec/logger_spec.rb
70
+ - spec/colors_spec.rb
71
+ - spec/formats_spec.rb
73
72
  - spec/methods_spec.rb
74
- - spec/mongo_mapper_spec.rb
73
+ - spec/objects_spec.rb
75
74
  - spec/spec_helper.rb
76
- - spec/string_spec.rb
77
- has_rdoc: true
75
+ - .gitignore
78
76
  homepage: http://github.com/michaeldv/awesome_print
79
77
  licenses: []
80
78
 
@@ -88,25 +86,23 @@ required_ruby_version: !ruby/object:Gem::Requirement
88
86
  requirements:
89
87
  - - ">="
90
88
  - !ruby/object:Gem::Version
91
- hash: 3
92
- segments:
93
- - 0
94
89
  version: "0"
95
90
  required_rubygems_version: !ruby/object:Gem::Requirement
96
91
  none: false
97
92
  requirements:
98
93
  - - ">="
99
94
  - !ruby/object:Gem::Version
100
- hash: 3
101
- segments:
102
- - 0
103
95
  version: "0"
104
96
  requirements: []
105
97
 
106
98
  rubyforge_project: awesome_print
107
- rubygems_version: 1.3.7
99
+ rubygems_version: 1.8.5
108
100
  signing_key:
109
101
  specification_version: 3
110
- summary: Pretty print Ruby objects with proper indentation and colors.
111
- test_files: []
112
-
102
+ summary: Pretty print Ruby objects with proper indentation and colors
103
+ test_files:
104
+ - spec/colors_spec.rb
105
+ - spec/formats_spec.rb
106
+ - spec/methods_spec.rb
107
+ - spec/objects_spec.rb
108
+ - spec/spec_helper.rb
data/VERSION DELETED
@@ -1 +0,0 @@
1
- 0.4.0
data/init.rb DELETED
@@ -1 +0,0 @@
1
- require File.join(File.dirname(__FILE__), "lib", "awesome_print")
@@ -1,352 +0,0 @@
1
- # Copyright (c) 2010-2011 Michael Dvorkin
2
- #
3
- # Awesome Print is freely distributable under the terms of MIT license.
4
- # See LICENSE file or http://www.opensource.org/licenses/mit-license.php
5
- #------------------------------------------------------------------------------
6
- require "cgi"
7
- require "shellwords"
8
-
9
- class AwesomePrint
10
- AP = :__awesome_print__ unless defined?(AwesomePrint::AP)
11
- CORE = [ :array, :hash, :class, :file, :dir, :bigdecimal, :rational, :struct, :method, :unboundmethod ] unless defined?(AwesomePrint::CORE)
12
- @@force_colors = false
13
-
14
- def initialize(options = {})
15
- @options = {
16
- :multiline => true, # Display in multiple lines.
17
- :plain => false, # Use colors.
18
- :indent => 4, # Indent using 4 spaces.
19
- :index => true, # Display array indices.
20
- :html => false, # Use ANSI color codes rather than HTML.
21
- :sorted_hash_keys => false, # Do not sort hash keys.
22
- :color => {
23
- :array => :white,
24
- :bigdecimal => :blue,
25
- :class => :yellow,
26
- :date => :greenish,
27
- :falseclass => :red,
28
- :fixnum => :blue,
29
- :float => :blue,
30
- :hash => :pale,
31
- :struct => :pale,
32
- :nilclass => :red,
33
- :string => :yellowish,
34
- :symbol => :cyanish,
35
- :time => :greenish,
36
- :trueclass => :green,
37
- :method => :purpleish,
38
- :args => :pale
39
- }
40
- }
41
-
42
- # Merge custom defaults and let explicit options parameter override them.
43
- merge_custom_defaults!
44
- merge_options!(options)
45
-
46
- @indentation = @options[:indent].abs
47
- Thread.current[AP] ||= []
48
- end
49
-
50
-
51
- private
52
-
53
- # Format an array.
54
- #------------------------------------------------------------------------------
55
- def awesome_array(a)
56
- return "[]" if a == []
57
-
58
- if a.instance_variable_defined?('@__awesome_methods__')
59
- methods_array(a)
60
- elsif @options[:multiline]
61
- width = (a.size - 1).to_s.size
62
- data = a.inject([]) do |arr, item|
63
- index = if @options[:index]
64
- colorize("#{indent}[#{arr.size.to_s.rjust(width)}] ", :array)
65
- else
66
- colorize(indent, :array)
67
- end
68
- indented do
69
- arr << (index << awesome(item))
70
- end
71
- end
72
- "[\n" << data.join(",\n") << "\n#{outdent}]"
73
- else
74
- "[ " << a.map{ |item| awesome(item) }.join(", ") << " ]"
75
- end
76
- end
77
-
78
- # Format a hash. If @options[:indent] if negative left align hash keys.
79
- #------------------------------------------------------------------------------
80
- def awesome_hash(h)
81
- return "{}" if h == {}
82
-
83
- keys = @options[:sorted_hash_keys] ? h.keys.sort { |a, b| a.to_s <=> b.to_s } : h.keys
84
- data = keys.map do |key|
85
- plain_single_line do
86
- [ awesome(key), h[key] ]
87
- end
88
- end
89
-
90
- width = data.map { |key, | key.size }.max || 0
91
- width += @indentation if @options[:indent] > 0
92
-
93
- data = data.map do |key, value|
94
- if @options[:multiline]
95
- formatted_key = (@options[:indent] >= 0 ? key.rjust(width) : indent + key.ljust(width))
96
- else
97
- formatted_key = key
98
- end
99
- indented do
100
- formatted_key << colorize(" => ", :hash) << awesome(value)
101
- end
102
- end
103
- if @options[:multiline]
104
- "{\n" << data.join(",\n") << "\n#{outdent}}"
105
- else
106
- "{ #{data.join(', ')} }"
107
- end
108
- end
109
-
110
- # Format a Struct. If @options[:indent] is negative left align hash keys.
111
- #------------------------------------------------------------------------------
112
- def awesome_struct(s)
113
- h = {}
114
- s.each_pair { |k,v| h[k] = v }
115
- awesome_hash(h)
116
- end
117
-
118
- # Format Class object.
119
- #------------------------------------------------------------------------------
120
- def awesome_class(c)
121
- if superclass = c.superclass # <-- Assign and test if nil.
122
- awesome_self(c, :with => " < #{superclass}")
123
- else
124
- awesome_self(c)
125
- end
126
- end
127
-
128
- # Format File object.
129
- #------------------------------------------------------------------------------
130
- def awesome_file(f)
131
- ls = File.directory?(f) ? `ls -adlF #{f.path.shellescape}` : `ls -alF #{f.path.shellescape}`
132
- awesome_self(f, :with => ls.empty? ? nil : "\n#{ls.chop}")
133
- end
134
-
135
- # Format Dir object.
136
- #------------------------------------------------------------------------------
137
- def awesome_dir(d)
138
- ls = `ls -alF #{d.path.shellescape}`
139
- awesome_self(d, :with => ls.empty? ? nil : "\n#{ls.chop}")
140
- end
141
-
142
- # Format BigDecimal and Rational objects by convering them to Float.
143
- #------------------------------------------------------------------------------
144
- def awesome_bigdecimal(n)
145
- awesome_self(n.to_f, :as => :bigdecimal)
146
- end
147
- alias :awesome_rational :awesome_bigdecimal
148
-
149
- # Format a method.
150
- #------------------------------------------------------------------------------
151
- def awesome_method(m)
152
- name, args, owner = method_tuple(m)
153
- "#{colorize(owner, :class)}##{colorize(name, :method)}#{colorize(args, :args)}"
154
- end
155
- alias :awesome_unboundmethod :awesome_method
156
-
157
- # Catch all method to format an arbitrary object.
158
- #------------------------------------------------------------------------------
159
- def awesome_self(object, appear = {})
160
- colorize(object.inspect.to_s << appear[:with].to_s, appear[:as] || declassify(object))
161
- end
162
-
163
- # Dispatcher that detects data nesting and invokes object-aware formatter.
164
- #------------------------------------------------------------------------------
165
- def awesome(object)
166
- if Thread.current[AP].include?(object.object_id)
167
- nested(object)
168
- else
169
- begin
170
- Thread.current[AP] << object.object_id
171
- send(:"awesome_#{printable(object)}", object)
172
- ensure
173
- Thread.current[AP].pop
174
- end
175
- end
176
- end
177
-
178
- # Format object.methods array.
179
- #------------------------------------------------------------------------------
180
- def methods_array(a)
181
- object = a.instance_variable_get('@__awesome_methods__')
182
- tuples = a.map do |name|
183
- tuple = if object.respond_to?(name, true) # Is this a regular method?
184
- the_method = object.method(name) rescue nil # Avoid potential ArgumentError if object#method is overridden.
185
- if the_method && the_method.respond_to?(:arity) # Is this original object#method?
186
- method_tuple(the_method) # Yes, we are good.
187
- end
188
- elsif object.respond_to?(:instance_method) # Is this an unbound method?
189
- method_tuple(object.instance_method(name))
190
- end
191
- tuple || [ name.to_s, '(?)', '' ] # Return WTF default if all the above fails.
192
- end
193
-
194
- width = (tuples.size - 1).to_s.size
195
- name_width = tuples.map { |item| item[0].size }.max || 0
196
- args_width = tuples.map { |item| item[1].size }.max || 0
197
-
198
- data = tuples.inject([]) do |arr, item|
199
- index = if @options[:index]
200
- "#{indent}[#{arr.size.to_s.rjust(width)}]"
201
- else
202
- indent
203
- end
204
- indented do
205
- arr << "#{index} #{colorize(item[0].rjust(name_width), :method)}#{colorize(item[1].ljust(args_width), :args)} #{colorize(item[2], :class)}"
206
- end
207
- end
208
-
209
- "[\n" << data.join("\n") << "\n#{outdent}]"
210
- end
211
-
212
- # Format nested data, for example:
213
- # arr = [1, 2]; arr << arr
214
- # => [1,2, [...]]
215
- # hsh = { :a => 1 }; hsh[:b] = hsh
216
- # => { :a => 1, :b => {...} }
217
- #------------------------------------------------------------------------------
218
- def nested(object)
219
- case printable(object)
220
- when :array then colorize("[...]", :array)
221
- when :hash then colorize("{...}", :hash)
222
- when :struct then colorize("{...}", :struct)
223
- else colorize("...#{object.class}...", :class)
224
- end
225
- end
226
-
227
- # Return one of the "core" types that have a formatter of :self otherwise.
228
- #------------------------------------------------------------------------------
229
- def printable(object)
230
- CORE.grep(declassify(object))[0] || :self
231
- end
232
-
233
- # Turn class name into symbol, ex: Hello::World => :hello_world. Classes that
234
- # inherit from Array, Hash, File, Dir, and Struct are treated as the base class.
235
- #------------------------------------------------------------------------------
236
- def declassify(object)
237
- case object
238
- when Array then :array
239
- when Hash then :hash
240
- when File then :file
241
- when Dir then :dir
242
- when Struct then :struct
243
- else object.class.to_s.gsub(/:+/, "_").downcase.to_sym
244
- end
245
- end
246
-
247
- # Pick the color and apply it to the given string as necessary.
248
- #------------------------------------------------------------------------------
249
- def colorize(s, type)
250
- s = CGI.escapeHTML(s) if @options[:html]
251
- if @options[:plain] || !@options[:color][type] || !colorize?
252
- @options[:html] ? "<pre>#{s}</pre>" : s
253
- else
254
- s.send(@options[:color][type], @options[:html])
255
- end
256
- end
257
-
258
- # Return [ name, arguments, owner ] tuple for a given method.
259
- #------------------------------------------------------------------------------
260
- def method_tuple(method)
261
- if method.respond_to?(:parameters) # Ruby 1.9.2+
262
- # See http://ruby.runpaint.org/methods#method-objects-parameters
263
- args = method.parameters.inject([]) do |arr, (type, name)|
264
- name ||= (type == :block ? 'block' : "arg#{arr.size + 1}")
265
- arr << case type
266
- when :req then name.to_s
267
- when :opt, :rest then "*#{name}"
268
- when :block then "&#{name}"
269
- else '?'
270
- end
271
- end
272
- else # See http://ruby-doc.org/core/classes/Method.html#M001902
273
- args = (1..method.arity.abs).map { |i| "arg#{i}" }
274
- args[-1] = "*#{args[-1]}" if method.arity < 0
275
- end
276
-
277
- if method.to_s =~ /(Unbound)*Method: (.*?)[#\.]/
278
- owner = "#{$2}#{$1 ? '(unbound)' : ''}".gsub('(', ' (')
279
- end
280
-
281
- [ method.name.to_s, "(#{args.join(', ')})", owner.to_s ]
282
- end
283
-
284
- # Format hash keys as plain string regardless of underlying data type.
285
- #------------------------------------------------------------------------------
286
- def plain_single_line
287
- plain, multiline = @options[:plain], @options[:multiline]
288
- @options[:plain], @options[:multiline] = true, false
289
- yield
290
- ensure
291
- @options[:plain], @options[:multiline] = plain, multiline
292
- end
293
-
294
- #------------------------------------------------------------------------------
295
- def indented
296
- @indentation += @options[:indent].abs
297
- yield
298
- ensure
299
- @indentation -= @options[:indent].abs
300
- end
301
-
302
- def indent
303
- @indent = ' ' * @indentation
304
- end
305
-
306
- def outdent
307
- @outdent = ' ' * (@indentation - @options[:indent].abs)
308
- end
309
-
310
- # Update @options by first merging the :color hash and then the remaining keys.
311
- #------------------------------------------------------------------------------
312
- def merge_options!(options = {})
313
- @options[:color].merge!(options.delete(:color) || {})
314
- @options.merge!(options)
315
- end
316
-
317
- # Load ~/.aprc file with custom defaults that override default options.
318
- #------------------------------------------------------------------------------
319
- def merge_custom_defaults!
320
- dotfile = File.join(ENV["HOME"], ".aprc")
321
- if File.readable?(dotfile)
322
- load dotfile
323
- merge_options!(self.class.defaults)
324
- end
325
- rescue => e
326
- $stderr.puts "Could not load #{dotfile}: #{e}"
327
- end
328
-
329
- # Return true if we are to colorize the output.
330
- #------------------------------------------------------------------------------
331
- def colorize?
332
- @@force_colors || (STDOUT.tty? && ((ENV['TERM'] && ENV['TERM'] != 'dumb') || ENV['ANSICON']))
333
- end
334
-
335
- # Class accessor to force colorized output (ex. forked subprocess where TERM
336
- # might be dumb).
337
- #------------------------------------------------------------------------------
338
- def self.force_colors!(value = true)
339
- @@force_colors = value
340
- end
341
-
342
- # Class accessors for custom defaults.
343
- #------------------------------------------------------------------------------
344
- def self.defaults
345
- @@defaults ||= {}
346
- end
347
-
348
- def self.defaults=(args = {})
349
- @@defaults = args
350
- end
351
-
352
- end