rtui 0.1.8
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.
- data/History.txt +118 -0
- data/LICENSE.txt +59 -0
- data/Manifest.txt +17 -0
- data/README.rdoc +139 -0
- data/Rakefile +27 -0
- data/lib/rtui.rb +9 -0
- data/lib/rtui/progress.rb +301 -0
- data/rspec.rake +21 -0
- data/rtui.gemspec +37 -0
- data/script/console +10 -0
- data/script/destroy +14 -0
- data/script/generate +14 -0
- data/spec/rtui/progress_spec.rb +155 -0
- data/spec/rtui_spec.rb +11 -0
- data/spec/spec.opts +2 -0
- data/spec/spec_helper.rb +10 -0
- data/tasks/rspec.rake +21 -0
- metadata +95 -0
data/History.txt
ADDED
@@ -0,0 +1,118 @@
|
|
1
|
+
2008-12-11
|
2
|
+
|
3
|
+
* Forked
|
4
|
+
|
5
|
+
|
6
|
+
2005-05-21 Satoru Takabayashi <satoru@namazu.org>
|
7
|
+
|
8
|
+
* progressbar.rb (ProgressBar::show): Call IO#flush. Suggestted by
|
9
|
+
"Geert Fannes" <Geert.Fannes at ikanconsulting.com>
|
10
|
+
|
11
|
+
2005-01-07 Satoru Takabayashi <satoru@namazu.org>
|
12
|
+
|
13
|
+
* progressbar.rb (ProgressBar::VERSION): Bumped version number to 0.9.
|
14
|
+
(ProgressBar::finished?): New method.
|
15
|
+
(ProgressBar::current): New attribute.
|
16
|
+
(ProgressBar::total): New attribute.
|
17
|
+
(ProgressBar::title): New attribute.
|
18
|
+
(ProgressBar::start_time): New attribute.
|
19
|
+
(ProgressBar::inspect): Change the format.
|
20
|
+
(ProgressBar::show_if_needed): Renamed from show_progress.
|
21
|
+
(ProgressBar::clear): New method.
|
22
|
+
(ProgressBar::initialize): Renamed a field: bar_width ->
|
23
|
+
terminal_width.
|
24
|
+
(ProgressBar::do_percentage): New method.
|
25
|
+
(ProgressBar::percentage): Use it.
|
26
|
+
(ReversedProgressBar): New class.
|
27
|
+
(ProgressBar::initialize): Use #clear.
|
28
|
+
(ProgressBar::fmt_bar): Ditto.
|
29
|
+
(ProgressBar::fmt_percentage): Renamed from percentage.
|
30
|
+
(ProgressBar::fmt_stat): Ditto.
|
31
|
+
(ProgressBar::fmt_stat_for_file_transfer): Ditto.
|
32
|
+
(ProgressBar::fmt_title): Ditto.
|
33
|
+
|
34
|
+
* test.rb: Use Test::Unit.
|
35
|
+
|
36
|
+
* Makefile (docs): Removed.
|
37
|
+
(progressbar.ja.html): Ditto.
|
38
|
+
(progressbar.en.html): Ditto.
|
39
|
+
(dist): New rule.
|
40
|
+
(check): New rule.
|
41
|
+
|
42
|
+
2004-02-05 Satoru Takabayashi <satoru@namazu.org>
|
43
|
+
|
44
|
+
* Ruby/ProgressBar: Version 0.8 released!
|
45
|
+
|
46
|
+
* progressbar.rb (ProgressBar::set): Fixed the bug when caused by
|
47
|
+
the invalid count. <http://bugs.debian.org/231009>
|
48
|
+
(ProgressBar::VERSION): Bumped version number to 0.8.
|
49
|
+
|
50
|
+
2004-01-19 Satoru Takabayashi <satoru@namazu.org>
|
51
|
+
|
52
|
+
* Ruby/ProgressBar: Version 0.7 released!
|
53
|
+
|
54
|
+
* progressbar.rb (ProgressBar::initialize): Rename a field:
|
55
|
+
@bar_length -> @bar_width.
|
56
|
+
(ProgressBar::initialize): New field: @title_width.
|
57
|
+
(ProgressBar::title): use it.
|
58
|
+
(ProgressBar::initialize): New field: @previous_time.
|
59
|
+
(ProgressBar::show_progress): Use it and update the progress bar
|
60
|
+
if one sec. elapsed.
|
61
|
+
(ProgressBar::initialize): Call show instead of show_progress.
|
62
|
+
|
63
|
+
2004-01-16 Satoru Takabayashi <satoru@namazu.org>
|
64
|
+
|
65
|
+
* Ruby/ProgressBar: Version 0.6 released!
|
66
|
+
|
67
|
+
* progressbar.rb (ProgressBar::show): Remove the useless condition
|
68
|
+
after "else". Thanks to Neil Spring <nspring@cs.washington.edu>
|
69
|
+
for the report.
|
70
|
+
<http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=227966>
|
71
|
+
(ProgressBar):
|
72
|
+
|
73
|
+
2003-07-24 Satoru Takabayashi <satoru@namazu.org>
|
74
|
+
|
75
|
+
* Ruby/ProgressBar: Version 0.5 released!
|
76
|
+
|
77
|
+
* progressbar.rb (ProgressBar::initialize): New parameter: config.
|
78
|
+
(ProgressBar::convert_prefix_multiplier): New method.
|
79
|
+
(ProgressBar::transfer_rate): New method.
|
80
|
+
(ProgressBar::percentage): New method.
|
81
|
+
(ProgressBar::title): New method.
|
82
|
+
(ProgressBar::initialize): New fields: @bar_mark, @format,
|
83
|
+
@arguments.
|
84
|
+
(ProgressBar::get_width): New method.
|
85
|
+
(ProgressBar::stat_for_file_transfer): New method.
|
86
|
+
(ProgressBar::stat): Renamed from time.
|
87
|
+
(ProgressBar::format=): New method.
|
88
|
+
(ProgressBar::format_arguments=): New method.
|
89
|
+
(ProgressBar::convert_bytes): New method.
|
90
|
+
(ProgressBar::file_transfer_mode): New method.
|
91
|
+
|
92
|
+
2002-10-21 Satoru Takabayashi <satoru@namazu.org>
|
93
|
+
|
94
|
+
* Ruby/ProgressBar: Version 0.4 released!
|
95
|
+
|
96
|
+
* progressbar.rb (ProgressBar::halt): New method. allowing a
|
97
|
+
"broken" ProgressBar in the event of error.
|
98
|
+
- Suggestted by Austin Ziegler <austin@halostatue.ca>
|
99
|
+
|
100
|
+
2002-01-05 Satoru Takabayashi <satoru@namazu.org>
|
101
|
+
|
102
|
+
* Ruby/ProgressBar: Version 0.3 released!
|
103
|
+
|
104
|
+
* progressbar.rb (ProgressBar::show): Shorten @title to fall into
|
105
|
+
the format well.
|
106
|
+
|
107
|
+
2001-11-03 Satoru Takabayashi <satoru@namazu.org>
|
108
|
+
|
109
|
+
* Ruby/ProgressBar: Version 0.2 released!
|
110
|
+
|
111
|
+
* progressbar.rb (ProgressBar::eta): Remove an unnecessary condition.
|
112
|
+
|
113
|
+
* progressbar.rb (ProgressBar::eta): Fix the return value bug.
|
114
|
+
|
115
|
+
* progressbar.rb (ProgressBar::inc): Add an optional parameter `step'.
|
116
|
+
|
117
|
+
* Ruby/ProgressBar: Version 0.1 released!
|
118
|
+
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
http://www.ruby-lang.org/en/LICENSE.txt
|
2
|
+
|
3
|
+
Ruby is copyrighted free software by Yukihiro Matsumoto <matz@netlab.co.jp>.
|
4
|
+
You can redistribute it and/or modify it under either the terms of the GPL
|
5
|
+
(see COPYING.txt file), or the conditions below:
|
6
|
+
|
7
|
+
1. You may make and give away verbatim copies of the source form of the
|
8
|
+
software without restriction, provided that you duplicate all of the
|
9
|
+
original copyright notices and associated disclaimers.
|
10
|
+
|
11
|
+
2. You may modify your copy of the software in any way, provided that
|
12
|
+
you do at least ONE of the following:
|
13
|
+
|
14
|
+
a) place your modifications in the Public Domain or otherwise
|
15
|
+
make them Freely Available, such as by posting said
|
16
|
+
modifications to Usenet or an equivalent medium, or by allowing
|
17
|
+
the author to include your modifications in the software.
|
18
|
+
|
19
|
+
b) use the modified software only within your corporation or
|
20
|
+
organization.
|
21
|
+
|
22
|
+
c) rename any non-standard executables so the names do not conflict
|
23
|
+
with standard executables, which must also be provided.
|
24
|
+
|
25
|
+
d) make other distribution arrangements with the author.
|
26
|
+
|
27
|
+
3. You may distribute the software in object code or executable
|
28
|
+
form, provided that you do at least ONE of the following:
|
29
|
+
|
30
|
+
a) distribute the executables and library files of the software,
|
31
|
+
together with instructions (in the manual page or equivalent)
|
32
|
+
on where to get the original distribution.
|
33
|
+
|
34
|
+
b) accompany the distribution with the machine-readable source of
|
35
|
+
the software.
|
36
|
+
|
37
|
+
c) give non-standard executables non-standard names, with
|
38
|
+
instructions on where to get the original software distribution.
|
39
|
+
|
40
|
+
d) make other distribution arrangements with the author.
|
41
|
+
|
42
|
+
4. You may modify and include the part of the software into any other
|
43
|
+
software (possibly commercial). But some files in the distribution
|
44
|
+
are not written by the author, so that they are not under this terms.
|
45
|
+
|
46
|
+
They are gc.c(partly), utils.c(partly), regex.[ch], st.[ch] and some
|
47
|
+
files under the ./missing directory. See each file for the copying
|
48
|
+
condition.
|
49
|
+
|
50
|
+
5. The scripts and library files supplied as input to or produced as
|
51
|
+
output from the software do not automatically fall under the
|
52
|
+
copyright of the software, but belong to whomever generated them,
|
53
|
+
and may be sold commercially, and may be aggregated with this
|
54
|
+
software.
|
55
|
+
|
56
|
+
6. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
|
57
|
+
IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
|
58
|
+
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
59
|
+
PURPOSE.
|
data/Manifest.txt
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
History.txt
|
2
|
+
LICENSE.txt
|
3
|
+
Manifest.txt
|
4
|
+
README.rdoc
|
5
|
+
Rakefile
|
6
|
+
lib/rtui.rb
|
7
|
+
lib/rtui/progress.rb
|
8
|
+
rspec.rake
|
9
|
+
rtui.gemspec
|
10
|
+
script/console
|
11
|
+
script/destroy
|
12
|
+
script/generate
|
13
|
+
spec/rtui/progress_spec.rb
|
14
|
+
spec/rtui_spec.rb
|
15
|
+
spec/spec.opts
|
16
|
+
spec/spec_helper.rb
|
17
|
+
tasks/rspec.rake
|
data/README.rdoc
ADDED
@@ -0,0 +1,139 @@
|
|
1
|
+
______ _______ _______ _______
|
2
|
+
| __ \_ _| | |_ _|
|
3
|
+
| < | | | | |_| |_
|
4
|
+
|___|__| |___| |_______|_______|
|
5
|
+
|
6
|
+
This gem goal is to provide TUI eye candy for ruby.
|
7
|
+
|
8
|
+
For now, we got:
|
9
|
+
|
10
|
+
* From Ruby/ProgressBar by Satoru Takabayashi
|
11
|
+
|
12
|
+
Ruby/ProgressBar is a text progress bar library for Ruby.
|
13
|
+
It can indicate progress with percentage, a progress bar,
|
14
|
+
and estimated remaining time.
|
15
|
+
This fork changes the api and adds some methods.
|
16
|
+
|
17
|
+
|
18
|
+
== Examples
|
19
|
+
|
20
|
+
pbar = Rtui::Progress.new("test", 100)
|
21
|
+
100.times {sleep(0.1); pbar.inc}; pbar.finish
|
22
|
+
|
23
|
+
test: 100% |===============================================| Time: 00:00:10
|
24
|
+
|
25
|
+
|
26
|
+
pbar = Rtui::Progress.new("test", 100, :components => [:bar, :percentage])
|
27
|
+
100.times {sleep(0.1); pbar.inc}; pbar.finish
|
28
|
+
|
29
|
+
|====================================================================| 100%
|
30
|
+
|
31
|
+
|
32
|
+
pbar = Progress.new("test", 100, :components => [:spinner, :subject, :percentage])
|
33
|
+
100.times { |i| sleep(0.1); pbar.subject = "Iteration #{i}.."; pbar.inc}; pbar.finish
|
34
|
+
|
35
|
+
\ Iteration 68 68%
|
36
|
+
|
37
|
+
pbar = Progress.new("foo", 100, :bar => "o", :components => [:pong, :percentage])
|
38
|
+
(1..100).each{|x| sleep(0.1); pbar.set(x)}; pbar.finish
|
39
|
+
|
40
|
+
| o | 67%
|
41
|
+
|
42
|
+
|
43
|
+
== Install
|
44
|
+
|
45
|
+
sudo gem install rtui
|
46
|
+
|
47
|
+
|
48
|
+
== API
|
49
|
+
|
50
|
+
=== Progress#new (title, total, *options)
|
51
|
+
Display the initial progress bar and return a
|
52
|
+
ProgressBar object. ((|title|)) specifies the title,
|
53
|
+
and ((|total|)) specifies the total cost of processing.
|
54
|
+
Options parameter ((|:out|)) specifies the output IO.
|
55
|
+
|
56
|
+
The display of the progress bar is updated when one or
|
57
|
+
more percent is proceeded or one or more seconds are
|
58
|
+
elapsed from the previous display.
|
59
|
+
|
60
|
+
=== Options:
|
61
|
+
|
62
|
+
{ :bar => "=", :out => STDERR, :components => [
|
63
|
+
:title,
|
64
|
+
:bar,
|
65
|
+
:spinner,
|
66
|
+
:subject,
|
67
|
+
:pong,
|
68
|
+
:percentage,
|
69
|
+
:stat
|
70
|
+
]}
|
71
|
+
|
72
|
+
|
73
|
+
=== Progress#inc (step = 1)
|
74
|
+
Increase the internal counter by ((|step|)) and update
|
75
|
+
the display of the progress bar. Display the estimated
|
76
|
+
remaining time on the right side of the bar. The counter
|
77
|
+
does not go beyond the ((|total|)).
|
78
|
+
|
79
|
+
=== Progress#set (count)
|
80
|
+
Set the internal counter to ((|count|)) and update the
|
81
|
+
display of the progress bar. Display the estimated
|
82
|
+
remaining time on the right side of the bar. Raise if
|
83
|
+
((|count|)) is a negative number or a number more than
|
84
|
+
the ((|total|)).
|
85
|
+
|
86
|
+
=== Progress#subject (subject)
|
87
|
+
Set the bar current subject.
|
88
|
+
|
89
|
+
=== Progress#finish
|
90
|
+
Stop the progress bar and update the display of progress
|
91
|
+
bar. Display the elapsed time on the right side of the bar.
|
92
|
+
The progress bar always stops at 100 % by the method.
|
93
|
+
|
94
|
+
=== Progress#halt
|
95
|
+
Stop the progress bar and update the display of progress
|
96
|
+
bar. Display the elapsed time on the right side of the bar.
|
97
|
+
The progress bar stops at the current percentage by the method.
|
98
|
+
|
99
|
+
=== Progress#format_arguments=
|
100
|
+
Set the methods for displaying a progress bar.
|
101
|
+
Default: [:title, :percentage, :bar, :stat].
|
102
|
+
|
103
|
+
=== Progress#file_transfer_mode
|
104
|
+
Use :stat_for_file_transfer instead of :stat to display
|
105
|
+
transfered bytes and transfer rate.
|
106
|
+
|
107
|
+
|
108
|
+
ReverseProgress class is also available. The
|
109
|
+
functionality is identical to Progress but the direction
|
110
|
+
of the progress bar is just opposite.
|
111
|
+
|
112
|
+
|
113
|
+
== Limitations
|
114
|
+
|
115
|
+
Since the progress is calculated by the proportion to the
|
116
|
+
total cost of processing, Ruby/ProgressBar cannot be used if
|
117
|
+
the total cost of processing is unknown in advance.
|
118
|
+
Moreover, the estimation of remaining time cannot be
|
119
|
+
accurately performed if the progress does not flow uniformly.
|
120
|
+
|
121
|
+
|
122
|
+
== LICENSE:
|
123
|
+
Copyright (C) 2008
|
124
|
+
|
125
|
+
|
126
|
+
=== Original Gem
|
127
|
+
|
128
|
+
* http://namazu.org/~satoru/ruby-progressbar/ruby-progressbar-0.9.tar.gz
|
129
|
+
* http://cvs.namazu.org/ruby-progressbar
|
130
|
+
|
131
|
+
Satoru Takabayashi
|
132
|
+
http://namazu.org/~satoru
|
133
|
+
|
134
|
+
|
135
|
+
Copyright (C) 2001-2005 Satoru Takabayashi <satoru@namazu.org>
|
136
|
+
All rights reserved.
|
137
|
+
This is free software with ABSOLUTELY NO WARRANTY.
|
138
|
+
|
139
|
+
You can redistribute it and/or modify it under the terms of Ruby's license.
|
data/Rakefile
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
%w[rubygems rake rake/clean fileutils newgem rubigen].each { |f| require f }
|
2
|
+
require File.dirname(__FILE__) + '/lib/rtui'
|
3
|
+
|
4
|
+
# Generate all the Rake tasks
|
5
|
+
# Run 'rake -T' to see list of generated tasks (from gem root directory)
|
6
|
+
$hoe = Hoe.new('rtui', Rtui::VERSION) do |p|
|
7
|
+
p.developer('Marcos Piccinini', 'x@nofxx.com')
|
8
|
+
p.changes = p.paragraphs_of("History.txt", 0..1).join("\n\n")
|
9
|
+
p.rubyforge_name = p.name # TODO this is default value
|
10
|
+
p.summary = "Ruby TUI Helpers"
|
11
|
+
p.description = "Set of tools for TUI Eye Candy"
|
12
|
+
p.url = "http://github.com/nofxx/rtui"
|
13
|
+
p.extra_dev_deps = [
|
14
|
+
['newgem', ">= #{::Newgem::VERSION}"]
|
15
|
+
]
|
16
|
+
|
17
|
+
p.clean_globs |= %w[**/.DS_Store tmp *.log]
|
18
|
+
path = (p.rubyforge_name == p.name) ? p.rubyforge_name : "\#{p.rubyforge_name}/\#{p.name}"
|
19
|
+
p.remote_rdoc_dir = File.join(path.gsub(/^#{p.rubyforge_name}\/?/,''), 'rdoc')
|
20
|
+
p.rsync_args = '-av --delete --ignore-errors'
|
21
|
+
end
|
22
|
+
|
23
|
+
require 'newgem/tasks' # load /tasks/*.rake
|
24
|
+
Dir['tasks/**/*.rake'].each { |t| load t }
|
25
|
+
|
26
|
+
# TODO - want other tests/tasks run by default? Add them to the list
|
27
|
+
# task :default => [:spec, :features]
|
data/lib/rtui.rb
ADDED
@@ -0,0 +1,301 @@
|
|
1
|
+
#
|
2
|
+
#
|
3
|
+
#
|
4
|
+
#
|
5
|
+
# Original code:
|
6
|
+
#
|
7
|
+
# Ruby/ProgressBar - a text progress bar library VERSION = "0.9"
|
8
|
+
#
|
9
|
+
# Copyright (C) 2001-2005 Satoru Takabayashi <satoru@namazu.org>
|
10
|
+
# All rights reserved.
|
11
|
+
# This is free software with ABSOLUTELY NO WARRANTY.
|
12
|
+
#
|
13
|
+
# You can redistribute it and/or modify it under the terms
|
14
|
+
# of Ruby's license.
|
15
|
+
#
|
16
|
+
#
|
17
|
+
#
|
18
|
+
#require 'rtui/progress/bar'
|
19
|
+
#require 'rtui/progress/spinner'
|
20
|
+
|
21
|
+
module Rtui
|
22
|
+
|
23
|
+
#
|
24
|
+
# Progress indicators
|
25
|
+
#
|
26
|
+
class Progress
|
27
|
+
attr_reader :title
|
28
|
+
attr_reader :current
|
29
|
+
attr_reader :total
|
30
|
+
attr_accessor :start_time
|
31
|
+
|
32
|
+
#
|
33
|
+
# Initializes a progress indicator.
|
34
|
+
#
|
35
|
+
# Examples:
|
36
|
+
#
|
37
|
+
# Just a bar and ETA:
|
38
|
+
# Rtui::Progress.new("Foo", 10, { :components => [:bar, :stat]})
|
39
|
+
#
|
40
|
+
# A Spinner with just percentage:
|
41
|
+
# Rtui::Progress.new("Foo", 10, { :components => [:spinner, :percentage]})
|
42
|
+
#
|
43
|
+
#
|
44
|
+
# Options:
|
45
|
+
# - bar => "="
|
46
|
+
# - out => STDERR
|
47
|
+
#
|
48
|
+
# Components:
|
49
|
+
# - title
|
50
|
+
# - spinner
|
51
|
+
# - percentage
|
52
|
+
# - stat
|
53
|
+
# - bar
|
54
|
+
#
|
55
|
+
def initialize (title, total, *options)
|
56
|
+
options = options.first || {}
|
57
|
+
@title = title
|
58
|
+
@total = total
|
59
|
+
@terminal_width = 80
|
60
|
+
@current = 0
|
61
|
+
@previous = 0
|
62
|
+
@finished = false
|
63
|
+
@start_time = Time.now
|
64
|
+
@previous_time = @start_time
|
65
|
+
@title_width = 14
|
66
|
+
@subject = ""
|
67
|
+
|
68
|
+
@out = options[:out] || STDERR
|
69
|
+
@bar_mark = options[:bar] || "="
|
70
|
+
@colors = options[:colors] || false
|
71
|
+
@components = options[:components] || [:title, :percentage, :bar, :stat]
|
72
|
+
|
73
|
+
clear
|
74
|
+
show
|
75
|
+
end
|
76
|
+
|
77
|
+
def clear
|
78
|
+
@out.print "\r#{(" " * (get_width - 1))}\r"
|
79
|
+
end
|
80
|
+
|
81
|
+
def finish
|
82
|
+
@current = @total
|
83
|
+
@finished = true
|
84
|
+
show
|
85
|
+
end
|
86
|
+
|
87
|
+
def finished?
|
88
|
+
@finished
|
89
|
+
end
|
90
|
+
|
91
|
+
def file_transfer_mode
|
92
|
+
return unless @components.index(:stat)
|
93
|
+
@components[@components.index(:stat)] = :stat_for_file_transfer
|
94
|
+
end
|
95
|
+
|
96
|
+
# def format= (format)
|
97
|
+
# @format = format
|
98
|
+
# end
|
99
|
+
|
100
|
+
def components= (arguments)
|
101
|
+
@components = arguments
|
102
|
+
end
|
103
|
+
|
104
|
+
def subject=(subject)
|
105
|
+
@subject = subject
|
106
|
+
end
|
107
|
+
|
108
|
+
def halt
|
109
|
+
@finished = true
|
110
|
+
show
|
111
|
+
end
|
112
|
+
|
113
|
+
def inc step = 1
|
114
|
+
@current += step
|
115
|
+
@current = @total if @current > @total
|
116
|
+
show_if_needed
|
117
|
+
@previous = @current
|
118
|
+
end
|
119
|
+
|
120
|
+
def set (count)
|
121
|
+
if count < 0 || count > @total
|
122
|
+
raise "invalid count: #{count} (total: #{@total})"
|
123
|
+
end
|
124
|
+
@current = count
|
125
|
+
show_if_needed
|
126
|
+
@previous = @current
|
127
|
+
end
|
128
|
+
|
129
|
+
def inspect
|
130
|
+
"#<Rtui::Progress:#{@current}/#{@total}>"
|
131
|
+
end
|
132
|
+
|
133
|
+
|
134
|
+
private
|
135
|
+
|
136
|
+
def fmt_subject
|
137
|
+
@subject ||= ""
|
138
|
+
blank = @terminal_width - @subject.length
|
139
|
+
out = " " + @subject
|
140
|
+
out << " " * blank if blank > 0
|
141
|
+
out[0, @terminal_width - 5]
|
142
|
+
end
|
143
|
+
|
144
|
+
def fmt_bar
|
145
|
+
bar_width = do_percentage * @terminal_width / 100
|
146
|
+
sprintf("|%s%s|",
|
147
|
+
@bar_mark * bar_width,
|
148
|
+
" " * (@terminal_width - bar_width))
|
149
|
+
end
|
150
|
+
|
151
|
+
def fmt_spinner
|
152
|
+
bar_width = do_percentage * @terminal_width / 100
|
153
|
+
sprintf(" %s%s ",
|
154
|
+
do_percentage == 100 ? " " : '/-\\|'[do_percentage%4].chr ,
|
155
|
+
" " * (@terminal_width / 100) )
|
156
|
+
end
|
157
|
+
|
158
|
+
def fmt_pong
|
159
|
+
bar_width = do_percentage * @terminal_width / 100
|
160
|
+
sprintf("|%s%s|",
|
161
|
+
" " * bar_width + @bar_mark,
|
162
|
+
" " * (@terminal_width - bar_width))
|
163
|
+
end
|
164
|
+
|
165
|
+
def fmt_percentage
|
166
|
+
"%3d%%" % do_percentage
|
167
|
+
end
|
168
|
+
|
169
|
+
def fmt_stat
|
170
|
+
@finished ? elapsed : eta
|
171
|
+
end
|
172
|
+
|
173
|
+
def fmt_stat_for_file_transfer
|
174
|
+
sprintf("%s %s %s", bytes, transfer_rate, fmt_stat)
|
175
|
+
end
|
176
|
+
|
177
|
+
def fmt_title
|
178
|
+
@title[0,(@title_width - 1)] + ":"
|
179
|
+
end
|
180
|
+
|
181
|
+
def convert_bytes (bytes)
|
182
|
+
if bytes < 1024
|
183
|
+
sprintf("%6dB", bytes)
|
184
|
+
elsif bytes < 1024 * 1000 # 1000kb
|
185
|
+
sprintf("%5.1fKB", bytes.to_f / 1024)
|
186
|
+
elsif bytes < 1024 * 1024 * 1000 # 1000mb
|
187
|
+
sprintf("%5.1fMB", bytes.to_f / 1024 / 1024)
|
188
|
+
else
|
189
|
+
sprintf("%5.1fGB", bytes.to_f / 1024 / 1024 / 1024)
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
def transfer_rate
|
194
|
+
bytes_per_second = @current.to_f / (Time.now - @start_time)
|
195
|
+
sprintf("%s/s", convert_bytes(bytes_per_second))
|
196
|
+
end
|
197
|
+
|
198
|
+
def bytes
|
199
|
+
convert_bytes(@current)
|
200
|
+
end
|
201
|
+
|
202
|
+
def format_time t
|
203
|
+
t = t.to_i
|
204
|
+
sec = t % 60
|
205
|
+
min = (t / 60) % 60
|
206
|
+
hour = t / 3600
|
207
|
+
sprintf("%02d:%02d:%02d", hour, min, sec);
|
208
|
+
end
|
209
|
+
|
210
|
+
# ETA stands for Estimated Time of Arrival.
|
211
|
+
def eta
|
212
|
+
if @current == 0
|
213
|
+
"ETA: --:--:--"
|
214
|
+
else
|
215
|
+
elapsed = Time.now - @start_time
|
216
|
+
eta = elapsed * @total / @current - elapsed;
|
217
|
+
sprintf("ETA: %s", format_time(eta))
|
218
|
+
end
|
219
|
+
end
|
220
|
+
|
221
|
+
def elapsed
|
222
|
+
sprintf("Time: %s", format_time(Time.now - @start_time))
|
223
|
+
end
|
224
|
+
|
225
|
+
def eol
|
226
|
+
@finished ? "\n" : "\r"
|
227
|
+
end
|
228
|
+
|
229
|
+
def do_percentage
|
230
|
+
return 100 if @total.zero?
|
231
|
+
@current * 100 / @total
|
232
|
+
end
|
233
|
+
|
234
|
+
def get_width
|
235
|
+
# FIXME: I don't know how portable it is.
|
236
|
+
#
|
237
|
+
# Works linux...
|
238
|
+
# Fails OSX
|
239
|
+
#
|
240
|
+
default_width = 80
|
241
|
+
begin
|
242
|
+
tiocgwinsz = 0x5413
|
243
|
+
data = [0, 0, 0, 0].pack("SSSS")
|
244
|
+
if @out.ioctl(tiocgwinsz, data) >= 0 then
|
245
|
+
rows, cols, xpixels, ypixels = data.unpack("SSSS")
|
246
|
+
if cols >= 0 then cols else default_width end
|
247
|
+
else
|
248
|
+
default_width
|
249
|
+
end
|
250
|
+
rescue Exception
|
251
|
+
default_width
|
252
|
+
end
|
253
|
+
end
|
254
|
+
|
255
|
+
def show
|
256
|
+
line = @components.map {|method|
|
257
|
+
send(sprintf("fmt_%s", method))
|
258
|
+
}.join " "
|
259
|
+
|
260
|
+
width = get_width
|
261
|
+
if line.length == width - 1
|
262
|
+
@out.print(line + eol)
|
263
|
+
@out.flush
|
264
|
+
elsif line.length >= width
|
265
|
+
@terminal_width = [@terminal_width - (line.length - width + 1), 0].max
|
266
|
+
if @terminal_width == 0 then @out.print(line + eol) else show end
|
267
|
+
else # line.length < width - 1
|
268
|
+
@terminal_width += width - line.length + 1
|
269
|
+
show
|
270
|
+
end
|
271
|
+
@previous_time = Time.now
|
272
|
+
end
|
273
|
+
|
274
|
+
def show_if_needed
|
275
|
+
if @total.zero?
|
276
|
+
cur_percentage = 100
|
277
|
+
prev_percentage = 0
|
278
|
+
else
|
279
|
+
cur_percentage = (@current * 100 / @total).to_i
|
280
|
+
prev_percentage = (@previous * 100 / @total).to_i
|
281
|
+
end
|
282
|
+
|
283
|
+
# Use "!=" instead of ">" to support negative changes
|
284
|
+
if cur_percentage != prev_percentage ||
|
285
|
+
Time.now - @previous_time >= 1 || @finished
|
286
|
+
show
|
287
|
+
end
|
288
|
+
|
289
|
+
end
|
290
|
+
|
291
|
+
end
|
292
|
+
|
293
|
+
class ReversedProgress < Progress
|
294
|
+
|
295
|
+
def do_percentage
|
296
|
+
100 - super
|
297
|
+
end
|
298
|
+
|
299
|
+
end
|
300
|
+
|
301
|
+
end
|
data/rspec.rake
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
begin
|
2
|
+
require 'spec'
|
3
|
+
rescue LoadError
|
4
|
+
require 'rubygems'
|
5
|
+
require 'spec'
|
6
|
+
end
|
7
|
+
begin
|
8
|
+
require 'spec/rake/spectask'
|
9
|
+
rescue LoadError
|
10
|
+
puts <<-EOS
|
11
|
+
To use rspec for testing you must install rspec gem:
|
12
|
+
gem install rspec
|
13
|
+
EOS
|
14
|
+
exit(0)
|
15
|
+
end
|
16
|
+
|
17
|
+
desc "Run the specs under spec/models"
|
18
|
+
Spec::Rake::SpecTask.new do |t|
|
19
|
+
t.spec_opts = ['--options', "spec/spec.opts"]
|
20
|
+
t.spec_files = FileList['spec/**/*_spec.rb']
|
21
|
+
end
|
data/rtui.gemspec
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{rtui}
|
5
|
+
s.version = "0.1.8"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["Marcos Piccinini"]
|
9
|
+
s.date = %q{2008-12-21}
|
10
|
+
s.description = %q{Set of tools for TUI Eye Candy}
|
11
|
+
s.email = ["x@nofxx.com"]
|
12
|
+
s.extra_rdoc_files = ["History.txt", "LICENSE.txt", "Manifest.txt", "README.rdoc"]
|
13
|
+
s.files = ["History.txt", "LICENSE.txt", "Manifest.txt", "README.rdoc", "Rakefile", "lib/rtui.rb", "lib/rtui/progress.rb", "rspec.rake", "rtui.gemspec", "script/console", "script/destroy", "script/generate", "spec/rtui/progress_spec.rb", "spec/rtui_spec.rb", "spec/spec.opts", "spec/spec_helper.rb", "tasks/rspec.rake"]
|
14
|
+
s.has_rdoc = true
|
15
|
+
s.homepage = %q{http://github.com/nofxx/rtui}
|
16
|
+
s.rdoc_options = ["--main", "README.rdoc"]
|
17
|
+
s.require_paths = ["lib"]
|
18
|
+
s.rubyforge_project = %q{rtui}
|
19
|
+
s.rubygems_version = %q{1.3.1}
|
20
|
+
s.summary = %q{Ruby TUI Helpers}
|
21
|
+
|
22
|
+
if s.respond_to? :specification_version then
|
23
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
24
|
+
s.specification_version = 2
|
25
|
+
|
26
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
27
|
+
s.add_development_dependency(%q<newgem>, [">= 1.2.1"])
|
28
|
+
s.add_development_dependency(%q<hoe>, [">= 1.8.0"])
|
29
|
+
else
|
30
|
+
s.add_dependency(%q<newgem>, [">= 1.2.1"])
|
31
|
+
s.add_dependency(%q<hoe>, [">= 1.8.0"])
|
32
|
+
end
|
33
|
+
else
|
34
|
+
s.add_dependency(%q<newgem>, [">= 1.2.1"])
|
35
|
+
s.add_dependency(%q<hoe>, [">= 1.8.0"])
|
36
|
+
end
|
37
|
+
end
|
data/script/console
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# File: script/console
|
3
|
+
irb = RUBY_PLATFORM =~ /(:?mswin|mingw)/ ? 'irb.bat' : 'irb'
|
4
|
+
|
5
|
+
libs = " -r irb/completion"
|
6
|
+
# Perhaps use a console_lib to store any extra methods I may want available in the cosole
|
7
|
+
# libs << " -r #{File.dirname(__FILE__) + '/../lib/console_lib/console_logger.rb'}"
|
8
|
+
libs << " -r #{File.dirname(__FILE__) + '/../lib/rtui.rb'}"
|
9
|
+
puts "Loading rtui gem"
|
10
|
+
exec "#{irb} #{libs} --simple-prompt"
|
data/script/destroy
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'rubigen'
|
6
|
+
rescue LoadError
|
7
|
+
require 'rubygems'
|
8
|
+
require 'rubigen'
|
9
|
+
end
|
10
|
+
require 'rubigen/scripts/destroy'
|
11
|
+
|
12
|
+
ARGV.shift if ['--help', '-h'].include?(ARGV[0])
|
13
|
+
RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
|
14
|
+
RubiGen::Scripts::Destroy.new.run(ARGV)
|
data/script/generate
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'rubigen'
|
6
|
+
rescue LoadError
|
7
|
+
require 'rubygems'
|
8
|
+
require 'rubigen'
|
9
|
+
end
|
10
|
+
require 'rubigen/scripts/generate'
|
11
|
+
|
12
|
+
ARGV.shift if ['--help', '-h'].include?(ARGV[0])
|
13
|
+
RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
|
14
|
+
RubiGen::Scripts::Generate.new.run(ARGV)
|
@@ -0,0 +1,155 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper.rb'
|
2
|
+
|
3
|
+
describe "Progress Bar" do
|
4
|
+
|
5
|
+
|
6
|
+
#
|
7
|
+
# Ok. Need real tests.
|
8
|
+
# But this REALLY works =D
|
9
|
+
#
|
10
|
+
describe "Visual tests" do
|
11
|
+
|
12
|
+
SleepUnit = 0.01
|
13
|
+
|
14
|
+
def do_make_progress_bar (title, total)
|
15
|
+
Rtui::Progress.new(title, total)
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should pong" do
|
19
|
+
total = 100
|
20
|
+
pbar = Rtui::Progress.new("test(inc)", total, :bar => "o",
|
21
|
+
:components => [:pong, :percentage])
|
22
|
+
total.times { sleep(0.01); pbar.inc }
|
23
|
+
pbar.finish
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should spin!" do
|
27
|
+
total = 100
|
28
|
+
pbar = Rtui::Progress.new("test(inc)", total,
|
29
|
+
:components => [:spinner, :percentage, :stat])
|
30
|
+
total.times { sleep(0.01); pbar.inc }
|
31
|
+
pbar.finish
|
32
|
+
end
|
33
|
+
|
34
|
+
it "different bar" do
|
35
|
+
total = 100
|
36
|
+
pbar = Rtui::Progress.new("test(inc)", total, :bar => "_",
|
37
|
+
:components => [ :stat, :bar, :percentage])
|
38
|
+
total.times { sleep(SleepUnit); pbar.inc }
|
39
|
+
pbar.finish
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should spin 2!" do
|
43
|
+
total = 100
|
44
|
+
pbar = Rtui::Progress.new("test(inc)", total,
|
45
|
+
:components => [:spinner, :percentage])
|
46
|
+
total.times { sleep(0.01); pbar.inc }
|
47
|
+
pbar.finish
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should handle bytes" do
|
51
|
+
total = 1024 * 1024
|
52
|
+
pbar = do_make_progress_bar("test(bytes)", total)
|
53
|
+
pbar.file_transfer_mode
|
54
|
+
0.step(total, 2**14) {|x|
|
55
|
+
pbar.set(x)
|
56
|
+
sleep(SleepUnit)
|
57
|
+
}
|
58
|
+
pbar.finish
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
it "should show a subject!" do
|
63
|
+
total = 100
|
64
|
+
pbar = Rtui::Progress.new("test(inc)", total,
|
65
|
+
:components => [:spinner, :percentage, :subject, :stat])
|
66
|
+
total.times { |i| sleep(0.1); pbar.subject = "inter #{i} times!!!"; pbar.inc }
|
67
|
+
pbar.subject = "finish it"
|
68
|
+
pbar.finish
|
69
|
+
end
|
70
|
+
#
|
71
|
+
# it "should clear" do
|
72
|
+
# total = 100
|
73
|
+
# pbar = do_make_progress_bar("test(clear)", total)
|
74
|
+
# total.times {
|
75
|
+
# sleep(SleepUnit)
|
76
|
+
# pbar.inc
|
77
|
+
# }
|
78
|
+
# pbar.clear
|
79
|
+
# puts
|
80
|
+
# end
|
81
|
+
#
|
82
|
+
# def test_halt
|
83
|
+
# total = 100
|
84
|
+
# pbar = do_make_progress_bar("test(halt)", total)
|
85
|
+
# (total / 2).times {
|
86
|
+
# sleep(SleepUnit)
|
87
|
+
# pbar.inc
|
88
|
+
# }
|
89
|
+
# pbar.halt
|
90
|
+
# end
|
91
|
+
#
|
92
|
+
# it "should test_inc" do
|
93
|
+
# total = 100
|
94
|
+
# pbar = do_make_progress_bar("test(inc)", total)
|
95
|
+
# total.times {
|
96
|
+
# sleep(SleepUnit)
|
97
|
+
# pbar.inc
|
98
|
+
# }
|
99
|
+
# pbar.finish
|
100
|
+
# end
|
101
|
+
#
|
102
|
+
# it "should test_inc_x" do
|
103
|
+
# total = File.size(File.dirname(__FILE__) + '/bar_spec.rb')
|
104
|
+
# pbar = do_make_progress_bar("test(inc(x))", total)
|
105
|
+
# File.new(File.dirname(__FILE__) + '/bar_spec.rb').each {|line|
|
106
|
+
# sleep(SleepUnit)
|
107
|
+
# pbar.inc(line.length)
|
108
|
+
# }
|
109
|
+
# pbar.finish
|
110
|
+
# end
|
111
|
+
#
|
112
|
+
# def test_invalid_set
|
113
|
+
# total = 100
|
114
|
+
# pbar = do_make_progress_bar("test(invalid set)", total)
|
115
|
+
# begin
|
116
|
+
# pbar.set(200)
|
117
|
+
# rescue RuntimeError => e
|
118
|
+
# puts e.message
|
119
|
+
# end
|
120
|
+
# end
|
121
|
+
#
|
122
|
+
# def test_set
|
123
|
+
# total = 1000
|
124
|
+
# pbar = do_make_progress_bar("test(set)", total)
|
125
|
+
# (1..total).find_all {|x| x % 10 == 0}.each {|x|
|
126
|
+
# sleep(SleepUnit)
|
127
|
+
# pbar.set(x)
|
128
|
+
# }
|
129
|
+
# pbar.finish
|
130
|
+
# end
|
131
|
+
#
|
132
|
+
# def test_slow
|
133
|
+
# total = 100000
|
134
|
+
# pbar = do_make_progress_bar("test(slow)", total)
|
135
|
+
# 0.step(500, 1) {|x|
|
136
|
+
# pbar.set(x)
|
137
|
+
# sleep(SleepUnit)
|
138
|
+
# }
|
139
|
+
# pbar.halt
|
140
|
+
# end
|
141
|
+
#
|
142
|
+
# def test_total_zero
|
143
|
+
# total = 0
|
144
|
+
# pbar = do_make_progress_bar("test(total=0)", total)
|
145
|
+
# pbar.finish
|
146
|
+
# end
|
147
|
+
# end
|
148
|
+
#
|
149
|
+
# class ReversedProgressBarTest < ProgressBarTest
|
150
|
+
# def do_make_progress_bar (title, total)
|
151
|
+
# ReversedProgressBar.new(title, total)
|
152
|
+
# end
|
153
|
+
# end
|
154
|
+
end
|
155
|
+
end
|
data/spec/rtui_spec.rb
ADDED
data/spec/spec.opts
ADDED
data/spec/spec_helper.rb
ADDED
data/tasks/rspec.rake
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
begin
|
2
|
+
require 'spec'
|
3
|
+
rescue LoadError
|
4
|
+
require 'rubygems'
|
5
|
+
require 'spec'
|
6
|
+
end
|
7
|
+
begin
|
8
|
+
require 'spec/rake/spectask'
|
9
|
+
rescue LoadError
|
10
|
+
puts <<-EOS
|
11
|
+
To use rspec for testing you must install rspec gem:
|
12
|
+
gem install rspec
|
13
|
+
EOS
|
14
|
+
exit(0)
|
15
|
+
end
|
16
|
+
|
17
|
+
desc "Run the specs under spec/models"
|
18
|
+
Spec::Rake::SpecTask.new do |t|
|
19
|
+
t.spec_opts = ['--options', "spec/spec.opts"]
|
20
|
+
t.spec_files = FileList['spec/**/*_spec.rb']
|
21
|
+
end
|
metadata
ADDED
@@ -0,0 +1,95 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rtui
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.8
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Marcos Piccinini
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2008-12-21 00:00:00 -02:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: newgem
|
17
|
+
type: :development
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 1.2.1
|
24
|
+
version:
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: hoe
|
27
|
+
type: :development
|
28
|
+
version_requirement:
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 1.8.0
|
34
|
+
version:
|
35
|
+
description: Set of tools for TUI Eye Candy
|
36
|
+
email:
|
37
|
+
- x@nofxx.com
|
38
|
+
executables: []
|
39
|
+
|
40
|
+
extensions: []
|
41
|
+
|
42
|
+
extra_rdoc_files:
|
43
|
+
- History.txt
|
44
|
+
- LICENSE.txt
|
45
|
+
- Manifest.txt
|
46
|
+
- README.rdoc
|
47
|
+
files:
|
48
|
+
- History.txt
|
49
|
+
- LICENSE.txt
|
50
|
+
- Manifest.txt
|
51
|
+
- README.rdoc
|
52
|
+
- Rakefile
|
53
|
+
- lib/rtui.rb
|
54
|
+
- lib/rtui/progress.rb
|
55
|
+
- rspec.rake
|
56
|
+
- rtui.gemspec
|
57
|
+
- script/console
|
58
|
+
- script/destroy
|
59
|
+
- script/generate
|
60
|
+
- spec/rtui/progress_spec.rb
|
61
|
+
- spec/rtui_spec.rb
|
62
|
+
- spec/spec.opts
|
63
|
+
- spec/spec_helper.rb
|
64
|
+
- tasks/rspec.rake
|
65
|
+
has_rdoc: true
|
66
|
+
homepage: http://github.com/nofxx/rtui
|
67
|
+
licenses: []
|
68
|
+
|
69
|
+
post_install_message:
|
70
|
+
rdoc_options:
|
71
|
+
- --main
|
72
|
+
- README.rdoc
|
73
|
+
require_paths:
|
74
|
+
- lib
|
75
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
76
|
+
requirements:
|
77
|
+
- - ">="
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: "0"
|
80
|
+
version:
|
81
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
82
|
+
requirements:
|
83
|
+
- - ">="
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: "0"
|
86
|
+
version:
|
87
|
+
requirements: []
|
88
|
+
|
89
|
+
rubyforge_project: rtui
|
90
|
+
rubygems_version: 1.3.5
|
91
|
+
signing_key:
|
92
|
+
specification_version: 2
|
93
|
+
summary: Ruby TUI Helpers
|
94
|
+
test_files: []
|
95
|
+
|