wirble 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (8) hide show
  1. data.tar.gz.sig +0 -0
  2. data/COPYING +20 -0
  3. data/ChangeLog +29 -0
  4. data/README +433 -0
  5. data/wirble.gemspec +54 -0
  6. data/wirble.rb +519 -0
  7. metadata +143 -0
  8. metadata.gz.sig +0 -0
data.tar.gz.sig ADDED
Binary file
data/COPYING ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (C) 2002-2006 Paul Duncan
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to
5
+ deal in the Software without restriction, including without limitation the
6
+ rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
7
+ sell copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies of the Software, its documentation and marketing & publicity
12
+ materials, and acknowledgment shall be given in the documentation, materials
13
+ and software packages that this Software was used.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18
+ THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/ChangeLog ADDED
@@ -0,0 +1,29 @@
1
+
2
+ * Wed Sep 06 00:01:21 2006, pabs <pabs@pablotron.org>
3
+ * initial import
4
+
5
+ * Wed Sep 06 00:10:13 2006, pabs <pabs@pablotron.org>
6
+ * wirble.rb: remove symbol hackery to prevent
7
+ ri/rdoc from barfing
8
+
9
+ * Wed Sep 6 02:49:02 EDT 2006, Paul Duncan <pabs@pablotron.org>
10
+ * wirble.rb: fix typo
11
+ * re-release 0.1.0
12
+
13
+ * Fri Sep 8 04:01:40 EDT 2006, Paul Duncan <pabs@pablotron.org>
14
+ * README: updated version to 0.1.1
15
+ * wirble.gemspec: ditto
16
+ * wirble.rb: ditto
17
+ * wirble.rb: wrap colorize in an exception (just in case)
18
+
19
+ * Fri Sep 08 13:11:05 2006, pabs <pabs@pablotron.org>
20
+ * increment version to 0.1.2
21
+ * wirble.gemspec: remove rubilicious dependency
22
+
23
+ * Fri Sep 8 13:17:29 EDT 2006, Paul Duncan <pabs@pablotron.org>
24
+ * README: increment version to 0.1.2
25
+ * wirble.gemspec: ditto
26
+ * wirble.rb: ditto
27
+
28
+ * Fri Sep 08 13:18:15 2006, pabs <pabs@pablotron.org>
29
+ * releasing 0.1.2
data/README ADDED
@@ -0,0 +1,433 @@
1
+ Wirble 0.1.2 README
2
+ ===================
3
+
4
+ This document was last updated on Fri Sep 08 13:16:55 2006. See the
5
+ file COPYING for licensing and warranty information. The latest version
6
+ of this software is available at the following URL:
7
+
8
+ http://pablotron.org/software/wirble/
9
+
10
+ Table of Contents
11
+ =================
12
+ * Introduction to Wirble
13
+ * Installing Wirble
14
+ o Via RubyGems
15
+ o Via a Tarball
16
+ o As a User
17
+ * Using Wirble
18
+ o Editing Your ~/.irbrc
19
+ o Enabling Color
20
+ * Configuring Wirble
21
+ * Color Settings
22
+ o Color Keys
23
+ o Color Values
24
+ o Default Color Map
25
+ * Frequently Asked Questions (FAQ)
26
+ * Reporting Bugs
27
+ * About the Author
28
+
29
+
30
+ Introduction to Wirble
31
+ ======================
32
+ Wirble is a set of enhancements to Irb all included together in one
33
+ easy-to-use package. Specifically, Wirble adds a saved history, a
34
+ couple of useful shortcuts, and color to Irb. Wirble also enables a
35
+ Irb's built-in tab-completion and a simpler prompt.
36
+
37
+ Before we begin, I should mention that several of Wirble's features were
38
+ shamelessly inspired (read: borrowed with extreme prejudice) from the
39
+ "Irb Tips and Tricks" page of the Ruby Garden Wiki, which you can find
40
+ at the following URL:
41
+
42
+ http://wiki.rubygarden.org/Ruby/page/show/Irb/TipsAndTricks
43
+
44
+ In particular, the Irb history and ri features bear a striking
45
+ resemblence to their Ruby Garden counterparts.
46
+
47
+
48
+ Installing Wirble
49
+ =================
50
+ The easiest way to install Wirble is via RubyGems
51
+ (http://rubygems.org/). If you've already got RubyGems installed,
52
+ simply do the following, then skip to the "Using Wirble" section below:
53
+
54
+ # install wirble via RubyGems
55
+ sudo gem install wirble
56
+
57
+ If you don't have RubyGems, you can also install the Wirble library
58
+ this:
59
+
60
+ # install wirble to library directory
61
+ sudo cp -v wirble.rb $(ruby -e 'puts $LOAD_PATH[0]')
62
+
63
+ Or, if you don't use sudo, you can do the same thing with su, like so:
64
+
65
+ # install wirble to library directory
66
+ su -c "cp -v wirble.rb $(ruby -e 'puts $LOAD_PATH[0]')"
67
+
68
+ Finally, if you don't have an administrator account, you can still
69
+ install Wirble in your local home directory like so:
70
+
71
+ # create local ruby library directory
72
+ mkdir ~/.ruby && chmod 700 ~/.ruby
73
+ cp -v wirble.rb ~/.ruby
74
+
75
+ Then add the following line at the _top_ of your ~/.irbrc file:
76
+
77
+ # add ~/.ruby to the library search path
78
+ $LOAD_PATH << File.expand_path('~/.ruby')
79
+
80
+
81
+ Using Wirble
82
+ ============
83
+ Using Wirble is easy: just add the following lines to your ~/.irbrc
84
+ file:
85
+
86
+ # load rubygems and wirble
87
+ require 'rubygems' rescue nil
88
+ require 'wirble'
89
+
90
+ # load wirble
91
+ Wirble.init
92
+
93
+ A lot of people really don't like colors, so I've kept the color
94
+ disabled by default. To enable it, add the following bit to your
95
+ ~/.irbrc file after "Wirble.init":
96
+
97
+ # enable color
98
+ Wirble.colorize
99
+
100
+ If you want to terrify your grandmother and impress your buddies, your
101
+ entire ~/.irbrc can also be written like so:
102
+
103
+ %w{rubygems wirble}.each { |lib| require lib rescue nil }
104
+ %w{init colorize}.each { |str| Wirble.send(str.intern) }
105
+
106
+ Configuring Wirble
107
+ ==================
108
+ You can pass a hash of options to Wirble.init in order to adjust the
109
+ behavior of Wirble. Here's a full list of options and a brief
110
+ description of each one:
111
+
112
+ * :skip_internals
113
+
114
+ Don't load the internal Irb features. Equivalent to setting both
115
+ :skip_libraries and :skip_prompt (see below).
116
+
117
+ * :skip_libraries
118
+
119
+ Don't load any libraries. At the moment, Wirble attempts to load
120
+ the following libraries: "pp", "irb/completion", and "rubygems".
121
+
122
+ * :skip_prompt
123
+
124
+ Down't load the simple prompt. Shouldn't ever be necessary, but
125
+ I've included it for the sake of completeness. Wirble's default
126
+ behavior is to the prompt setting before making any changes. If the
127
+ prompt is anything other than :DEFAULT, Wirble won't override it.
128
+
129
+ * :skip_history
130
+
131
+ Don't load the Irb history. There are a few additional history
132
+ options as well; see :history_path, :history_size, and
133
+ :history_perms below.
134
+
135
+ * :history_path
136
+
137
+ Set the path to the Irb history file. Defaults to "~/.irb_history".
138
+ If an environment variable named IRB_HISTORY_FILE is set, Wirble
139
+ will use that instead of the default value.
140
+
141
+ * :history_size
142
+
143
+ Set the size (in lines) of the Irb history file. Defaults to 1000
144
+ lines. If an environment variable named IRB_HISTORY_SIZE is set,
145
+ Wirble will use that instead of the default value.
146
+
147
+ * :history_perms
148
+
149
+ Set the permissions of the Irb history file. Defaults to
150
+ File::WRONLY.
151
+
152
+ * :skip_shortcuts
153
+
154
+ Don't load any shortcut methods. at the moment there are three
155
+ shortcut methods: "ri", "po", and "poc". The first calls the "ri"
156
+ command on the specified value -- you"ll need to use proper quoting
157
+ to pass the name properly. As for "po" and "poc": the former lists
158
+ an object's instance methods (excluding methods that belong to
159
+ Object), sorted by name, and the latter lists an object's constants,
160
+ sorted by name.
161
+
162
+ * :init_colors
163
+
164
+ Enable colors. Equivalent to calling Wirble.colorize directly.
165
+
166
+ * :colors
167
+
168
+ A hash of colors. Only makes sense in conjunction with the
169
+ :init_colors option. See below for additional information on
170
+ customizing color settings.
171
+
172
+ Here's an example of passing a list of options to Wirble.init():
173
+
174
+ wirble_opts = {
175
+ # skip shortcuts
176
+ :skip_shortcuts => true,
177
+
178
+ # don't set the prompt
179
+ :skip_prompt => true,
180
+
181
+ # override some of the default colors
182
+ :colors => {
183
+ :open_hash => :green.
184
+ :close_hash => :green.
185
+ :string => :blue,
186
+ },
187
+
188
+ # enable color
189
+ :init_color => true,
190
+ }
191
+
192
+ # initialize wirble with options above
193
+ Wirble.init(wirble_opts)
194
+
195
+ For a full description of the color options, see the next section.
196
+
197
+
198
+ Color Settings
199
+ ==============
200
+ You can set colors in Wirble by passing a hash of color options via
201
+ Wirble.init (see the :color option for Wirble.init above), or by setting
202
+ Wirble::Colorize.color directly. For example:
203
+
204
+ # get the default colors and add in your own
205
+ colors = Wirble::Colorize.colors.merge({
206
+ # set the comma color to blue
207
+ :comma => :blue,
208
+ })
209
+
210
+ # set the colors used by Wirble
211
+ Wirble::Colorize.colors = colors
212
+
213
+ Below is a list of all the recognized color keys.
214
+
215
+ * :comma (',')
216
+
217
+ A comma character. The element delimiter in arrays and hashes.
218
+
219
+ * :refers ('=>')
220
+
221
+ The hash reference operator. The key/value delimiter in hashes.
222
+
223
+ * :open_hash ('{')
224
+
225
+ The opening curly brace for a hash.
226
+
227
+ * :close_hash ('}')
228
+
229
+ The opening curly brace for a hash.
230
+
231
+ * :open_array ('[')
232
+
233
+ The opening brace for a array.
234
+
235
+ * :close_array (']')
236
+
237
+ The opening brace for a array.
238
+
239
+ * :open_object ('#<')
240
+
241
+ The opening delimiter for an object.
242
+
243
+ * :close_object ('>')
244
+
245
+ The closing delimiter for an object inspection.
246
+
247
+ * :object_class
248
+
249
+ The class attribute of an object inspection. For example, in the
250
+ string "#<Proc:0xb7be4968@(irb):8>", the string "Proc" is the class
251
+ attribute.
252
+
253
+ * :object_addr_prefix (':')
254
+
255
+ The colon prefixing the address attribute of an object inspection.
256
+ For example, in the string "#<Proc:0xb7be4968@(irb):8>", the string
257
+ "0xb7be4968" is the memory address attribute, so the ':' is the
258
+ address prefix.
259
+
260
+ * :object_addr
261
+
262
+ The memory address attribute of an object inspection. For example,
263
+ in the string "#<Proc:0xb7be4968@(irb):8>", the string "0xb7be4968"
264
+ is the memory address attribute.
265
+
266
+ * :object_addr_prefix ('@')
267
+
268
+ The at symbol prefixing the line attribute of an object inspection.
269
+ For example, in the string "#<Proc:0xb7be4968@(irb):8>", the string
270
+ "(irb):8" is the line attribute, so the '@' is the line attribute
271
+ prefix.
272
+
273
+ * :object_line
274
+
275
+ The line number attribute of an object inspection. For example,
276
+ in the string "#<Proc:0xb7be4968@(irb):8>", the string "(irb):8"
277
+ is the line number attribute.
278
+
279
+ * :symbol_prefix (':')
280
+
281
+ The colon prefix for a symbol object.
282
+
283
+ * :symbol
284
+
285
+ The string of a symbol object.
286
+
287
+ * :open_string ('"')
288
+
289
+ The opening quote of a string object.
290
+
291
+ * :close_string ('"')
292
+
293
+ The closing quote of a string object.
294
+
295
+ * :number
296
+
297
+ A number (integer or float).
298
+
299
+ * :range ('..')
300
+
301
+ The delimeter of a range object.
302
+
303
+ * :keyword
304
+
305
+ A built-in Ruby keyword. This includes values like "true", "false",
306
+ and "nil".
307
+
308
+ * :class
309
+
310
+ A class. This includes strings like "Class" and "Object".
311
+
312
+ * :whitespace
313
+
314
+ Whitespace character (i.e. space, newline, tab, etc).
315
+
316
+ The highlighting is implemented with a simple hand-rolled state-based
317
+ tokenizer (wow, that was a mouthful). This should be adequate most of
318
+ the time, but since it's not a actual LALR parser, Wirble can get
319
+ confused in a few specific instances. If you find a serious
320
+ highlighting problem, please let me know. Oh yeah, before I forget,
321
+ here's a list of the valid color codes:
322
+
323
+ :nothing :green :light_purple
324
+ :black :light_blue :purple
325
+ :blue :light_cyan :red
326
+ :brown :light_gray :white
327
+ :cyan :light_green :yellow
328
+ :dark_gray :light_red
329
+
330
+ Note that I'm not a designer, and I also use a terminal with a dark
331
+ background. I've also been accused of having a Vim color scheme that
332
+ looks like "a beat up clown". With those caveats in mind, here's the
333
+ default color scheme for Wirble:
334
+
335
+ #
336
+ # Default Wirble color scheme.
337
+ #
338
+ DEFAULT_COLORS = {
339
+ # delimiter colors
340
+ :comma => :blue,
341
+ :refers => :blue,
342
+
343
+ # container colors (hash and array)
344
+ :open_hash => :green,
345
+ :close_hash => :green,
346
+ :open_array => :green,
347
+ :close_array => :green,
348
+
349
+ # object colors
350
+ :open_object => :light_red,
351
+ :object_class => :white,
352
+ :object_addr_prefix => :blue,
353
+ :object_line_prefix => :blue,
354
+ :close_object => :light_red,
355
+
356
+ # symbol colors
357
+ :symbol => :yellow,
358
+ :symbol_prefix => :yellow,
359
+
360
+ # string colors
361
+ :open_string => :red,
362
+ :string => :cyan,
363
+ :close_string => :red,
364
+
365
+ # misc colors
366
+ :number => :cyan,
367
+ :keyword => :green,
368
+ :class => :light_green,
369
+ :range => :red,
370
+ }
371
+
372
+ This map is also available via programmatically via
373
+ Wirble::Colorize::DEFAULT_COLORS.
374
+
375
+
376
+ Frequently Asked Questions (FAQ)
377
+ ================================
378
+ Q. Where did the name come from?
379
+ A. Beats me. It's the only thing I could find in the dictionary, and
380
+ the only name I came up with that I could pronounce.
381
+
382
+ Q. How do I use color in my Irb prompts?
383
+ A. You can use standard color escape codes in the format string used by
384
+ Irb. For example, to set the user prompt to cyan, you could do
385
+ something like this:
386
+
387
+ ctx = IRB.CurrentContext
388
+ ctx.prompt_i = Wirble::Colorize.colorize_string(ctx.prompt_i, :cyan)
389
+
390
+ Q. How can I do syntax highlighting as I type?
391
+ A. I don't know. If there is an answer, I suspect it's not very
392
+ portable and probably requires some modification to Irb. There's a
393
+ sneaky hack called eval.rb that seems to do a little bit of
394
+ highlight, but it doesn't use Irb, and it doesn't really do what
395
+ you're asking. That said, you can find it here:
396
+
397
+ http://www.rubyist.net/~slagell/ruby/eval.txt
398
+
399
+ Incidentally, part of the problem is that there's no real easy way
400
+ to do the following:
401
+
402
+ 1. Access to the token stream or parser state incrementally.
403
+ 2. Process partial strings in readline.
404
+
405
+ A bit more about #1: both Irb and the internal Ruby lexer kind of
406
+ muddle the traditionally separate concepts of lexer and parser, so
407
+ it's difficult to, say, parse a string into components and do syntax
408
+ highlighting on them. Vim and Emacs both handle this with sneaky
409
+ regular expressions, and a simple Ruby parser, respectively. Wirble
410
+ and Irb both roll their own (albeit limited) Ruby lexers.
411
+
412
+
413
+ Reporting Bugs
414
+ ==============
415
+ Have a bug to report or a feature you'd like me to add to Wirble?
416
+ Feel free to email me at the address below. Alternatively, you can
417
+ submit your feature request or bug directly to my bug-tracking web
418
+ interface at the following URL:
419
+
420
+ http://bugs.pablotron.org/
421
+
422
+ Note: you'll need to create an account in order to submit a feature
423
+ request or a bug report via the web interface. Also, I'm a busy guy! I
424
+ make every effort to respond quickly to bug reports, but detailed
425
+ descriptions and or patches really do make my life a whole lot easier.
426
+
427
+
428
+ About the Author
429
+ ================
430
+ Paul Duncan <pabs@pablotron.org>
431
+ http://pablotron.org/
432
+
433
+ And of course, all the fine folks from the Ruby Garden Wiki. :)
data/wirble.gemspec ADDED
@@ -0,0 +1,54 @@
1
+ require 'rubygems'
2
+
3
+ spec = Gem::Specification.new do |s|
4
+
5
+ #### Basic information.
6
+
7
+ s.name = 'wirble'
8
+ s.version = '0.1.2'
9
+ s.summary = <<-EOF
10
+ Handful of common Irb features, made easy.
11
+ EOF
12
+ s.description = <<-EOF
13
+ A handful of useful Irb features, including colorized results,
14
+ tab-completion, history, a simple prompt, and several helper
15
+ methods, all rolled into one easy to use package.
16
+ EOF
17
+
18
+ s.requirements << 'Ruby, version 1.8.0 (or newer)'
19
+
20
+ #### Which files are to be included in this gem? Everything! (Except CVS directories.)
21
+
22
+ s.files = Dir.glob("**/*").delete_if { |item| item.include?("CVS") }
23
+
24
+ #### C code extensions.
25
+
26
+ s.require_path = '.' # is this correct?
27
+ # s.extensions << "extconf.rb"
28
+
29
+ #### Load-time details: library and application (you will need one or both).
30
+ s.autorequire = 'wirble'
31
+ s.has_rdoc = true
32
+ s.rdoc_options = ['--webcvs',
33
+ 'http://cvs.pablotron.org/cgi-bin/viewcvs.cgi/wirble/', '--title',
34
+ 'Wirble API Documentation', 'wirble.rb', 'README', 'ChangeLog',
35
+ 'COPYING']
36
+
37
+ #### Author and project details.
38
+
39
+ s.author = 'Paul Duncan'
40
+ s.email = 'pabs@pablotron.org'
41
+ s.homepage = 'http://pablotron.org/software/wirble/'
42
+ s.rubyforge_project = 'wirble'
43
+
44
+
45
+
46
+ # Add this shit to teh bottom of gem files for signing:
47
+ # TODO: move ~/.rubygems to ~/.gem/sign or something
48
+
49
+ s.cert_chain = %w{ca rubygems}.map { |f|
50
+ File.expand_path("~/.rubygems/#{f}.crt")
51
+ }
52
+ s.signing_key = File.expand_path('~/.rubygems/rubygems.key')
53
+
54
+ end
data/wirble.rb ADDED
@@ -0,0 +1,519 @@
1
+ require 'ostruct'
2
+
3
+ #
4
+ # Wirble: A collection of useful Irb features.
5
+ #
6
+ # To use, add the following to your ~/.irbrc:
7
+ #
8
+ # require 'rubygems'
9
+ # require 'wirble'
10
+ # Wirble.init
11
+ #
12
+ # If you want color in Irb, add this to your ~/.irbrc as well:
13
+ #
14
+ # Wirble.colorize
15
+ #
16
+ # Note: I spent a fair amount of time documenting this code in the
17
+ # README. If you've installed via RubyGems, root around your cache a
18
+ # little bit (or fire up gem_server) and read it before you tear your
19
+ # hair out sifting through the code below.
20
+ #
21
+ module Wirble
22
+ VERSION = '0.1.2'
23
+
24
+ #
25
+ # Load internal Ruby features, including tab-completion, rubygems,
26
+ # and a simple prompt.
27
+ #
28
+ module Internals
29
+ # list of internal libraries to automatically load
30
+ LIBRARIES = %w{pp irb/completion rubygems}
31
+
32
+ #
33
+ # load tab completion and rubygems
34
+ #
35
+ def self.init_libraries
36
+ LIBRARIES.each { |lib| require lib rescue nil }
37
+ end
38
+
39
+ #
40
+ # Set a simple prompt, unless a custom one has been specified.
41
+ #
42
+ def self.init_prompt
43
+ # set the prompt
44
+ if IRB.conf[:PROMPT_MODE] == :DEFAULT
45
+ IRB.conf[:PROMPT_MODE] = :SIMPLE
46
+ end
47
+ end
48
+
49
+ #
50
+ # Load all Ruby internal features.
51
+ #
52
+ def self.init(opt = nil)
53
+ init_libraries unless opt && opt[:skip_libraries]
54
+ init_prompt unless opt && opt[:skip_prompt]
55
+ end
56
+ end
57
+
58
+ #
59
+ # Basic IRB history support. This is based on the tips from
60
+ # http://wiki.rubygarden.org/Ruby/page/show/Irb/TipsAndTricks
61
+ #
62
+ class History
63
+ DEFAULTS = {
64
+ :history_path => ENV['IRB_HISTORY_FILE'] || "~/.irb_history",
65
+ :history_size => (ENV['IRB_HISTORY_SIZE'] || 1000).to_i,
66
+ :history_perms => File::WRONLY | File::CREAT | File::TRUNC,
67
+ }
68
+
69
+ private
70
+
71
+ def say(*args)
72
+ puts *args if @verbose
73
+ end
74
+
75
+ def cfg(key)
76
+ @opt["history_#{key}".intern]
77
+ end
78
+
79
+ def save_history
80
+ path, max_size, perms = %w{path size perms}.map { |v| cfg(v) }
81
+
82
+ # read lines from history, and truncate the list (if necessary)
83
+ lines = Readline::HISTORY.to_a.uniq
84
+ lines = lines[-max_size, -1] if lines.size > max_size
85
+
86
+ # write the history file
87
+ real_path = File.expand_path(path)
88
+ File.open(real_path, perms) { |fh| fh.puts lines }
89
+ say 'Saved %d lines to history file %s.' % [lines.size, path]
90
+ end
91
+
92
+ def load_history
93
+ # expand history file and make sure it exists
94
+ real_path = File.expand_path(cfg('path'))
95
+ unless File.exist?(real_path)
96
+ say "History file #{real_path} doesn't exist."
97
+ return
98
+ end
99
+
100
+ # read lines from file and add them to history
101
+ lines = File.readlines(real_path).map { |line| line.chomp }
102
+ Readline::HISTORY.push(*lines)
103
+
104
+ say 'Read %d lines from history file %s' % [lines.size, cfg('path')]
105
+ end
106
+
107
+ public
108
+
109
+ def initialize(opt = nil)
110
+ @opt = DEFAULTS.merge(opt || {})
111
+ return unless defined? Readline::HISTORY
112
+ load_history
113
+ Kernel.at_exit { save_history }
114
+ end
115
+ end
116
+
117
+ #
118
+ # Add color support to IRB.
119
+ #
120
+ module Colorize
121
+ #
122
+ # Tokenize an inspection string.
123
+ #
124
+ module Tokenizer
125
+ def self.tokenize(str)
126
+ raise 'missing block' unless block_given?
127
+ chars = str.split(//)
128
+
129
+ # $stderr.puts "DEBUG: chars = #{chars.join(',')}"
130
+
131
+ state, val, i, lc = [], '', 0, nil
132
+ while i <= chars.size
133
+ repeat = false
134
+ c = chars[i]
135
+
136
+ # $stderr.puts "DEBUG: state = #{state}"
137
+
138
+ case state[-1]
139
+ when nil
140
+ case c
141
+ when ':': state << :symbol
142
+ when '"': state << :string
143
+ when '#': state << :object
144
+ when /[a-z]/i
145
+ state << :keyword
146
+ repeat = true
147
+ when /[0-9-]/
148
+ state << :number
149
+ repeat = true
150
+ when '{': yield :open_hash, '{'
151
+ when '[': yield :open_array, '['
152
+ when ']': yield :close_array, ']'
153
+ when '}': yield :close_hash, '}'
154
+ when /\s/: yield :whitespace, c
155
+ when ',': yield :comma, ','
156
+ when '>'
157
+ yield :refers, '=>' if lc == '='
158
+ when '.'
159
+ yield :range, '..' if lc == '.'
160
+ when '='
161
+ # ignore these, they're used elsewhere
162
+ nil
163
+ else
164
+ # $stderr.puts "DEBUG: ignoring char #{c}"
165
+ end
166
+ when :symbol
167
+ case c
168
+ # XXX: should have =, but that messes up foo=>bar
169
+ when /[a-z0-9_!?]/
170
+ val << c
171
+ else
172
+ yield :symbol_prefix, ':'
173
+ yield state[-1], val
174
+ state.pop; val = ''
175
+ repeat = true
176
+ end
177
+ when :string
178
+ case c
179
+ when '"'
180
+ if lc == "\\"
181
+ val[-1] = ?"
182
+ else
183
+ yield :open_string, '"'
184
+ yield state[-1], val
185
+ state.pop; val = ''
186
+ yield :close_string, '"'
187
+ end
188
+ else
189
+ val << c
190
+ end
191
+ when :keyword
192
+ case c
193
+ when /[a-z0-9_]/i
194
+ val << c
195
+ else
196
+ # is this a class?
197
+ st = val =~ /^[A-Z]/ ? :class : state[-1]
198
+
199
+ yield st, val
200
+ state.pop; val = ''
201
+ repeat = true
202
+ end
203
+ when :number
204
+ case c
205
+ when /[0-9e-]/
206
+ val << c
207
+ when '.'
208
+ if lc == '.'
209
+ val[/\.$/] = ''
210
+ yield state[-1], val
211
+ state.pop; val = ''
212
+ yield :range, '..'
213
+ else
214
+ val << c
215
+ end
216
+ else
217
+ yield state[-1], val
218
+ state.pop; val = ''
219
+ repeat = true
220
+ end
221
+ when :object
222
+ case c
223
+ when '<':
224
+ yield :open_object, '#<'
225
+ state << :object_class
226
+ when ':':
227
+ state << :object_addr
228
+ when '@':
229
+ state << :object_line
230
+ when '>'
231
+ yield :close_object, '>'
232
+ state.pop; val = ''
233
+ end
234
+ when :object_class
235
+ case c
236
+ when ':'
237
+ yield state[-1], val
238
+ state.pop; val = ''
239
+ repeat = true
240
+ else
241
+ val << c
242
+ end
243
+ when :object_addr
244
+ case c
245
+ when '>'
246
+ when '@'
247
+ yield :object_addr_prefix, ':'
248
+ yield state[-1], val
249
+ state.pop; val = ''
250
+ repeat = true
251
+ else
252
+ val << c
253
+ end
254
+ when :object_line
255
+ case c
256
+ when '>'
257
+ yield :object_line_prefix, '@'
258
+ yield state[-1], val
259
+ state.pop; val = ''
260
+ repeat = true
261
+ else
262
+ val << c
263
+ end
264
+ else
265
+ raise "unknown state #{state}"
266
+ end
267
+
268
+ unless repeat
269
+ i += 1
270
+ lc = c
271
+ end
272
+ end
273
+ end
274
+ end
275
+
276
+ #
277
+ # Terminal escape codes for colors.
278
+ #
279
+ module Color
280
+ COLORS = {
281
+ :nothing => '0;0',
282
+ :black => '0;30',
283
+ :red => '0;31',
284
+ :green => '0;32',
285
+ :brown => '0;33',
286
+ :blue => '0;34',
287
+ :cyan => '0;36',
288
+ :purple => '0;35',
289
+ :light_gray => '0;37',
290
+ :dark_gray => '1;30',
291
+ :light_red => '1;31',
292
+ :light_green => '1;32',
293
+ :yellow => '1;33',
294
+ :light_blue => '1;34',
295
+ :light_cyan => '1;36',
296
+ :light_purple => '1;35',
297
+ :white => '1;37',
298
+ }
299
+
300
+ #
301
+ # Return the escape code for a given color.
302
+ #
303
+ def self.escape(key)
304
+ COLORS.key?(key) && "\033[#{COLORS[key]}m"
305
+ end
306
+ end
307
+
308
+ #
309
+ # Default Wirble color scheme.
310
+ #
311
+ DEFAULT_COLORS = {
312
+ # delimiter colors
313
+ :comma => :blue,
314
+ :refers => :blue,
315
+
316
+ # container colors (hash and array)
317
+ :open_hash => :green,
318
+ :close_hash => :green,
319
+ :open_array => :green,
320
+ :close_array => :green,
321
+
322
+ # object colors
323
+ :open_object => :light_red,
324
+ :object_class => :white,
325
+ :object_addr_prefix => :blue,
326
+ :object_line_prefix => :blue,
327
+ :close_object => :light_red,
328
+
329
+ # symbol colors
330
+ :symbol => :yellow,
331
+ :symbol_prefix => :yellow,
332
+
333
+ # string colors
334
+ :open_string => :red,
335
+ :string => :cyan,
336
+ :close_string => :red,
337
+
338
+ # misc colors
339
+ :number => :cyan,
340
+ :keyword => :green,
341
+ :class => :light_green,
342
+ :range => :red,
343
+ }
344
+
345
+ #
346
+ # Fruity testing colors.
347
+ #
348
+ TESTING_COLORS = {
349
+ :comma => :red,
350
+ :refers => :red,
351
+ :open_hash => :blue,
352
+ :close_hash => :blue,
353
+ :open_array => :green,
354
+ :close_array => :green,
355
+ :open_object => :light_red,
356
+ :object_class => :light_green,
357
+ :object_addr => :purple,
358
+ :object_line => :light_purple,
359
+ :close_object => :light_red,
360
+ :symbol => :yellow,
361
+ :symbol_prefix => :yellow,
362
+ :number => :cyan,
363
+ :string => :cyan,
364
+ :keyword => :white,
365
+ :range => :light_blue,
366
+ }
367
+
368
+ #
369
+ # Set color map to hash
370
+ #
371
+ def self.colors=(hash)
372
+ @colors = hash
373
+ end
374
+
375
+ #
376
+ # Get current color map
377
+ #
378
+ def self.colors
379
+ @colors ||= {}.update(DEFAULT_COLORS)
380
+ end
381
+
382
+ #
383
+ # Return a string with the given color.
384
+ #
385
+ def self.colorize_string(str, color)
386
+ col, nocol = [color, :nothing].map { |key| Color.escape(key) }
387
+ col ? "#{col}#{str}#{nocol}" : str
388
+ end
389
+
390
+ #
391
+ # Colorize the results of inspect
392
+ #
393
+ def self.colorize(str)
394
+ begin
395
+ ret, nocol = '', Color.escape(:nothing)
396
+ Tokenizer.tokenize(str) do |tok, val|
397
+ # c = Color.escape(colors[tok])
398
+ ret << colorize_string(val, colors[tok])
399
+ end
400
+ ret
401
+ rescue
402
+ # catch any errors from the tokenizer (just in case)
403
+ str
404
+ end
405
+ end
406
+
407
+ #
408
+ # Enable colorized IRB results.
409
+ #
410
+ def self.enable(custom_colors = nil)
411
+ # if there's a better way to do this, I'm all ears.
412
+ ::IRB::Irb.class_eval do
413
+ alias :non_color_output_value :output_value
414
+
415
+ def output_value
416
+ if @context.inspect?
417
+ val = Colorize.colorize(@context.last_value.inspect)
418
+ printf @context.return_format, val
419
+ else
420
+ printf @context.return_format, @context.last_value
421
+ end
422
+ end
423
+ end
424
+
425
+ colors = custom_colors if custom_colors
426
+ end
427
+
428
+ #
429
+ # Disable colorized IRB results.
430
+ #
431
+ def self.disable
432
+ ::IRB::Irb.class_eval do
433
+ alias :output_value :non_color_output_value
434
+ end
435
+ end
436
+ end
437
+
438
+ #
439
+ # Convenient shortcut methods.
440
+ #
441
+ module Shortcuts
442
+ #
443
+ # Print object methods, sorted by name. (excluding methods that
444
+ # exist in the class Object) .
445
+ #
446
+ def po(o)
447
+ o.methods.sort - Object.methods
448
+ end
449
+
450
+ #
451
+ # Print object constants, sorted by name.
452
+ #
453
+ def poc(o)
454
+ o.constants.sort
455
+ end
456
+ end
457
+
458
+ #
459
+ # Convenient shortcut for ri
460
+ #
461
+ module RiShortcut
462
+ def self.init
463
+ Kernel.class_eval {
464
+ def ri(arg)
465
+ puts `ri '#{arg}'`
466
+ end
467
+ }
468
+
469
+ Module.instance_eval {
470
+ def ri(meth=nil)
471
+ if meth
472
+ if instance_methods(false).include? meth.to_s
473
+ puts `ri #{self}##{meth}`
474
+ else
475
+ super
476
+ end
477
+ else
478
+ puts `ri #{self}`
479
+ end
480
+ end
481
+ }
482
+ end
483
+ end
484
+
485
+
486
+
487
+ #
488
+ # Enable color results.
489
+ #
490
+ def self.colorize(custom_colors = nil)
491
+ Colorize.enable(custom_colors)
492
+ end
493
+
494
+ #
495
+ # Load everything except color.
496
+ #
497
+ def self.init(opt = nil)
498
+ # make sure opt isn't nil
499
+ opt ||= {}
500
+
501
+ # load internal irb/ruby features
502
+ Internals.init(opt) unless opt && opt[:skip_internals]
503
+
504
+ # load the history
505
+ History.new(opt) unless opt && opt[:skip_history]
506
+
507
+ # load shortcuts
508
+ unless opt && opt[:skip_shortcuts]
509
+ # load ri shortcuts
510
+ RiShortcut.init
511
+
512
+ # include common shortcuts
513
+ Object.class_eval { include Shortcuts }
514
+ end
515
+
516
+ colorize(opt[:colors]) if opt && opt[:init_colors]
517
+ end
518
+ end
519
+
metadata ADDED
@@ -0,0 +1,143 @@
1
+ --- !ruby/object:Gem::Specification
2
+ rubygems_version: 0.9.0
3
+ specification_version: 1
4
+ name: wirble
5
+ version: !ruby/object:Gem::Version
6
+ version: 0.1.2
7
+ date: 2006-09-08 00:00:00 -04:00
8
+ summary: Handful of common Irb features, made easy.
9
+ require_paths:
10
+ - .
11
+ email: pabs@pablotron.org
12
+ homepage: http://pablotron.org/software/wirble/
13
+ rubyforge_project: wirble
14
+ description: A handful of useful Irb features, including colorized results, tab-completion, history, a simple prompt, and several helper methods, all rolled into one easy to use package.
15
+ autorequire: wirble
16
+ default_executable:
17
+ bindir: bin
18
+ has_rdoc: true
19
+ required_ruby_version: !ruby/object:Gem::Version::Requirement
20
+ requirements:
21
+ - - ">"
22
+ - !ruby/object:Gem::Version
23
+ version: 0.0.0
24
+ version:
25
+ platform: ruby
26
+ signing_key:
27
+ cert_chain:
28
+ - |
29
+ -----BEGIN CERTIFICATE-----
30
+ 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
69
+ -----END CERTIFICATE-----
70
+
71
+ - |
72
+ -----BEGIN CERTIFICATE-----
73
+ MIIHMTCCBRmgAwIBAgIBAzANBgkqhkiG9w0BAQUFADCBkTELMAkGA1UEBhMCVVMx
74
+ ETAPBgNVBAgTCFZpcmdpbmlhMRIwEAYDVQQHEwlBbm5hbmRhbGUxEjAQBgNVBAoT
75
+ CVBhYmxvdHJvbjELMAkGA1UECxMCQ0ExGTAXBgNVBAMTEGNhLnBhYmxvdHJvbi5v
76
+ cmcxHzAdBgkqhkiG9w0BCQEWEGNhQHBhYmxvdHJvbi5vcmcwHhcNMDYwODMxMDU1
77
+ ODM4WhcNMDgwODMwMDU1ODM4WjCBnTELMAkGA1UEBhMCVVMxETAPBgNVBAgTCFZp
78
+ cmdpbmlhMRIwEAYDVQQHEwlBbm5hbmRhbGUxEjAQBgNVBAoTCVBhYmxvdHJvbjEL
79
+ MAkGA1UECxMCQ0ExHzAdBgNVBAMTFlBhdWwgRHVuY2FuIChydWJ5Z2VtcykxJTAj
80
+ BgkqhkiG9w0BCQEWFnJ1YnlnZW1zQHBhYmxvdHJvbi5vcmcwggIiMA0GCSqGSIb3
81
+ DQEBAQUAA4ICDwAwggIKAoICAQCpEOGkHV/vH9ySYE9U3vGxG1vISP4EWFRUEez6
82
+ NbQcJs/m+KXXXoyBMD4QD8iIK3GynTgHCFVkMwRsaiC8nj5CPASoEEjC8Xy+r3lt
83
+ zvIRtkUqxZG9NNfmKLbkm88O/7K1Gv0bhdADTa9EbhyvOJ6kZB0XxjjCoV/mYbFw
84
+ DG1MToAu8JrfABO/rwUyw4nKeteWymYc5Wx/JmSXEjJaHqryF/vJiDdg4Mvf6I1x
85
+ siOjuhtTAN8dJn+rhcqA1kPzu0lNx0FxYCsPJa1Y1GJLg0mfd+Hnku30NgsHrrl+
86
+ wm2iFYVbvL7hD/o7fwPctl21AuTjy5YUyjxK9LOHvNtrssfah+8CSaa8FyVe89pw
87
+ J4o6iFp8wDWJHj0C4Rt8m/9Vra9sqei73IIW5VAuSRK3e8TB/dP3UQI7BxjkyAMS
88
+ MIkDnOV1EHugT59CUV0VDHaXBzfdVpFHXOHn1jFm5/G7pkNEMFq7l9CSJZ9EGAsI
89
+ j3HZlfnDLono+fL/PNo1lXJ5Stylrqpa40LESuaGl5q+MfNvJqrGr2iplRup3y7P
90
+ mzhAz08zSdcvsyPQSRXfW8umFn2iDxcvAEulTXyQP33eX5lr9vaCUq+BCKVuiWYW
91
+ sQehEn5NiNdcbXxpvoqrD/Kl28652Sv7svKenArFcAtsOL3j8kl0nzxLVkyKumz7
92
+ 4oeNdwIDAQABo4IBhDCCAYAwCQYDVR0TBAIwADARBglghkgBhvhCAQEEBAMCBLAw
93
+ KwYJYIZIAYb4QgENBB4WHFRpbnlDQSBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYD
94
+ VR0OBBYEFD4zi3QaKvIdOrCm5ecvRTRkIRb0MIHGBgNVHSMEgb4wgbuAFCDycvNc
95
+ Ee44hRmsHsNsdWpEBOsSoYGXpIGUMIGRMQswCQYDVQQGEwJVUzERMA8GA1UECBMI
96
+ VmlyZ2luaWExEjAQBgNVBAcTCUFubmFuZGFsZTESMBAGA1UEChMJUGFibG90cm9u
97
+ MQswCQYDVQQLEwJDQTEZMBcGA1UEAxMQY2EucGFibG90cm9uLm9yZzEfMB0GCSqG
98
+ SIb3DQEJARYQY2FAcGFibG90cm9uLm9yZ4IJALaV65AlSniTMBsGA1UdEgQUMBKB
99
+ EGNhQHBhYmxvdHJvbi5vcmcwIQYDVR0RBBowGIEWcnVieWdlbXNAcGFibG90cm9u
100
+ Lm9yZzALBgNVHQ8EBAMCBaAwDQYJKoZIhvcNAQEFBQADggIBAJWFBhtrg6xYioR6
101
+ OJQqfZ9KnOUZeg6r99OUUzC+eUdxdB1WWkVy7cozAbNFCwNiShMaKTENp++xDkf4
102
+ tV9iflL1UOof+vOV3744dcOeulD10tRkkcdwm4aGb26QGDAImpYaj5DvO0705jt2
103
+ Ik3LVa4rIbgqKZCKvwPVAIC6ja2JdoEBAHqroxL5QGTEOg/UjB082Jg8cihgqcv2
104
+ rQmIOknAmi9r2DG8X9o8bhDeHmfCQLlUCczCLZXYek+TQWTkwlzBUYjC2DMhH6RK
105
+ u9PUe9wAEun7mrduPzEnSf9Lwz2m6YzQbEKrcKpFtZFfEXPyPLBcV6FTnyurTZNj
106
+ 82of9lvOQbOSA3WxZ5Nftea2RI195ISrFIFN3JvGeH5qlY2rTU5KoPa+GwJ9Ded2
107
+ hdA21917OmS+JXWMIEgGHm9OW2VZ2sPZt9J/VotXBWh1jk/Bmo5/UCdjv67xGdK1
108
+ RyL+r+HmUwvTMPvime/oPS17wa9ZpA5awI8of0Awa9qLSGnEbmRDGdniGBb4SXZc
109
+ yve8SLbALak48wH4mA9RxrCL+gsm5fUZpSYfqdLOAe42nEvGWCQsyAe9wJjafUK2
110
+ seoSPfDoJ/hF0bm3HGiK29FF58k15/+V+SPhZZgNX8lynkxt2Z8bsElfj61LoieV
111
+ /LANFBa55ghGzqax1mF/yGfF/utO
112
+ -----END CERTIFICATE-----
113
+
114
+ post_install_message:
115
+ authors:
116
+ - Paul Duncan
117
+ files:
118
+ - ChangeLog
119
+ - COPYING
120
+ - wirble.rb
121
+ - README
122
+ - wirble.gemspec
123
+ test_files: []
124
+
125
+ rdoc_options:
126
+ - --webcvs
127
+ - http://cvs.pablotron.org/cgi-bin/viewcvs.cgi/wirble/
128
+ - --title
129
+ - Wirble API Documentation
130
+ - wirble.rb
131
+ - README
132
+ - ChangeLog
133
+ - COPYING
134
+ extra_rdoc_files: []
135
+
136
+ executables: []
137
+
138
+ extensions: []
139
+
140
+ requirements:
141
+ - Ruby, version 1.8.0 (or newer)
142
+ dependencies: []
143
+
metadata.gz.sig ADDED
Binary file