shellout 0.3 → 0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +9 -0
- data/README.md +56 -32
- data/lib/shellout.rb +27 -4
- data/lib/shellout/calendar.rb +87 -61
- data/lib/shellout/menu.rb +26 -0
- data/lib/shellout/version.rb +1 -1
- data/spec/shellout/calendar_spec.rb +51 -29
- data/spec/shellout/menu_spec.rb +43 -0
- data/spec/shellout/shadowbox_spec.rb +6 -4
- data/spec/shellout/table_spec.rb +11 -9
- metadata +33 -11
- data/spec/shellout_spec.rb +0 -15
data/CHANGES
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
2011-12-03: version 0.4
|
2
|
+
|
3
|
+
- Added a class for printing menus
|
4
|
+
|
5
|
+
- Changed the calendar to not use ansi escapes when printing multiple calendars
|
6
|
+
|
7
|
+
- Added shortcuts for creating menus, calendars, tables, and shadowboxes that
|
8
|
+
can be mixed in.
|
9
|
+
|
1
10
|
2011-10-31: version 0.3
|
2
11
|
|
3
12
|
- Added a class for printing calendars
|
data/README.md
CHANGED
@@ -14,49 +14,43 @@ Install
|
|
14
14
|
Usage
|
15
15
|
-----
|
16
16
|
|
17
|
-
|
17
|
+
require 'shellout'
|
18
|
+
include Shellout
|
18
19
|
|
20
|
+
### Shadowboxes
|
19
21
|
|
20
|
-
|
21
|
-
|
22
|
-
Shellout::Shadowbox.new("Hello world").print
|
22
|
+
Shadowbox("Hello world").print
|
23
23
|
|
24
24
|
# ┌──────────────────────────────────────────┐
|
25
25
|
# │ Hello world │▒
|
26
26
|
# └──────────────────────────────────────────┘▒
|
27
27
|
# ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
|
28
28
|
|
29
|
-
|
30
29
|
### Tables
|
31
30
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
['Chelsea', 19],
|
38
|
-
['Newcastle', 16]]).print
|
31
|
+
Table(headers: %w{Team Points},
|
32
|
+
rows: [['Man City', 22],
|
33
|
+
['Man Utd', 20],
|
34
|
+
['Chelsea', 19],
|
35
|
+
['Newcastle', 16]]).print
|
39
36
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
37
|
+
# ┌───────────┬────────┐
|
38
|
+
# │ Team │ Points │
|
39
|
+
# ├───────────┼────────┤
|
40
|
+
# │ Man City │ 22 │
|
41
|
+
# │ Man Utd │ 20 │
|
42
|
+
# │ Chelsea │ 19 │
|
43
|
+
# │ Newcastle │ 16 │
|
44
|
+
# └───────────┴────────┘
|
45
|
+
|
49
46
|
|
50
47
|
### Calendars
|
51
48
|
|
52
|
-
require 'date'
|
53
|
-
require 'shellout/calendar'
|
54
|
-
|
55
49
|
today = Date.today # => "2011-10-31"
|
56
|
-
|
57
|
-
Shellout::Calendar.new(today).print
|
58
50
|
|
59
|
-
|
51
|
+
Calendar(today).print
|
52
|
+
|
53
|
+
# October 2011
|
60
54
|
# Mo Tu We Th Fr Sa Su
|
61
55
|
# 1 2
|
62
56
|
# 3 4 5 6 7 8 9
|
@@ -65,11 +59,10 @@ Usage
|
|
65
59
|
# 24 25 26 27 28 29 30
|
66
60
|
# 31
|
67
61
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
# September 2011 October 2011 November 2011
|
62
|
+
Calendar(today).print3
|
63
|
+
|
64
|
+
# 2011
|
65
|
+
# September October November
|
73
66
|
# Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
|
74
67
|
# 1 2 3 4 1 2 1 2 3 4 5 6
|
75
68
|
# 5 6 7 8 9 10 11 3 4 5 6 7 8 9 7 8 9 10 11 12 13
|
@@ -78,6 +71,37 @@ Usage
|
|
78
71
|
# 26 27 28 29 30 24 25 26 27 28 29 30 28 29 30
|
79
72
|
# 31
|
80
73
|
|
74
|
+
|
75
|
+
### Menus
|
76
|
+
|
77
|
+
Menu([
|
78
|
+
"Do this",
|
79
|
+
"No, this",
|
80
|
+
"Or, maybe this",
|
81
|
+
"Forget it, this is the right choice",
|
82
|
+
"Amazing things will happen if you choose this",
|
83
|
+
"Ignore #5. Pick me!",
|
84
|
+
"I'm the obvious choice",
|
85
|
+
"There is no end to the awesomeness that will come from choosing this",
|
86
|
+
"Don't choose this",
|
87
|
+
"Or this",
|
88
|
+
"Things are getting worse",
|
89
|
+
"Might as well choose this one",
|
90
|
+
]).print
|
91
|
+
|
92
|
+
# 1. Do this
|
93
|
+
# 2. No, this
|
94
|
+
# 3. Or, maybe this
|
95
|
+
# 4. Forget it, this is the right choice
|
96
|
+
# 5. Amazing things will happen if you choose this
|
97
|
+
# 6. Ignore #5. Pick me!
|
98
|
+
# 7. I'm the obvious choice
|
99
|
+
# 8. There is no end to the awesomeness that will come from choosing this
|
100
|
+
# 9. Don't choose this
|
101
|
+
# 10. Or this
|
102
|
+
# 11. Things are getting worse
|
103
|
+
# 12. Might as well choose this one
|
104
|
+
|
81
105
|
Bugs
|
82
106
|
----
|
83
107
|
|
data/lib/shellout.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
#
|
1
|
+
# encoding: utf-8
|
2
2
|
|
3
3
|
# Unicode box drawing characters and block elements
|
4
4
|
#
|
@@ -18,10 +18,33 @@
|
|
18
18
|
# U+258x ▀ ▁ ▂ ▃ ▄ ▅ ▆ ▇ █ ▉ ▊ ▋ ▌ ▍ ▎ ▏
|
19
19
|
# U+259x ▐ ░ ▒ ▓ ▔ ▕ ▖ ▗ ▘ ▙ ▚ ▛ ▜ ▝ ▞ ▟
|
20
20
|
|
21
|
+
require 'shellout/calendar'
|
22
|
+
require 'shellout/menu'
|
23
|
+
require 'shellout/shadowbox'
|
24
|
+
require 'shellout/table'
|
25
|
+
|
26
|
+
# You can mixin this module to get shortcuts to the various functionality
|
27
|
+
# provided by the classes below this namespace
|
21
28
|
module Shellout
|
22
29
|
|
23
|
-
|
24
|
-
|
25
|
-
|
30
|
+
# See doc for Shellout::Calendar.new
|
31
|
+
def Calendar(*whatever)
|
32
|
+
Shellout::Calendar.new(*whatever)
|
33
|
+
end
|
34
|
+
|
35
|
+
# See doc for Shellout::Shadowbox.new
|
36
|
+
def Shadowbox(*whatever)
|
37
|
+
Shellout::Shadowbox.new(*whatever)
|
38
|
+
end
|
39
|
+
|
40
|
+
# See doc for Shellout::Table.new
|
41
|
+
def Table(*whatever)
|
42
|
+
Shellout::Table.new(*whatever)
|
43
|
+
end
|
44
|
+
|
45
|
+
# See doc for Shellout::Menu.new
|
46
|
+
def Menu(*whatever)
|
47
|
+
Shellout::Menu.new(*whatever)
|
48
|
+
end
|
26
49
|
|
27
50
|
end
|
data/lib/shellout/calendar.rb
CHANGED
@@ -1,94 +1,120 @@
|
|
1
|
+
require 'date'
|
2
|
+
|
1
3
|
module Shellout
|
2
4
|
class Calendar
|
3
5
|
|
4
|
-
def initialize(
|
5
|
-
@
|
6
|
+
def initialize(date=Date.today)
|
7
|
+
@date = date
|
6
8
|
@list_of_days = "Mo Tu We Th Fr Sa Su"
|
7
|
-
reset
|
8
9
|
end
|
9
10
|
|
10
11
|
def print(out=$stdout)
|
11
|
-
@
|
12
|
-
@dates.each do |d|
|
13
|
-
print_calendar(d)
|
14
|
-
unless d == @dates.last # FIXME
|
15
|
-
@col += 24
|
16
|
-
@out.print ansi_cursor_up(@lines) + ansi_cursor_right(@col)
|
17
|
-
@lines = 1
|
18
|
-
end
|
19
|
-
end
|
20
|
-
reset
|
21
|
-
#puts
|
12
|
+
print_helper(out, Array(@date))
|
22
13
|
end
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
def reset
|
27
|
-
@lines = 1
|
28
|
-
@col = 0
|
14
|
+
|
15
|
+
def print3(out=$stdout)
|
16
|
+
print_helper(out, [@date.prev_month, @date, @date.next_month])
|
29
17
|
end
|
30
18
|
|
31
|
-
|
32
|
-
|
33
|
-
|
19
|
+
private
|
20
|
+
|
21
|
+
def print_helper(out, dates)
|
22
|
+
print_headings(out, dates)
|
23
|
+
print_days(out, dates)
|
34
24
|
end
|
35
25
|
|
36
|
-
def
|
37
|
-
|
38
|
-
|
26
|
+
def print_headings(out, dates)
|
27
|
+
print_heading_year(out, dates)
|
28
|
+
print_heading_months(out, dates)
|
29
|
+
print_heading_name_of_days(out, dates)
|
39
30
|
end
|
40
|
-
|
41
|
-
def
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
end
|
31
|
+
|
32
|
+
def print_year_on_a_separate_line?(dates)
|
33
|
+
first_year = dates.first.year
|
34
|
+
same_year = dates.reduce(true) {|res, d| res && d.year == first_year}
|
35
|
+
same_year and dates.length > 1
|
36
|
+
end
|
37
|
+
|
38
|
+
def print_heading_year(out, dates)
|
39
|
+
if print_year_on_a_separate_line?(dates)
|
40
|
+
out.puts dates.first.year.to_s.center((@list_of_days.length + 2) * (dates.length) - 2)
|
51
41
|
end
|
52
|
-
print_week(week) unless week.empty?
|
53
|
-
@out.puts
|
54
42
|
end
|
55
43
|
|
56
|
-
def
|
57
|
-
|
44
|
+
def print_heading_months(out, dates)
|
45
|
+
dates.each do |for_date|
|
46
|
+
head = Date::MONTHNAMES[for_date.month]
|
47
|
+
head += " #{for_date.year}" unless print_year_on_a_separate_line?(dates)
|
48
|
+
out.print head.center(@list_of_days.length)
|
49
|
+
out.print " "
|
50
|
+
end
|
51
|
+
out.puts
|
58
52
|
end
|
59
|
-
|
60
|
-
def
|
61
|
-
|
53
|
+
|
54
|
+
def print_heading_name_of_days(out, dates)
|
55
|
+
dates.each do |for_date|
|
56
|
+
out.print @list_of_days
|
57
|
+
out.print " "
|
58
|
+
end
|
59
|
+
out.puts
|
60
|
+
end
|
61
|
+
|
62
|
+
def print_days(out, dates)
|
63
|
+
# FIXME: UGLY!!!
|
64
|
+
foo = dates.map do |for_date|
|
65
|
+
bar = days(for_date)
|
66
|
+
if is_current_month?(for_date)
|
67
|
+
bar.map! {|d| d == Date.today.day ? ansi_reverse_color(d) : d}
|
68
|
+
end
|
69
|
+
bar
|
70
|
+
end
|
71
|
+
i = 0
|
72
|
+
while true
|
73
|
+
num_done = 0
|
74
|
+
foo.each do |bar|
|
75
|
+
if i >= bar.length
|
76
|
+
num_done += 1
|
77
|
+
else
|
78
|
+
week = bar[i..i+6]
|
79
|
+
week = push_empty_strings_for_missing_week_days(week)
|
80
|
+
out.print week.map {|s| "%2s" % s}.join " "
|
81
|
+
out.print " "
|
82
|
+
end
|
83
|
+
end
|
84
|
+
break if num_done == foo.length
|
85
|
+
i += 7
|
86
|
+
out.puts
|
87
|
+
end
|
62
88
|
end
|
63
89
|
|
64
90
|
def is_current_month?(date)
|
65
91
|
Date.today.month == date.month
|
66
92
|
end
|
67
|
-
|
68
|
-
def
|
69
|
-
|
70
|
-
|
71
|
-
|
93
|
+
|
94
|
+
def days(for_date)
|
95
|
+
days = (1..last_day_of_month(for_date).day).to_a
|
96
|
+
unshift_empty_strings_for_missing_week(days, for_date)
|
97
|
+
end
|
98
|
+
|
99
|
+
def unshift_empty_strings_for_missing_week(days, date)
|
100
|
+
wday = (first_day_of_month(date).wday - 1) % 7
|
101
|
+
Array.new(wday, "") + days
|
72
102
|
end
|
73
103
|
|
74
|
-
def
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
104
|
+
def push_empty_strings_for_missing_week_days(week)
|
105
|
+
week + Array.new(7 - week.length, "")
|
106
|
+
end
|
107
|
+
|
108
|
+
def first_day_of_month(date)
|
109
|
+
Date.new(date.year, date.month)
|
80
110
|
end
|
81
111
|
|
82
|
-
def last_day_of_month(
|
83
|
-
first_day_of_month.next_month-1
|
112
|
+
def last_day_of_month(date)
|
113
|
+
first_day_of_month(date).next_month-1
|
84
114
|
end
|
85
115
|
|
86
116
|
def ansi_reverse_color(s); "\e[7m#{s}\e[0m"; end
|
87
117
|
|
88
|
-
def ansi_cursor_up(n); "\e[#{n}A"; end
|
89
|
-
def ansi_cursor_down(n); "\e[#{n}B"; end
|
90
|
-
def ansi_cursor_left(n); "\e[#{n}D"; end
|
91
|
-
def ansi_cursor_right(n); "\e[#{n}C"; end
|
92
118
|
|
93
119
|
end
|
94
120
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Shellout
|
2
|
+
class Menu
|
3
|
+
|
4
|
+
def initialize(items)
|
5
|
+
@items = items
|
6
|
+
end
|
7
|
+
|
8
|
+
def padding; 1; end
|
9
|
+
|
10
|
+
def print(out=$stdout)
|
11
|
+
format = menu_item_format
|
12
|
+
@items.each_with_index do |item, i|
|
13
|
+
out.printf format, i+1, item
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def menu_item_format
|
20
|
+
return if @items.empty?
|
21
|
+
max_digits = Math.log10(@items.length).floor + padding
|
22
|
+
" %#{max_digits}d. %s\n"
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
data/lib/shellout/version.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'date'
|
2
2
|
require 'stringio'
|
3
|
-
require 'shellout
|
3
|
+
require 'shellout'
|
4
4
|
|
5
5
|
class Date
|
6
6
|
def self.today
|
@@ -10,15 +10,34 @@ end
|
|
10
10
|
|
11
11
|
describe Shellout::Calendar do
|
12
12
|
|
13
|
+
include Shellout
|
14
|
+
|
13
15
|
before(:each) do
|
14
16
|
@out = StringIO.new
|
15
17
|
end
|
16
18
|
|
17
|
-
describe '
|
19
|
+
describe 'print' do
|
20
|
+
|
18
21
|
it 'should print a calendar for the given month' do
|
19
|
-
|
20
|
-
@out.string.
|
21
|
-
|
22
|
+
Calendar(Date.new(2011, 7)).print(@out)
|
23
|
+
res = @out.string.gsub(/\s+\n/, "\n")
|
24
|
+
res.should == <<EOC
|
25
|
+
July 2011
|
26
|
+
Mo Tu We Th Fr Sa Su
|
27
|
+
1 2 3
|
28
|
+
4 5 6 7 8 9 10
|
29
|
+
11 12 13 14 15 16 17
|
30
|
+
18 19 20 21 22 23 24
|
31
|
+
25 26 27 28 29 30 31
|
32
|
+
EOC
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'should print a calendar for this month when no date given' do
|
37
|
+
Calendar().print(@out)
|
38
|
+
res = @out.string.gsub(/\s+\n/, "\n")
|
39
|
+
res.should == <<EOC
|
40
|
+
October 2011
|
22
41
|
Mo Tu We Th Fr Sa Su
|
23
42
|
1 2
|
24
43
|
3 4 5 6 7 8 9
|
@@ -26,35 +45,38 @@ Mo Tu We Th Fr Sa Su
|
|
26
45
|
17 18 19 20 21 22 23
|
27
46
|
24 25 26 27 28 29 \e[7m30\e[0m
|
28
47
|
31
|
29
|
-
|
30
48
|
EOC
|
31
49
|
end
|
32
|
-
end
|
33
50
|
|
34
|
-
describe '
|
35
|
-
it 'should print
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
51
|
+
describe 'print3' do
|
52
|
+
it 'should print the months before, at given, and after. Year on a separate line' do
|
53
|
+
Calendar(Date.new(2011, 8)).print3(@out)
|
54
|
+
res = @out.string.gsub(/\s+\n/, "\n")
|
55
|
+
res.should == <<EOC
|
56
|
+
2011
|
57
|
+
July August September
|
58
|
+
Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
|
59
|
+
1 2 3 1 2 3 4 5 6 7 1 2 3 4
|
60
|
+
4 5 6 7 8 9 10 8 9 10 11 12 13 14 5 6 7 8 9 10 11
|
61
|
+
11 12 13 14 15 16 17 15 16 17 18 19 20 21 12 13 14 15 16 17 18
|
62
|
+
18 19 20 21 22 23 24 22 23 24 25 26 27 28 19 20 21 22 23 24 25
|
63
|
+
25 26 27 28 29 30 31 29 30 31 26 27 28 29 30
|
64
|
+
EOC
|
65
|
+
end
|
45
66
|
|
46
|
-
|
47
|
-
|
67
|
+
it 'Should print year together with month names when not same year' do
|
68
|
+
Calendar(Date.new(2011, 12)).print3(@out)
|
69
|
+
res = @out.string.gsub(/\s+\n/, "\n")
|
70
|
+
res.should == <<EOC
|
71
|
+
November 2011 December 2011 January 2012
|
72
|
+
Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
|
73
|
+
1 2 3 4 5 6 1 2 3 4 1
|
74
|
+
7 8 9 10 11 12 13 5 6 7 8 9 10 11 2 3 4 5 6 7 8
|
75
|
+
14 15 16 17 18 19 20 12 13 14 15 16 17 18 9 10 11 12 13 14 15
|
76
|
+
21 22 23 24 25 26 27 19 20 21 22 23 24 25 16 17 18 19 20 21 22
|
77
|
+
28 29 30 26 27 28 29 30 31 23 24 25 26 27 28 29
|
78
|
+
30 31
|
48
79
|
EOC
|
49
|
-
# July 2011 August 2011 September 2011
|
50
|
-
# Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
|
51
|
-
# 1 2 3 1 2 3 4 5 6 7 1 2 3 4
|
52
|
-
# 4 5 6 7 8 9 10 8 9 10 11 12 13 14 5 6 7 8 9 10 11
|
53
|
-
# 11 12 13 14 15 16 17 15 16 17 18 19 20 21 12 13 14 15 16 17 18
|
54
|
-
# 18 19 20 21 22 23 24 22 23 24 25 26 27 28 19 20 21 22 23 24 25
|
55
|
-
# 25 26 27 28 29 30 31 29 30 31 26 27 28 29 30
|
56
|
-
#
|
57
|
-
@out.string.inspect.should == exp.inspect # using inspect to help debugging
|
58
80
|
end
|
59
81
|
end
|
60
82
|
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'stringio'
|
2
|
+
require 'shellout'
|
3
|
+
|
4
|
+
describe Shellout::Menu do
|
5
|
+
|
6
|
+
include Shellout
|
7
|
+
|
8
|
+
before(:each) do
|
9
|
+
@out = StringIO.new
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should work for a basic example" do
|
13
|
+
Menu(%w(a b c)).print(@out)
|
14
|
+
@out.string.should == <<EOT
|
15
|
+
1. a
|
16
|
+
2. b
|
17
|
+
3. c
|
18
|
+
EOT
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should print nothing when no items are given" do
|
22
|
+
Menu([]).print(@out)
|
23
|
+
@out.string.should == ''
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should right justify the menu item number" do
|
27
|
+
Menu(('a'..'j').to_a).print(@out)
|
28
|
+
@out.string.should == <<EOT
|
29
|
+
1. a
|
30
|
+
2. b
|
31
|
+
3. c
|
32
|
+
4. d
|
33
|
+
5. e
|
34
|
+
6. f
|
35
|
+
7. g
|
36
|
+
8. h
|
37
|
+
9. i
|
38
|
+
10. j
|
39
|
+
EOT
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
end
|
@@ -1,17 +1,19 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
3
|
require 'stringio'
|
4
|
-
require 'shellout
|
4
|
+
require 'shellout'
|
5
5
|
|
6
6
|
describe Shellout::Shadowbox do
|
7
7
|
|
8
|
+
include Shellout
|
9
|
+
|
8
10
|
before(:each) do
|
9
11
|
@out = StringIO.new
|
10
12
|
end
|
11
13
|
|
12
14
|
describe 'when title is empty' do
|
13
15
|
it 'should print an empty box' do
|
14
|
-
@box =
|
16
|
+
@box = Shadowbox('')
|
15
17
|
x = <<EOB
|
16
18
|
┌──────────────────────────────────────────┐
|
17
19
|
│ │▒
|
@@ -25,7 +27,7 @@ EOB
|
|
25
27
|
|
26
28
|
describe 'when a short title is given' do
|
27
29
|
it 'should print a padded box with centered title' do
|
28
|
-
@box =
|
30
|
+
@box = Shadowbox('short')
|
29
31
|
x = <<EOB
|
30
32
|
┌──────────────────────────────────────────┐
|
31
33
|
│ short │▒
|
@@ -39,7 +41,7 @@ EOB
|
|
39
41
|
|
40
42
|
describe 'when a long title is given' do
|
41
43
|
it 'should print a box that is big enough' do
|
42
|
-
@box =
|
44
|
+
@box = Shadowbox('a very extremely humongously large meaningless title')
|
43
45
|
x = <<EOB
|
44
46
|
┌──────────────────────────────────────────────────────┐
|
45
47
|
│ a very extremely humongously large meaningless title │▒
|
data/spec/shellout/table_spec.rb
CHANGED
@@ -1,24 +1,26 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
3
|
require 'stringio'
|
4
|
-
require 'shellout
|
4
|
+
require 'shellout'
|
5
5
|
|
6
6
|
describe Shellout::Table do
|
7
7
|
|
8
|
+
include Shellout
|
9
|
+
|
8
10
|
before(:each) do
|
9
11
|
@out = StringIO.new
|
10
12
|
end
|
11
13
|
|
12
14
|
describe 'when no parameters' do
|
13
15
|
it 'should not print anything' do
|
14
|
-
|
16
|
+
Table().print(@out)
|
15
17
|
@out.string.should == ''
|
16
18
|
end
|
17
19
|
end
|
18
20
|
|
19
|
-
describe 'table
|
21
|
+
describe 'when table consists of only a single data row' do
|
20
22
|
it 'should print a single row table' do
|
21
|
-
|
23
|
+
Table(rows: [%w{a b c}]).print(@out)
|
22
24
|
@out.string.should == <<'EOT'
|
23
25
|
┌───┬───┬───┐
|
24
26
|
│ a │ b │ c │
|
@@ -29,7 +31,7 @@ EOT
|
|
29
31
|
|
30
32
|
describe 'when only given headers' do
|
31
33
|
it 'should print headers and one empty row' do
|
32
|
-
|
34
|
+
Table(headers: %w{a b c}).print(@out)
|
33
35
|
@out.string.should == <<'EOT'
|
34
36
|
┌───┬───┬───┐
|
35
37
|
│ a │ b │ c │
|
@@ -41,7 +43,7 @@ EOT
|
|
41
43
|
|
42
44
|
describe 'when all parameters are defined' do
|
43
45
|
it 'should print a nice table' do
|
44
|
-
|
46
|
+
Table(headers: %w{a b c}, rows: [%w{d e f}, %w{g h i}], footers: %w{j k l}).print(@out)
|
45
47
|
@out.string.should == <<'EOT'
|
46
48
|
┌───┬───┬───┐
|
47
49
|
│ a │ b │ c │
|
@@ -56,12 +58,12 @@ EOT
|
|
56
58
|
end
|
57
59
|
|
58
60
|
it 'should center headers' do
|
59
|
-
|
61
|
+
Table(headers: %w{a b c}, rows: [%w{123 456 789}]).print(@out)
|
60
62
|
@out.string.each_line.to_a[1].should == "│ a │ b │ c │\n"
|
61
63
|
end
|
62
64
|
|
63
65
|
it 'should_right_justify_numbers' do
|
64
|
-
|
66
|
+
Table(headers: %w{aaaa bb ccc}, rows: [%w{123 4 56}]).print(@out)
|
65
67
|
@out.string.should == <<'EOT'
|
66
68
|
┌──────┬────┬─────┐
|
67
69
|
│ aaaa │ bb │ ccc │
|
@@ -72,7 +74,7 @@ EOT
|
|
72
74
|
end
|
73
75
|
|
74
76
|
it 'should handle an example with some "real" data' do
|
75
|
-
|
77
|
+
Table(
|
76
78
|
headers: %w{project code hours price},
|
77
79
|
rows: [%w{nice_project_1 a 7:30 100.00}, %w{nice_project_2 b 7:30 87.50}],
|
78
80
|
footers: %w{Sum - 15:00 187.50},
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: shellout
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.4'
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-
|
12
|
+
date: 2011-12-03 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
16
|
-
requirement: &
|
16
|
+
requirement: &70362130786780 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70362130786780
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: guard
|
27
|
-
requirement: &
|
27
|
+
requirement: &70362130786200 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70362130786200
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: guard-rspec
|
38
|
-
requirement: &
|
38
|
+
requirement: &70362130784620 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,7 +43,29 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70362130784620
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: rb-fsevent
|
49
|
+
requirement: &70362130784160 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
type: :development
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: *70362130784160
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: growl_notify
|
60
|
+
requirement: &70362130783520 !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ! '>='
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '0'
|
66
|
+
type: :development
|
67
|
+
prerelease: false
|
68
|
+
version_requirements: *70362130783520
|
47
69
|
description: Contains classes for printing tables and boxes
|
48
70
|
email:
|
49
71
|
- kjellm@acm.org
|
@@ -59,14 +81,15 @@ files:
|
|
59
81
|
- Rakefile
|
60
82
|
- lib/shellout.rb
|
61
83
|
- lib/shellout/calendar.rb
|
84
|
+
- lib/shellout/menu.rb
|
62
85
|
- lib/shellout/shadowbox.rb
|
63
86
|
- lib/shellout/table.rb
|
64
87
|
- lib/shellout/version.rb
|
65
88
|
- shellout.gemspec
|
66
89
|
- spec/shellout/calendar_spec.rb
|
90
|
+
- spec/shellout/menu_spec.rb
|
67
91
|
- spec/shellout/shadowbox_spec.rb
|
68
92
|
- spec/shellout/table_spec.rb
|
69
|
-
- spec/shellout_spec.rb
|
70
93
|
homepage: https://github.com/kjellm/shellout
|
71
94
|
licenses:
|
72
95
|
- MIT
|
@@ -94,7 +117,6 @@ specification_version: 3
|
|
94
117
|
summary: Tools for writing terminal interfaces
|
95
118
|
test_files:
|
96
119
|
- spec/shellout/calendar_spec.rb
|
120
|
+
- spec/shellout/menu_spec.rb
|
97
121
|
- spec/shellout/shadowbox_spec.rb
|
98
122
|
- spec/shellout/table_spec.rb
|
99
|
-
- spec/shellout_spec.rb
|
100
|
-
has_rdoc:
|
data/spec/shellout_spec.rb
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
require 'shellout'
|
4
|
-
|
5
|
-
describe Shellout do
|
6
|
-
|
7
|
-
it 'should auto load shellout/shadowbox' do
|
8
|
-
(Shellout.const_defined? :Shadowbox).should be_true
|
9
|
-
end
|
10
|
-
|
11
|
-
it 'should auto load shellout/table' do
|
12
|
-
(Shellout.const_defined? :Table).should be_true
|
13
|
-
end
|
14
|
-
|
15
|
-
end
|