wirble 0.1.2

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 (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