ribhu 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +18 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +47 -0
- data/Rakefile +1 -0
- data/bin/ribhu +337 -0
- data/lib/ribhu/version.rb +3 -0
- data/lib/ribhu.rb +5 -0
- data/ribhu.gemspec +24 -0
- metadata +110 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 Rahul Kumar
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
# Ribhu
|
2
|
+
|
3
|
+
ri browser using ncurses
|
4
|
+
|
5
|
+
Hopes to make your ruby documentation experience faster. This is a two pane application, with
|
6
|
+
Classes on the left list, and details on the right.
|
7
|
+
You may press Enter on a class to see its documention. Pressing ENTER over a method in the right will
|
8
|
+
fetch its details.
|
9
|
+
|
10
|
+
You may mark classes with an upper case alphabet (vim style) and access them directly using single-quote.
|
11
|
+
Several classes have been bookmarked such as Array, String, Hash, File.
|
12
|
+
|
13
|
+
Pressing Alt-c and type in any class or method or portion. If `ri` does not return data or returns
|
14
|
+
choices, a popup will allows selection of choices.
|
15
|
+
|
16
|
+
Browser style, one may backspace through earlier results, or use Alt-n and Alt-p to go back and forth
|
17
|
+
between previous and next pages viewed.
|
18
|
+
|
19
|
+
Please get back to me if there are cases where it's unhelpful in finding the ridocs.
|
20
|
+
|
21
|
+
## Installation
|
22
|
+
|
23
|
+
gem install ribhu
|
24
|
+
|
25
|
+
## Usage
|
26
|
+
|
27
|
+
Ensure you have ri documentation working. On the command line you may do, "ri String". You should get documentation for the String class. If not proceed as follows:
|
28
|
+
|
29
|
+
To get ri documentation, you would do
|
30
|
+
|
31
|
+
rvm docs generate-ri
|
32
|
+
|
33
|
+
If you use any gems for development, e.g. highline or rbcurse-core, use the `--ri` flag while installing the gem (this assumes you've switched off ri and rdocs in your .gemrc).
|
34
|
+
|
35
|
+
This gem depends on rbcurse-core
|
36
|
+
|
37
|
+
## Gem name
|
38
|
+
|
39
|
+
rib was taken, so i took the next name that came to mind. "ri" browser.
|
40
|
+
|
41
|
+
## Contributing
|
42
|
+
|
43
|
+
1. Fork it
|
44
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
45
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
46
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
47
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/bin/ribhu
ADDED
@@ -0,0 +1,337 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
# NOTE: If the listbox is empty, that could mean that you have not generated
|
4
|
+
# ri documentation for this version of ruby. You can do so by doing:
|
5
|
+
# rvm docs generate-ri
|
6
|
+
# or
|
7
|
+
# rvm docs generate
|
8
|
+
# (This assumes you are using rvm)
|
9
|
+
#
|
10
|
+
# WARNING : IF THIS PROGRAM HANGS check the ri command
|
11
|
+
# Maybe your version of ri has different options and is going interactive.
|
12
|
+
# ruby 1.9.3's ri requires a -l option or else if becomes interactive.
|
13
|
+
# this program tests out a listbox
|
14
|
+
# This is written in the old style where we start and end ncurses and initiate a
|
15
|
+
# getch loop. It gives more control.
|
16
|
+
# The new style is to use App which does the ncurses setup and teardown, as well
|
17
|
+
# as manages keys. It also takes care of logger and includes major stuff.
|
18
|
+
#
|
19
|
+
#
|
20
|
+
# TODO: what about other docs such as rbcurse, highline and others
|
21
|
+
# If search fails try ::str
|
22
|
+
# Also when ENTER if class has a :: then try adding it straight to that module RubyCurses::Button
|
23
|
+
# and not RubyC::Link.Button -- keep trying options till we get something
|
24
|
+
require 'logger'
|
25
|
+
require 'rbcurse'
|
26
|
+
require 'rbcurse/core/widgets/rlist'
|
27
|
+
require 'rbcurse/core/widgets/rtextview'
|
28
|
+
require 'rbcurse/core/include/vieditable'
|
29
|
+
|
30
|
+
class RubyCurses::List
|
31
|
+
# vieditable includes listeditable which
|
32
|
+
# does bring in some functions which can crash program like x and X TODO
|
33
|
+
# also, f overrides list f mapping. TODO
|
34
|
+
include ViEditable
|
35
|
+
end
|
36
|
+
def my_help_text
|
37
|
+
<<-eos
|
38
|
+
|
39
|
+
=========================================================================
|
40
|
+
Basic Usage
|
41
|
+
|
42
|
+
Press <ENTER> on a class name on the first list, to view ri information
|
43
|
+
for it on the right.
|
44
|
+
|
45
|
+
Tab to right area, and press <ENTER> on a method name, to see its details
|
46
|
+
Press / <slash> in any box to search. e.g /String will take you to the
|
47
|
+
first occurrence of String. <n> will take you to next.
|
48
|
+
|
49
|
+
To go quickly to first class starting with 'S', type <f> followed by <S>.
|
50
|
+
Then press <n> to go to next match.
|
51
|
+
|
52
|
+
On the right window, you may press BACKSPACE to go back to earlier pages.
|
53
|
+
You may also press Alt-n and Alt-p to cycle through next and previously
|
54
|
+
viewed pages.
|
55
|
+
|
56
|
+
Press Alt-C to enter class or method name and see details. If there is
|
57
|
+
no data returned, or options returned you may have to select from a list.
|
58
|
+
e.g. entering 'flatten' may return a list of choices to select from.
|
59
|
+
Entering 'Str' returns nothing from ri, so you have to select from classes
|
60
|
+
starting with 'Str'.
|
61
|
+
|
62
|
+
=========================================================================
|
63
|
+
Bookmarks
|
64
|
+
|
65
|
+
Access bookmarks using single-quote as in vim followed by a single character.
|
66
|
+
Some have been set such as Array, String, Hash, File. To create a bookmark,
|
67
|
+
position cursor over a class in the left list, and press "m". You will be
|
68
|
+
prompted for the character to use as the mark.
|
69
|
+
|
70
|
+
=========================================================================
|
71
|
+
Buffers
|
72
|
+
|
73
|
+
Ordinary a textview contains only one buffer. However, the one on the right
|
74
|
+
is extended for multiple buffers. Pressing ENTER on the left on several
|
75
|
+
rows opens multiple buffers on the right. Use M-n (Alt-N) and M-p to navigate.
|
76
|
+
ALternatively, : maps to a menu, so :n and :p may also be used.
|
77
|
+
<BACKSPACE> will also go to previous buffer, like a browser.
|
78
|
+
|
79
|
+
=========================================================================
|
80
|
+
Press <M-n> for next help screen, or try :n
|
81
|
+
|
82
|
+
eos
|
83
|
+
end
|
84
|
+
|
85
|
+
##
|
86
|
+
# display the ridoc for given word (class or method or part)
|
87
|
+
def display_text word
|
88
|
+
w = @form.by_name["tv"];
|
89
|
+
lines = `ri -f rdoc #{word}`.split("\n")
|
90
|
+
return if lines.nil? || lines.size == 0
|
91
|
+
# ansi can have overflow
|
92
|
+
#w.add_content(lines, :content_type => :ansi, :title => word)
|
93
|
+
w.add_content(lines, :title => word)
|
94
|
+
w.buffer_last
|
95
|
+
end
|
96
|
+
|
97
|
+
##
|
98
|
+
# prompt user for a class name and show ri doc for same, can be method too
|
99
|
+
#
|
100
|
+
def ask_classes
|
101
|
+
format="rdoc"
|
102
|
+
str = get_string("Enter a class name: ")
|
103
|
+
if str != ""
|
104
|
+
lines = `ri -f #{format} #{str}`.split("\n")
|
105
|
+
if lines.size == 0
|
106
|
+
#alert "Nothing came through for #{str}"
|
107
|
+
## Nothing returned, lets see if we can match something from the class list
|
108
|
+
li = @form.by_name["mylist"];
|
109
|
+
values = li.list
|
110
|
+
values = values.grep(/^#{str}/i)
|
111
|
+
if values.size > 0
|
112
|
+
ix = popuplist(values)
|
113
|
+
if ix
|
114
|
+
str = values[ix]
|
115
|
+
lines = `ri -f #{format} #{str}`.split("\n")
|
116
|
+
end
|
117
|
+
else
|
118
|
+
alert "Nothing came through for #{str}"
|
119
|
+
end
|
120
|
+
elsif lines.first.index(".#{str} not found")
|
121
|
+
## we are returned something with some choices, lets prompt user with choices
|
122
|
+
lines.shift
|
123
|
+
lines.shift
|
124
|
+
ix = popuplist(lines)
|
125
|
+
if ix
|
126
|
+
str = lines[ix]
|
127
|
+
lines = `ri -f #{format} #{str}`.split("\n")
|
128
|
+
end
|
129
|
+
end
|
130
|
+
return if lines.size == 0
|
131
|
+
w = @form.by_name["tv"];
|
132
|
+
#w.add_content(lines, :content_type => :ansi, :title => str)
|
133
|
+
w.add_content(lines, :title => str)
|
134
|
+
w.buffer_last
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
# set focus in list on given string
|
139
|
+
def set_focus_on str
|
140
|
+
listb = @form.by_name["mylist"];
|
141
|
+
ix = listb.list.index(str)
|
142
|
+
if ix
|
143
|
+
listb.set_focus_on ix
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
## user has pressed bokmark char, now get the mark A-Z
|
148
|
+
def ask_bookmark
|
149
|
+
ch = @window.getchar
|
150
|
+
ch = ch.chr.upcase
|
151
|
+
str = $bookmarks[ch.to_sym]
|
152
|
+
if str
|
153
|
+
display_text str
|
154
|
+
# set focus to that in the left list
|
155
|
+
set_focus_on str
|
156
|
+
else
|
157
|
+
#alert "No bookmark for #{ch}"
|
158
|
+
## No bookmark, jumping to first char
|
159
|
+
listb = @form.by_name["mylist"];
|
160
|
+
listb.set_selection_for_char ch
|
161
|
+
end
|
162
|
+
end
|
163
|
+
def add_bookmark ch, word
|
164
|
+
$bookmarks[ch.upcase.to_sym] = word
|
165
|
+
alert "set mark for #{ch.upcase.to_sym} for #{word}"
|
166
|
+
end
|
167
|
+
|
168
|
+
## try various options till you get something.
|
169
|
+
#
|
170
|
+
def try_ri arr
|
171
|
+
_text = nil
|
172
|
+
arr.each do |w|
|
173
|
+
_text = `ri -f rdoc #{w} 2>&1`.split("\n")
|
174
|
+
if _text.first.index("Nothing known about")
|
175
|
+
else
|
176
|
+
break
|
177
|
+
end
|
178
|
+
end
|
179
|
+
_text
|
180
|
+
end
|
181
|
+
|
182
|
+
|
183
|
+
#if $0 == __FILE__
|
184
|
+
if true
|
185
|
+
include RubyCurses
|
186
|
+
|
187
|
+
begin
|
188
|
+
# Initialize curses
|
189
|
+
VER::start_ncurses # this is initializing colors via ColorMap.setup
|
190
|
+
$log = Logger.new((File.join(ENV["LOGDIR"] || "./" ,"rbc13.log")))
|
191
|
+
$log.level = Logger::DEBUG
|
192
|
+
|
193
|
+
$bookmarks = {
|
194
|
+
:A => "Array",
|
195
|
+
:C => "Class",
|
196
|
+
:D => "Dir",
|
197
|
+
:F => "File",
|
198
|
+
:H => "Hash",
|
199
|
+
:I => "IO",
|
200
|
+
:K => "Kernel",
|
201
|
+
:R => "RubyCurses",
|
202
|
+
:L => "RubyCurses::Link",
|
203
|
+
:S => "String"
|
204
|
+
}
|
205
|
+
|
206
|
+
|
207
|
+
@window = VER::Window.root_window
|
208
|
+
$catch_alt_digits = true; # emacs like alt-1..9 numeric arguments
|
209
|
+
install_help_text my_help_text
|
210
|
+
# Initialize few color pairs
|
211
|
+
# Create the window to be associated with the form
|
212
|
+
# Un post form and free the memory
|
213
|
+
|
214
|
+
catch(:close) do
|
215
|
+
@form = Form.new @window
|
216
|
+
@form.bind_key(KEY_F1, 'help'){ display_app_help }
|
217
|
+
@form.bind_key(?\M-c, 'select class') do
|
218
|
+
ask_classes
|
219
|
+
end
|
220
|
+
@form.bind_key(?', 'select bookmark') do
|
221
|
+
ask_bookmark
|
222
|
+
end
|
223
|
+
|
224
|
+
# this is the old style of printing something directly on the window.
|
225
|
+
# The new style is to use a header
|
226
|
+
@form.window.printstring 0, 30, "ri documentation browser", $normalcolor, BOLD
|
227
|
+
r = 1; fc = 1;
|
228
|
+
|
229
|
+
# this is the old style of using a label at the screen bottom, you can use the status_line
|
230
|
+
|
231
|
+
v = "Q quit, F1 Help, ? Bindings, f<char>, /, Alt-c, ENTER on Class or Method"
|
232
|
+
var = RubyCurses::Label.new @form, { :text => v, :row => FFI::NCurses.LINES-2,
|
233
|
+
:col => fc, :display_length => 100}
|
234
|
+
|
235
|
+
h = FFI::NCurses.LINES-3
|
236
|
+
mylist = `ri -l `.split("\n")
|
237
|
+
w = 25
|
238
|
+
|
239
|
+
listb = List.new @form, :name => "mylist" ,
|
240
|
+
:row => r ,
|
241
|
+
:col => 1 ,
|
242
|
+
:width => w,
|
243
|
+
:height => h,
|
244
|
+
:list => mylist,
|
245
|
+
:selection_mode => :SINGLE,
|
246
|
+
:show_selector => true,
|
247
|
+
:title => " Ruby Classes "
|
248
|
+
#title_attrib 'reverse'
|
249
|
+
listb.one_key_selection = false # this allows us to map keys to methods
|
250
|
+
#listb.vieditable_init_listbox
|
251
|
+
# what for is Io here
|
252
|
+
include Io
|
253
|
+
listb.bind_key(32) {|l| l.scroll_forward };
|
254
|
+
listb.bind(:PRESS) {
|
255
|
+
display_text listb.text
|
256
|
+
## select class and display riinfo for class
|
257
|
+
}
|
258
|
+
listb.bind_key(?m) {
|
259
|
+
str = listb.text
|
260
|
+
ch = get_string("Enter character as shortcut for #{str}")
|
261
|
+
if ch != ""
|
262
|
+
add_bookmark ch[0], str
|
263
|
+
end
|
264
|
+
## select class and display riinfo for class
|
265
|
+
}
|
266
|
+
#listb.unbind_key([?', ?'])
|
267
|
+
#listb.unbind_key(["'","'"])
|
268
|
+
#listb.unbind_key("'")
|
269
|
+
listb.bind_key(?', 'select bookmark') do
|
270
|
+
ask_bookmark
|
271
|
+
end
|
272
|
+
|
273
|
+
tv = RubyCurses::TextView.new @form, :row => r, :col => w+1, :height => h, :width => FFI::NCurses.COLS-w-1,
|
274
|
+
:name => "tv", :title => "Press Enter on method"
|
275
|
+
tv.set_content ["Press Enter on list to view ri information in this area.",
|
276
|
+
"Press ENTER on method name to see details"]
|
277
|
+
require 'rbcurse/core/include/multibuffer'
|
278
|
+
tv.extend(RubyCurses::MultiBuffers)
|
279
|
+
#tv.unbind_key([?', ?'])
|
280
|
+
#tv.unbind_key(?')
|
281
|
+
tv.bind_key(?', 'select bookmark') do
|
282
|
+
ask_bookmark
|
283
|
+
end
|
284
|
+
|
285
|
+
# pressing ENTER on a method name will popup details for that method
|
286
|
+
tv.bind(:PRESS) { |ev|
|
287
|
+
w = ev.word_under_cursor.strip
|
288
|
+
# check that user did not hit enter on empty area
|
289
|
+
if w != ""
|
290
|
+
#alert "wuc:#{w}:cp=#{ev.curpos},"
|
291
|
+
#if w.index("::")
|
292
|
+
#str=w
|
293
|
+
#else
|
294
|
+
str = "#{tv.title}.#{w}"
|
295
|
+
_text = try_ri([w, "#{str}"])
|
296
|
+
#end
|
297
|
+
tt = tv.title
|
298
|
+
#_text = `ri -f rdoc #{str} 2>&1`
|
299
|
+
#_text = _text.split("\n")
|
300
|
+
if _text.first.index("Nothing known about")
|
301
|
+
$log.debug "XXXX got #{_text}"
|
302
|
+
if tt.index("::")
|
303
|
+
ix = tt.index("::")
|
304
|
+
tt = tt[0,ix]
|
305
|
+
_text = `ri -f rdoc #{tt}::#{w} 2>&1`.split("\n")
|
306
|
+
end
|
307
|
+
end
|
308
|
+
if _text && _text.size != 0
|
309
|
+
#view(_text, :content_type => :ansi)
|
310
|
+
view(_text)
|
311
|
+
end
|
312
|
+
end
|
313
|
+
}
|
314
|
+
|
315
|
+
|
316
|
+
@form.repaint
|
317
|
+
@window.wrefresh
|
318
|
+
Ncurses::Panel.update_panels
|
319
|
+
while((ch = @window.getchar()) != KEY_F10 )
|
320
|
+
break if ch == ?Q.ord
|
321
|
+
@form.handle_key(ch)
|
322
|
+
@window.wrefresh
|
323
|
+
end
|
324
|
+
end
|
325
|
+
rescue => ex
|
326
|
+
textdialog ["Error in rib: #{ex} ", *ex.backtrace], :title => "Exception"
|
327
|
+
$log.debug( ex) if ex
|
328
|
+
$log.debug(ex.backtrace.join("\n")) if ex
|
329
|
+
ensure
|
330
|
+
@window.destroy if !@window.nil?
|
331
|
+
VER::stop_ncurses
|
332
|
+
p ex if ex
|
333
|
+
p(ex.backtrace.join("\n")) if ex
|
334
|
+
end
|
335
|
+
else
|
336
|
+
puts "Error #{$0}, #{__FILE__}"
|
337
|
+
end
|
data/lib/ribhu.rb
ADDED
data/ribhu.gemspec
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'ribhu/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "ribhu"
|
8
|
+
spec.version = Ribhu::VERSION
|
9
|
+
spec.authors = ["Rahul Kumar"]
|
10
|
+
spec.email = ["sentinel1879@gmail.com"]
|
11
|
+
spec.description = %q{ri documentation browser using ncurses}
|
12
|
+
spec.summary = %q{ri documentation browser using ncurses}
|
13
|
+
spec.homepage = "https://github.com/rkumar/ribhu"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
22
|
+
spec.add_development_dependency "rake"
|
23
|
+
spec.add_dependency "rbcurse-core"
|
24
|
+
end
|
metadata
ADDED
@@ -0,0 +1,110 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ribhu
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Rahul Kumar
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-03-04 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: bundler
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '1.3'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '1.3'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rake
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: rbcurse-core
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :runtime
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
description: ri documentation browser using ncurses
|
63
|
+
email:
|
64
|
+
- sentinel1879@gmail.com
|
65
|
+
executables:
|
66
|
+
- ribhu
|
67
|
+
extensions: []
|
68
|
+
extra_rdoc_files: []
|
69
|
+
files:
|
70
|
+
- .gitignore
|
71
|
+
- Gemfile
|
72
|
+
- LICENSE.txt
|
73
|
+
- README.md
|
74
|
+
- Rakefile
|
75
|
+
- bin/ribhu
|
76
|
+
- lib/ribhu.rb
|
77
|
+
- lib/ribhu/version.rb
|
78
|
+
- ribhu.gemspec
|
79
|
+
homepage: https://github.com/rkumar/ribhu
|
80
|
+
licenses:
|
81
|
+
- MIT
|
82
|
+
post_install_message:
|
83
|
+
rdoc_options: []
|
84
|
+
require_paths:
|
85
|
+
- lib
|
86
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
87
|
+
none: false
|
88
|
+
requirements:
|
89
|
+
- - ! '>='
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
version: '0'
|
92
|
+
segments:
|
93
|
+
- 0
|
94
|
+
hash: 2856289681820087894
|
95
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
96
|
+
none: false
|
97
|
+
requirements:
|
98
|
+
- - ! '>='
|
99
|
+
- !ruby/object:Gem::Version
|
100
|
+
version: '0'
|
101
|
+
segments:
|
102
|
+
- 0
|
103
|
+
hash: 2856289681820087894
|
104
|
+
requirements: []
|
105
|
+
rubyforge_project:
|
106
|
+
rubygems_version: 1.8.25
|
107
|
+
signing_key:
|
108
|
+
specification_version: 3
|
109
|
+
summary: ri documentation browser using ncurses
|
110
|
+
test_files: []
|