nyan-cat-formatter 0.5.2 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +5 -0
- data/README.md +1 -1
- data/gemfiles/rspec1 +9 -0
- data/gemfiles/rspec2 +7 -0
- data/lib/nyan_cat_formatter.rb +11 -214
- data/lib/nyan_cat_formatter/common.rb +213 -0
- data/lib/nyan_cat_formatter/rspec1.rb +2 -1
- data/lib/nyan_cat_formatter/rspec2.rb +2 -1
- data/lib/nyan_cat_formatter/rspec3.rb +69 -0
- data/nyan-cat-formatter.gemspec +2 -2
- data/spec/nyan_cat_formatter_spec.rb +38 -35
- data/spec/nyan_cat_music_formatter_spec.rb +14 -10
- data/spec/nyan_cat_wide_formatter_spec.rb +6 -6
- metadata +21 -4
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -7,7 +7,7 @@ This is my take on the Nyan Cat RSpec Formatter. It simply creates a rainbow tra
|
|
7
7
|
|
8
8
|
The rainbow changes colors as it runs. See it in action [here](http://vimeo.com/32424001).
|
9
9
|
|
10
|
-
Works with RSpec 1.3 and
|
10
|
+
Works with RSpec 1.3, 2 and 3.
|
11
11
|
|
12
12
|
Using Nyan Cat
|
13
13
|
---------------
|
data/gemfiles/rspec1
ADDED
data/gemfiles/rspec2
ADDED
data/lib/nyan_cat_formatter.rb
CHANGED
@@ -1,223 +1,20 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
|
3
|
+
require 'nyan_cat_formatter/common'
|
4
|
+
|
3
5
|
rspec_bin = $0.split('/').last
|
4
6
|
if rspec_bin == 'spec'
|
5
7
|
['spec', 'nyan_cat_formatter/rspec1', 'spec/runner/formatter/base_text_formatter'].each {|f| require f}
|
6
|
-
|
7
|
-
rspec_module = RSpec1
|
8
|
+
formatter = RSpec1
|
8
9
|
else
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
ESC = "\e["
|
17
|
-
NND = "#{ESC}0m"
|
18
|
-
PASS = '='
|
19
|
-
PASS_ARY = ['-', '_']
|
20
|
-
FAIL = '*'
|
21
|
-
ERROR = '!'
|
22
|
-
PENDING = '+'
|
23
|
-
|
24
|
-
include rspec_module
|
25
|
-
|
26
|
-
attr_reader :current, :example_results, :color_index, :pending_count,
|
27
|
-
:failure_count, :example_count
|
28
|
-
|
29
|
-
# Increments the example count and displays the current progress
|
30
|
-
#
|
31
|
-
# @returns nothing
|
32
|
-
def tick(mark = PASS)
|
33
|
-
@example_results << mark
|
34
|
-
@current = (@current > @example_count) ? @example_count : @current + 1
|
35
|
-
dump_progress
|
36
|
-
end
|
37
|
-
|
38
|
-
# Determine which Ascii Nyan Cat to display. If tests are complete,
|
39
|
-
# Nyan Cat goes to sleep. If there are failing or pending examples,
|
40
|
-
# Nyan Cat is concerned.
|
41
|
-
#
|
42
|
-
# @return [String] Nyan Cat
|
43
|
-
def nyan_cat
|
44
|
-
if self.failed_or_pending? && self.finished?
|
45
|
-
ascii_cat('x')[@color_index%2].join("\n") #'~|_(x.x)'
|
46
|
-
elsif self.failed_or_pending?
|
47
|
-
ascii_cat('o')[@color_index%2].join("\n") #'~|_(o.o)'
|
48
|
-
elsif self.finished?
|
49
|
-
ascii_cat('-')[@color_index%2].join("\n") # '~|_(-.-)'
|
50
|
-
else
|
51
|
-
ascii_cat('^')[@color_index%2].join("\n") # '~|_(^.^)'
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
# Displays the current progress in all Nyan Cat glory
|
56
|
-
#
|
57
|
-
# @return nothing
|
58
|
-
def dump_progress
|
59
|
-
padding = @example_count.to_s.length * 2 + 2
|
60
|
-
line = nyan_trail.split("\n").each_with_index.inject([]) do |result, (trail, index)|
|
61
|
-
value = "#{scoreboard[index]}/#{@example_count}:"
|
62
|
-
result << format("%s %s", value, trail)
|
63
|
-
end.join("\n")
|
64
|
-
output.print line + eol
|
65
|
-
end
|
66
|
-
|
67
|
-
# Determines how we end the trail line. If complete, return a newline etc.
|
68
|
-
#
|
69
|
-
# @return [String]
|
70
|
-
def eol
|
71
|
-
return "\n" if @current == @example_count
|
72
|
-
length = (nyan_cat.split("\n").length - 1)
|
73
|
-
length > 0 ? format("\e[1A" * length + "\r") : "\r"
|
74
|
-
end
|
75
|
-
|
76
|
-
# Calculates the current flight length
|
77
|
-
#
|
78
|
-
# @return [Fixnum]
|
79
|
-
def current_width
|
80
|
-
padding_width + example_width + cat_length
|
81
|
-
end
|
82
|
-
|
83
|
-
# Gets the padding for the current example count
|
84
|
-
#
|
85
|
-
# @return [Fixnum]
|
86
|
-
def padding_width
|
87
|
-
@example_count.to_s.length * 2 + 6
|
88
|
-
end
|
89
|
-
|
90
|
-
# A Unix trick using stty to get the console columns
|
91
|
-
#
|
92
|
-
# @return [Fixnum]
|
93
|
-
def terminal_width
|
94
|
-
if defined? JRUBY_VERSION
|
95
|
-
default_width = 80
|
96
|
-
else
|
97
|
-
default_width = `stty size`.split.map { |x| x.to_i }.reverse.first - 1
|
98
|
-
end
|
99
|
-
@terminal_width ||= default_width
|
100
|
-
end
|
101
|
-
|
102
|
-
# Creates a data store of pass, failed, and pending example results
|
103
|
-
# We have to pad the results here because sprintf can't properly pad color
|
104
|
-
#
|
105
|
-
# @return [Array]
|
106
|
-
def scoreboard
|
107
|
-
@pending_examples ||= []
|
108
|
-
@failed_examples ||= []
|
109
|
-
padding = @example_count.to_s.length
|
110
|
-
[ @current.to_s.rjust(padding),
|
111
|
-
success_color((@current - @pending_examples.size - @failed_examples.size).to_s.rjust(padding)),
|
112
|
-
pending_color(@pending_examples.size.to_s.rjust(padding)),
|
113
|
-
failure_color(@failed_examples.size.to_s.rjust(padding)) ]
|
114
|
-
end
|
115
|
-
|
116
|
-
# Creates a rainbow trail
|
117
|
-
#
|
118
|
-
# @return [String] the sprintf format of the Nyan cat
|
119
|
-
def nyan_trail
|
120
|
-
marks = @example_results.each_with_index.map{ |mark, i| highlight(mark) * example_width(i) }
|
121
|
-
marks.shift(current_width - terminal_width) if current_width >= terminal_width
|
122
|
-
nyan_cat_lines = nyan_cat.split("\n").each_with_index.map do |line, index|
|
123
|
-
format("%s#{line}", marks.join)
|
124
|
-
end.join("\n")
|
10
|
+
require 'rspec/core/formatters/base_text_formatter'
|
11
|
+
if Gem::Version.new(RSpec::Core::Version::STRING).release >= Gem::Version.new('3.0.0')
|
12
|
+
require 'nyan_cat_formatter/rspec3'
|
13
|
+
formatter = RSpec3
|
14
|
+
else
|
15
|
+
require 'nyan_cat_formatter/rspec2'
|
16
|
+
formatter = RSpec2
|
125
17
|
end
|
126
|
-
|
127
|
-
# Times a mark has to be repeated
|
128
|
-
def example_width(item = 1)
|
129
|
-
1
|
130
|
-
end
|
131
|
-
|
132
|
-
# Ascii version of Nyan cat. Two cats in the array allow Nyan to animate running.
|
133
|
-
#
|
134
|
-
# @param o [String] Nyan's eye
|
135
|
-
# @return [Array] Nyan cats
|
136
|
-
def ascii_cat(o = '^')
|
137
|
-
[[ "_,------, ",
|
138
|
-
"_| /\\_/\\ ",
|
139
|
-
"~|_( #{o} .#{o}) ",
|
140
|
-
" \"\" \"\" "
|
141
|
-
],
|
142
|
-
[ "_,------, ",
|
143
|
-
"_| /\\_/\\",
|
144
|
-
"^|__( #{o} .#{o}) ",
|
145
|
-
" \" \" \" \""
|
146
|
-
]]
|
147
|
-
end
|
148
|
-
|
149
|
-
# Colorizes the string with raindow colors of the rainbow
|
150
|
-
#
|
151
|
-
# @params string [String]
|
152
|
-
# @return [String]
|
153
|
-
def rainbowify(string)
|
154
|
-
c = colors[@color_index % colors.size]
|
155
|
-
@color_index += 1
|
156
|
-
"#{ESC}38;5;#{c}m#{string}#{NND}"
|
157
|
-
end
|
158
|
-
|
159
|
-
# Calculates the colors of the rainbow
|
160
|
-
#
|
161
|
-
# @return [Array]
|
162
|
-
def colors
|
163
|
-
@colors ||= (0...(6 * 7)).map do |n|
|
164
|
-
pi_3 = Math::PI / 3
|
165
|
-
n *= 1.0 / 6
|
166
|
-
r = (3 * Math.sin(n ) + 3).to_i
|
167
|
-
g = (3 * Math.sin(n + 2 * pi_3) + 3).to_i
|
168
|
-
b = (3 * Math.sin(n + 4 * pi_3) + 3).to_i
|
169
|
-
36 * r + 6 * g + b + 16
|
170
|
-
end
|
171
|
-
end
|
172
|
-
|
173
|
-
# Determines how to color the example. If pass, it is rainbowified, otherwise
|
174
|
-
# we assign red if failed or yellow if an error occurred.
|
175
|
-
#
|
176
|
-
# @return [String]
|
177
|
-
def highlight(mark = PASS)
|
178
|
-
case mark
|
179
|
-
when PASS; rainbowify PASS_ARY[@color_index%2]
|
180
|
-
when FAIL; "\e[31m#{mark}\e[0m"
|
181
|
-
when ERROR; "\e[33m#{mark}\e[0m"
|
182
|
-
when PENDING; "\e[33m#{mark}\e[0m"
|
183
|
-
else mark
|
184
|
-
end
|
185
|
-
end
|
186
|
-
|
187
|
-
# Converts a float of seconds into a minutes/seconds string
|
188
|
-
#
|
189
|
-
# @return [String]
|
190
|
-
def format_duration(duration)
|
191
|
-
seconds = ((duration % 60) * 100.0).round / 100.0 # 1.8.7 safe .round(2)
|
192
|
-
seconds = seconds.to_i if seconds.to_i == seconds # drop that zero if it's not needed
|
193
|
-
|
194
|
-
message = "#{seconds} second#{seconds == 1 ? "" : "s"}"
|
195
|
-
message = "#{(duration / 60).to_i} minute#{(duration / 60).to_i == 1 ? "" : "s"} and " + message if duration >= 60
|
196
|
-
|
197
|
-
message
|
198
|
-
end
|
199
|
-
|
200
|
-
|
201
|
-
# Determines if the specs have completed
|
202
|
-
#
|
203
|
-
# @returns [Boolean] true if finished; false otherwise
|
204
|
-
def finished?
|
205
|
-
(@current == @example_count)
|
206
|
-
end
|
207
|
-
|
208
|
-
# Determines if the any specs failed or are in pending state
|
209
|
-
#
|
210
|
-
# @returns [Boolean] true if failed or pending; false otherwise
|
211
|
-
def failed_or_pending?
|
212
|
-
(@failure_count.to_i > 0 || @pending_count.to_i > 0)
|
213
|
-
end
|
214
|
-
|
215
|
-
# Returns the cat length
|
216
|
-
#
|
217
|
-
# @returns [Fixnum]
|
218
|
-
def cat_length
|
219
|
-
nyan_cat.split("\n").group_by(&:size).max.first
|
220
|
-
end
|
221
|
-
|
222
18
|
end
|
223
19
|
|
20
|
+
NyanCatFormatter = formatter
|
@@ -0,0 +1,213 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
module NyanCat
|
3
|
+
module Common
|
4
|
+
ESC = "\e["
|
5
|
+
NND = "#{ESC}0m"
|
6
|
+
PASS = '='
|
7
|
+
PASS_ARY = ['-', '_']
|
8
|
+
FAIL = '*'
|
9
|
+
ERROR = '!'
|
10
|
+
PENDING = '+'
|
11
|
+
|
12
|
+
def self.included(base)
|
13
|
+
base.class_eval do
|
14
|
+
attr_reader :current, :example_results, :color_index, :pending_count, :failure_count,
|
15
|
+
:example_count
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
# Increments the example count and displays the current progress
|
20
|
+
#
|
21
|
+
# @returns nothing
|
22
|
+
def tick(mark = PASS)
|
23
|
+
@example_results << mark
|
24
|
+
@current = (@current > @example_count) ? @example_count : @current + 1
|
25
|
+
dump_progress
|
26
|
+
end
|
27
|
+
|
28
|
+
# Determine which Ascii Nyan Cat to display. If tests are complete,
|
29
|
+
# Nyan Cat goes to sleep. If there are failing or pending examples,
|
30
|
+
# Nyan Cat is concerned.
|
31
|
+
#
|
32
|
+
# @return [String] Nyan Cat
|
33
|
+
def nyan_cat
|
34
|
+
if self.failed_or_pending? && self.finished?
|
35
|
+
ascii_cat('x')[@color_index%2].join("\n") #'~|_(x.x)'
|
36
|
+
elsif self.failed_or_pending?
|
37
|
+
ascii_cat('o')[@color_index%2].join("\n") #'~|_(o.o)'
|
38
|
+
elsif self.finished?
|
39
|
+
ascii_cat('-')[@color_index%2].join("\n") # '~|_(-.-)'
|
40
|
+
else
|
41
|
+
ascii_cat('^')[@color_index%2].join("\n") # '~|_(^.^)'
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# Displays the current progress in all Nyan Cat glory
|
46
|
+
#
|
47
|
+
# @return nothing
|
48
|
+
def dump_progress
|
49
|
+
padding = @example_count.to_s.length * 2 + 2
|
50
|
+
line = nyan_trail.split("\n").each_with_index.inject([]) do |result, (trail, index)|
|
51
|
+
value = "#{scoreboard[index]}/#{@example_count}:"
|
52
|
+
result << format("%s %s", value, trail)
|
53
|
+
end.join("\n")
|
54
|
+
output.print line + eol
|
55
|
+
end
|
56
|
+
|
57
|
+
# Determines how we end the trail line. If complete, return a newline etc.
|
58
|
+
#
|
59
|
+
# @return [String]
|
60
|
+
def eol
|
61
|
+
return "\n" if @current == @example_count
|
62
|
+
length = (nyan_cat.split("\n").length - 1)
|
63
|
+
length > 0 ? format("\e[1A" * length + "\r") : "\r"
|
64
|
+
end
|
65
|
+
|
66
|
+
# Calculates the current flight length
|
67
|
+
#
|
68
|
+
# @return [Fixnum]
|
69
|
+
def current_width
|
70
|
+
# padding_width + example_width + cat_length
|
71
|
+
padding_width + (@current * example_width) + cat_length
|
72
|
+
end
|
73
|
+
|
74
|
+
# Gets the padding for the current example count
|
75
|
+
#
|
76
|
+
# @return [Fixnum]
|
77
|
+
def padding_width
|
78
|
+
@example_count.to_s.length * 2 + 6
|
79
|
+
end
|
80
|
+
|
81
|
+
# A Unix trick using stty to get the console columns
|
82
|
+
#
|
83
|
+
# @return [Fixnum]
|
84
|
+
def terminal_width
|
85
|
+
if defined? JRUBY_VERSION
|
86
|
+
default_width = 80
|
87
|
+
else
|
88
|
+
default_width = `stty size`.split.map { |x| x.to_i }.reverse.first - 1
|
89
|
+
end
|
90
|
+
@terminal_width ||= default_width
|
91
|
+
end
|
92
|
+
|
93
|
+
# Creates a data store of pass, failed, and pending example results
|
94
|
+
# We have to pad the results here because sprintf can't properly pad color
|
95
|
+
#
|
96
|
+
# @return [Array]
|
97
|
+
def scoreboard
|
98
|
+
@pending_examples ||= []
|
99
|
+
@failed_examples ||= []
|
100
|
+
padding = @example_count.to_s.length
|
101
|
+
[ @current.to_s.rjust(padding),
|
102
|
+
success_color((@current - @pending_examples.size - @failed_examples.size).to_s.rjust(padding)),
|
103
|
+
pending_color(@pending_examples.size.to_s.rjust(padding)),
|
104
|
+
failure_color(@failed_examples.size.to_s.rjust(padding)) ]
|
105
|
+
end
|
106
|
+
|
107
|
+
# Creates a rainbow trail
|
108
|
+
#
|
109
|
+
# @return [String] the sprintf format of the Nyan cat
|
110
|
+
def nyan_trail
|
111
|
+
marks = @example_results.each_with_index.map{ |mark, i| highlight(mark) * example_width(i) }
|
112
|
+
marks.shift(current_width - terminal_width) if current_width >= terminal_width
|
113
|
+
nyan_cat_lines = nyan_cat.split("\n").each_with_index.map do |line, index|
|
114
|
+
format("%s#{line}", marks.join)
|
115
|
+
end.join("\n")
|
116
|
+
end
|
117
|
+
|
118
|
+
# Times a mark has to be repeated
|
119
|
+
def example_width(item = 1)
|
120
|
+
1
|
121
|
+
end
|
122
|
+
|
123
|
+
# Ascii version of Nyan cat. Two cats in the array allow Nyan to animate running.
|
124
|
+
#
|
125
|
+
# @param o [String] Nyan's eye
|
126
|
+
# @return [Array] Nyan cats
|
127
|
+
def ascii_cat(o = '^')
|
128
|
+
[[ "_,------, ",
|
129
|
+
"_| /\\_/\\ ",
|
130
|
+
"~|_( #{o} .#{o}) ",
|
131
|
+
" \"\" \"\" "
|
132
|
+
],
|
133
|
+
[ "_,------, ",
|
134
|
+
"_| /\\_/\\",
|
135
|
+
"^|__( #{o} .#{o}) ",
|
136
|
+
" \" \" \" \""
|
137
|
+
]]
|
138
|
+
end
|
139
|
+
|
140
|
+
# Colorizes the string with raindow colors of the rainbow
|
141
|
+
#
|
142
|
+
# @params string [String]
|
143
|
+
# @return [String]
|
144
|
+
def rainbowify(string)
|
145
|
+
c = colors[@color_index % colors.size]
|
146
|
+
@color_index += 1
|
147
|
+
"#{ESC}38;5;#{c}m#{string}#{NND}"
|
148
|
+
end
|
149
|
+
|
150
|
+
# Calculates the colors of the rainbow
|
151
|
+
#
|
152
|
+
# @return [Array]
|
153
|
+
def colors
|
154
|
+
@colors ||= (0...(6 * 7)).map do |n|
|
155
|
+
pi_3 = Math::PI / 3
|
156
|
+
n *= 1.0 / 6
|
157
|
+
r = (3 * Math.sin(n ) + 3).to_i
|
158
|
+
g = (3 * Math.sin(n + 2 * pi_3) + 3).to_i
|
159
|
+
b = (3 * Math.sin(n + 4 * pi_3) + 3).to_i
|
160
|
+
36 * r + 6 * g + b + 16
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
# Determines how to color the example. If pass, it is rainbowified, otherwise
|
165
|
+
# we assign red if failed or yellow if an error occurred.
|
166
|
+
#
|
167
|
+
# @return [String]
|
168
|
+
def highlight(mark = PASS)
|
169
|
+
case mark
|
170
|
+
when PASS; rainbowify PASS_ARY[@color_index%2]
|
171
|
+
when FAIL; "\e[31m#{mark}\e[0m"
|
172
|
+
when ERROR; "\e[33m#{mark}\e[0m"
|
173
|
+
when PENDING; "\e[33m#{mark}\e[0m"
|
174
|
+
else mark
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
# Converts a float of seconds into a minutes/seconds string
|
179
|
+
#
|
180
|
+
# @return [String]
|
181
|
+
def format_duration(duration)
|
182
|
+
seconds = ((duration % 60) * 100.0).round / 100.0 # 1.8.7 safe .round(2)
|
183
|
+
seconds = seconds.to_i if seconds.to_i == seconds # drop that zero if it's not needed
|
184
|
+
|
185
|
+
message = "#{seconds} second#{seconds == 1 ? "" : "s"}"
|
186
|
+
message = "#{(duration / 60).to_i} minute#{(duration / 60).to_i == 1 ? "" : "s"} and " + message if duration >= 60
|
187
|
+
|
188
|
+
message
|
189
|
+
end
|
190
|
+
|
191
|
+
|
192
|
+
# Determines if the specs have completed
|
193
|
+
#
|
194
|
+
# @returns [Boolean] true if finished; false otherwise
|
195
|
+
def finished?
|
196
|
+
(@current == @example_count)
|
197
|
+
end
|
198
|
+
|
199
|
+
# Determines if the any specs failed or are in pending state
|
200
|
+
#
|
201
|
+
# @returns [Boolean] true if failed or pending; false otherwise
|
202
|
+
def failed_or_pending?
|
203
|
+
(@failure_count.to_i > 0 || @pending_count.to_i > 0)
|
204
|
+
end
|
205
|
+
|
206
|
+
# Returns the cat length
|
207
|
+
#
|
208
|
+
# @returns [Fixnum]
|
209
|
+
def cat_length
|
210
|
+
nyan_cat.split("\n").group_by(&:size).max.first
|
211
|
+
end
|
212
|
+
end
|
213
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require "rspec/core/formatters/base_text_formatter"
|
2
|
+
require 'ostruct'
|
3
|
+
|
4
|
+
class RSpec3 < RSpec::Core::Formatters::BaseTextFormatter
|
5
|
+
include NyanCat::Common
|
6
|
+
|
7
|
+
RSpec::Core::Formatters.register self, :example_passed, :example_pending,
|
8
|
+
:example_failed, :start_dump, :start
|
9
|
+
|
10
|
+
def initialize(output)
|
11
|
+
super(output)
|
12
|
+
end
|
13
|
+
|
14
|
+
def start(notification)
|
15
|
+
# TODO: Lazy fix for specs.
|
16
|
+
if notification.kind_of?(Fixnum)
|
17
|
+
super(OpenStruct.new(:count => notification))
|
18
|
+
else
|
19
|
+
super(notification)
|
20
|
+
end
|
21
|
+
|
22
|
+
@current = @color_index = @passing_count = 0
|
23
|
+
@example_results = []
|
24
|
+
end
|
25
|
+
|
26
|
+
def example_passed(notification)
|
27
|
+
tick PASS
|
28
|
+
end
|
29
|
+
|
30
|
+
def example_pending(notification)
|
31
|
+
if notification.respond_to?(:example)
|
32
|
+
super(notification)
|
33
|
+
else
|
34
|
+
super(OpenStruct.new(:example => notification))
|
35
|
+
end
|
36
|
+
|
37
|
+
@pending_count += 1
|
38
|
+
|
39
|
+
tick PENDING
|
40
|
+
end
|
41
|
+
|
42
|
+
def example_failed(notification)
|
43
|
+
# TODO: Lazy fix for specs
|
44
|
+
if notification.respond_to?(:example)
|
45
|
+
super(notification)
|
46
|
+
else
|
47
|
+
super(OpenStruct.new(:example => notification))
|
48
|
+
end
|
49
|
+
|
50
|
+
@failure_count += 1
|
51
|
+
tick FAIL
|
52
|
+
end
|
53
|
+
|
54
|
+
def start_dump(notification)
|
55
|
+
@current = @example_count
|
56
|
+
end
|
57
|
+
|
58
|
+
def dump_summary(notification)
|
59
|
+
duration = notification.duration
|
60
|
+
failure_count = notification.failure_count
|
61
|
+
dump_profile if profile_examples? && failure_count == 0
|
62
|
+
summary = "\nYou've Nyaned for #{format_duration(duration)}\n".split(//).map { |c| rainbowify(c) }
|
63
|
+
output.puts summary.join
|
64
|
+
output.puts colorise_summary(notification)
|
65
|
+
if respond_to?(:dump_commands_to_rerun_failed_examples)
|
66
|
+
dump_commands_to_rerun_failed_examples
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
data/nyan-cat-formatter.gemspec
CHANGED
@@ -2,7 +2,7 @@ $:.push File.expand_path("../lib", __FILE__)
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = "nyan-cat-formatter"
|
5
|
-
s.version = "0.
|
5
|
+
s.version = "0.6.0"
|
6
6
|
s.authors = ["Matt Sears"]
|
7
7
|
s.email = ["matt@mattsears.com"]
|
8
8
|
s.homepage = "https://github.com/mattsears/nyan-cat-formatter"
|
@@ -16,7 +16,7 @@ Gem::Specification.new do |s|
|
|
16
16
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
17
17
|
s.require_paths = ["lib"]
|
18
18
|
|
19
|
-
s.add_dependency "rspec", ">= 2.
|
19
|
+
s.add_dependency "rspec", ">= 2.14.2", ">= 2.99.0.beta1", "< 4"
|
20
20
|
|
21
21
|
s.add_development_dependency "rake"
|
22
22
|
end
|
@@ -22,52 +22,52 @@ describe NyanCatFormatter do
|
|
22
22
|
describe 'passed, pending and failed' do
|
23
23
|
|
24
24
|
before do
|
25
|
-
@formatter.
|
25
|
+
allow(@formatter).to receive(:tick)
|
26
26
|
end
|
27
27
|
|
28
28
|
describe 'example_passed' do
|
29
29
|
|
30
30
|
it 'should call the increment method' do
|
31
|
-
@formatter.
|
31
|
+
expect(@formatter).to receive(:tick)
|
32
32
|
@formatter.example_passed(@example)
|
33
33
|
end
|
34
34
|
|
35
35
|
it 'should relax Nyan Cat' do
|
36
36
|
@formatter.example_passed(@example)
|
37
|
-
@formatter.nyan_cat.
|
37
|
+
expect(@formatter.nyan_cat).to eq([
|
38
38
|
'_,------, ',
|
39
39
|
'_| /\_/\ ',
|
40
40
|
'~|_( ^ .^) ',
|
41
41
|
' "" "" '
|
42
|
-
].join("\n")
|
42
|
+
].join("\n"))
|
43
43
|
end
|
44
44
|
|
45
45
|
it 'should update the scoreboard' do
|
46
|
-
@formatter.scoreboard.size.
|
46
|
+
expect(@formatter.scoreboard.size).to eq(4)
|
47
47
|
end
|
48
|
-
|
49
48
|
end
|
50
49
|
|
51
50
|
describe 'example_pending' do
|
52
51
|
|
53
52
|
it 'should call the tick method' do
|
54
|
-
@formatter.
|
53
|
+
expect(@formatter).to receive(:tick)
|
55
54
|
@formatter.example_pending(@example)
|
56
55
|
end
|
57
56
|
|
58
57
|
it 'should increment the pending count' do
|
59
|
-
|
60
|
-
|
58
|
+
expect {
|
59
|
+
@formatter.example_pending(@example)
|
60
|
+
}.to change(@formatter, :pending_count).by(1)
|
61
61
|
end
|
62
62
|
|
63
63
|
it 'should alert Nyan Cat' do
|
64
64
|
@formatter.example_pending(@example)
|
65
|
-
@formatter.nyan_cat.
|
65
|
+
expect(@formatter.nyan_cat).to eq([
|
66
66
|
'_,------, ',
|
67
67
|
'_| /\_/\ ',
|
68
68
|
'~|_( o .o) ',
|
69
69
|
' "" "" '
|
70
|
-
].join("\n")
|
70
|
+
].join("\n"))
|
71
71
|
end
|
72
72
|
|
73
73
|
end
|
@@ -75,34 +75,35 @@ describe NyanCatFormatter do
|
|
75
75
|
describe 'example_failed' do
|
76
76
|
|
77
77
|
it 'should call the increment method' do
|
78
|
-
@formatter.
|
78
|
+
expect(@formatter).to receive(:tick)
|
79
79
|
@formatter.example_failed(@example)
|
80
80
|
end
|
81
81
|
|
82
82
|
it 'should increment the failure count' do
|
83
|
-
|
84
|
-
|
83
|
+
expect {
|
84
|
+
@formatter.example_failed(@example)
|
85
|
+
}.to change(@formatter, :failure_count).by(1)
|
85
86
|
end
|
86
87
|
|
87
88
|
it 'should alert Nyan Cat' do
|
88
89
|
@formatter.example_failed(@example)
|
89
|
-
@formatter.nyan_cat.
|
90
|
+
expect(@formatter.nyan_cat).to eq([
|
90
91
|
'_,------, ',
|
91
92
|
'_| /\_/\ ',
|
92
93
|
'~|_( o .o) ',
|
93
94
|
' "" "" '
|
94
|
-
].join("\n")
|
95
|
+
].join("\n"))
|
95
96
|
end
|
96
97
|
|
97
98
|
it 'should kill nyan if the specs are finished' do
|
98
99
|
@formatter.example_failed(@example)
|
99
|
-
@formatter.
|
100
|
-
@formatter.nyan_cat.
|
100
|
+
allow(@formatter).to receive(:finished?).and_return(true)
|
101
|
+
expect(@formatter.nyan_cat).to eq([
|
101
102
|
'_,------, ',
|
102
103
|
'_| /\_/\ ',
|
103
104
|
'~|_( x .x) ',
|
104
105
|
' "" "" '
|
105
|
-
].join("\n")
|
106
|
+
].join("\n"))
|
106
107
|
end
|
107
108
|
|
108
109
|
end
|
@@ -111,17 +112,17 @@ describe NyanCatFormatter do
|
|
111
112
|
describe 'tick' do
|
112
113
|
|
113
114
|
before do
|
114
|
-
@formatter.
|
115
|
-
@formatter.
|
115
|
+
allow(@formatter).to receive(:current).and_return(1)
|
116
|
+
allow(@formatter).to receive(:example_count).and_return(2)
|
116
117
|
@formatter.tick
|
117
118
|
end
|
118
119
|
|
119
120
|
it 'should increment the current' do
|
120
|
-
@formatter.current.
|
121
|
+
expect(@formatter.current).to eql(1)
|
121
122
|
end
|
122
123
|
|
123
124
|
it 'should store the marks in an array' do
|
124
|
-
@formatter.example_results.
|
125
|
+
expect(@formatter.example_results).to include('=')
|
125
126
|
end
|
126
127
|
|
127
128
|
end
|
@@ -129,7 +130,9 @@ describe NyanCatFormatter do
|
|
129
130
|
describe 'rainbowify' do
|
130
131
|
|
131
132
|
it 'should increment the color index count' do
|
132
|
-
|
133
|
+
expect {
|
134
|
+
@formatter.rainbowify('=')
|
135
|
+
}.to change(@formatter, :color_index).by(1)
|
133
136
|
end
|
134
137
|
|
135
138
|
end
|
@@ -137,15 +140,15 @@ describe NyanCatFormatter do
|
|
137
140
|
describe 'highlight' do
|
138
141
|
|
139
142
|
it 'should rainbowify passing examples' do
|
140
|
-
@formatter.highlight('=').
|
143
|
+
expect(@formatter.highlight('=')).to eq("\e[38;5;154m-\e[0m")
|
141
144
|
end
|
142
145
|
|
143
146
|
it 'should mark failing examples as red' do
|
144
|
-
@formatter.highlight('*').
|
147
|
+
expect(@formatter.highlight('*')).to eq("\e[31m*\e[0m")
|
145
148
|
end
|
146
149
|
|
147
150
|
it 'should mark pending examples as yellow' do
|
148
|
-
@formatter.highlight('!').
|
151
|
+
expect(@formatter.highlight('!')).to eq("\e[33m!\e[0m")
|
149
152
|
end
|
150
153
|
|
151
154
|
end
|
@@ -153,34 +156,34 @@ describe NyanCatFormatter do
|
|
153
156
|
describe 'start' do
|
154
157
|
|
155
158
|
it 'should set the total amount of specs' do
|
156
|
-
@formatter.example_count.
|
159
|
+
expect(@formatter.example_count).to eq(2)
|
157
160
|
end
|
158
161
|
|
159
162
|
it 'should set the current to 0' do
|
160
|
-
@formatter.current.
|
163
|
+
expect(@formatter.current).to eq(0)
|
161
164
|
end
|
162
165
|
|
163
166
|
end
|
164
167
|
|
165
168
|
describe "#format_duration" do
|
166
169
|
it "should return just seconds for sub 60 seconds" do
|
167
|
-
@formatter.format_duration(5.3).
|
170
|
+
expect(@formatter.format_duration(5.3)).to eq("5.3 seconds")
|
168
171
|
end
|
169
172
|
|
170
173
|
it "should remove that extra zero if it is not needed" do
|
171
|
-
@formatter.format_duration(1.0).
|
174
|
+
expect(@formatter.format_duration(1.0)).to eq("1 second")
|
172
175
|
end
|
173
176
|
|
174
177
|
it "should plurlaize seconds" do
|
175
|
-
@formatter.format_duration(1.1).
|
178
|
+
expect(@formatter.format_duration(1.1)).to eq("1.1 seconds")
|
176
179
|
end
|
177
180
|
|
178
181
|
it "add a minute if it is just over 60 seconds" do
|
179
|
-
@formatter.format_duration(63.2543456456).
|
182
|
+
expect(@formatter.format_duration(63.2543456456)).to eq("1 minute and 3.25 seconds")
|
180
183
|
end
|
181
184
|
|
182
185
|
it "should pluralize minutes" do
|
183
|
-
@formatter.format_duration(987.34).
|
186
|
+
expect(@formatter.format_duration(987.34)).to eq("16 minutes and 27.34 seconds")
|
184
187
|
end
|
185
188
|
end
|
186
189
|
|
@@ -195,7 +198,7 @@ describe NyanCatFormatter do
|
|
195
198
|
|
196
199
|
context "when in example #{i}" do
|
197
200
|
it "should return 1 as the example width" do
|
198
|
-
@formatter.example_width.
|
201
|
+
expect(@formatter.example_width).to eq(1)
|
199
202
|
end
|
200
203
|
end
|
201
204
|
end
|
@@ -22,37 +22,37 @@ describe NyanCatMusicFormatter do
|
|
22
22
|
|
23
23
|
describe 'kernel' do
|
24
24
|
it 'defaults to Kernel' do
|
25
|
-
described_class.new(stdout).kernel.
|
25
|
+
expect(described_class.new(stdout).kernel).to eq(Kernel)
|
26
26
|
end
|
27
27
|
|
28
28
|
it 'can be set' do
|
29
29
|
formatter = described_class.new stdout
|
30
30
|
formatter.kernel = 'something else'
|
31
|
-
formatter.kernel.
|
31
|
+
expect(formatter.kernel).to eq('something else')
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
35
35
|
describe 'platform' do
|
36
36
|
it 'defaults to RUBY_PLATFORM' do
|
37
|
-
described_class.new(stdout).platform.
|
37
|
+
expect(described_class.new(stdout).platform).to eq(RUBY_PLATFORM)
|
38
38
|
end
|
39
39
|
|
40
40
|
it 'can be set' do
|
41
41
|
formatter = described_class.new stdout
|
42
42
|
formatter.platform = 'something else'
|
43
|
-
formatter.platform.
|
43
|
+
expect(formatter.platform).to eql('something else')
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
47
47
|
describe 'start' do
|
48
48
|
it 'sets the total amount of specs' do
|
49
49
|
formatter.start 3
|
50
|
-
formatter.example_count.
|
50
|
+
expect(formatter.example_count).to eql(3)
|
51
51
|
end
|
52
52
|
|
53
53
|
it 'sets the current to 0' do
|
54
54
|
formatter.start 3
|
55
|
-
formatter.current.
|
55
|
+
expect(formatter.current).to eql(0)
|
56
56
|
end
|
57
57
|
|
58
58
|
context 'when on OS X' do
|
@@ -60,7 +60,7 @@ describe NyanCatMusicFormatter do
|
|
60
60
|
|
61
61
|
it 'plays the song in the background' do
|
62
62
|
formatter.start 3
|
63
|
-
mock_kernel.seen.
|
63
|
+
expect(mock_kernel.seen).to include("afplay #{path_to_mp3} &")
|
64
64
|
end
|
65
65
|
end
|
66
66
|
|
@@ -68,8 +68,12 @@ describe NyanCatMusicFormatter do
|
|
68
68
|
before { formatter.platform = 'linux'}
|
69
69
|
it 'plays the song for linux too' do
|
70
70
|
formatter.start 10
|
71
|
-
|
72
|
-
|
71
|
+
expect {
|
72
|
+
mock_kernel.seen.any? { |entry| entry. end_with? "mpg321 #{path_to_mp3} &>/dev/null &" }
|
73
|
+
}.to be
|
74
|
+
expect {
|
75
|
+
mock_kernel.seen.any? { |entry| entry. end_with? "mpg123 #{path_to_mp3} &>/dev/null &" }
|
76
|
+
}.to be
|
73
77
|
end
|
74
78
|
end
|
75
79
|
|
@@ -78,7 +82,7 @@ describe NyanCatMusicFormatter do
|
|
78
82
|
|
79
83
|
it 'does not play the song' do
|
80
84
|
formatter.start 4
|
81
|
-
mock_kernel.seen.
|
85
|
+
expect(mock_kernel.seen).to be_empty
|
82
86
|
end
|
83
87
|
end
|
84
88
|
end
|
@@ -10,8 +10,8 @@ describe NyanCatWideFormatter do
|
|
10
10
|
|
11
11
|
describe "cat situation" do
|
12
12
|
before do
|
13
|
-
@formatter.
|
14
|
-
@formatter.
|
13
|
+
allow(@formatter).to receive(:terminal_width).and_return(100)
|
14
|
+
allow(@formatter).to receive(:cat_length).and_return(11)
|
15
15
|
@whole_net_width = 100 - 2*2 - 6 - 11
|
16
16
|
end
|
17
17
|
|
@@ -21,11 +21,11 @@ describe NyanCatWideFormatter do
|
|
21
21
|
end
|
22
22
|
|
23
23
|
it "should calculate the net width for example 3" do
|
24
|
-
@formatter.net_width_for(3).
|
24
|
+
expect(@formatter.net_width_for(3)).to eql((@whole_net_width * 3.0 / 35.0).round)
|
25
25
|
end
|
26
26
|
|
27
27
|
it "should calculate the net width for example 30" do
|
28
|
-
@formatter.net_width_for(5).
|
28
|
+
expect(@formatter.net_width_for(5)).to eql((@whole_net_width * 5.0 / 35.0).round)
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
@@ -33,11 +33,11 @@ describe NyanCatWideFormatter do
|
|
33
33
|
before { @formatter.start(50) }
|
34
34
|
|
35
35
|
it "should calculate the net width for example 1" do
|
36
|
-
@formatter.net_width_for(1).
|
36
|
+
expect(@formatter.net_width_for(1)).to eql((@whole_net_width * 1.0 / 50.0).round)
|
37
37
|
end
|
38
38
|
|
39
39
|
it "should calculate the net width for example 25" do
|
40
|
-
@formatter.net_width_for(25).
|
40
|
+
expect(@formatter.net_width_for(25)).to eql((@whole_net_width * 25.0 / 50.0).round)
|
41
41
|
end
|
42
42
|
end
|
43
43
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nyan-cat-formatter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2014-03-22 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
@@ -18,7 +18,13 @@ dependencies:
|
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version:
|
21
|
+
version: 2.14.2
|
22
|
+
- - ! '>='
|
23
|
+
- !ruby/object:Gem::Version
|
24
|
+
version: 2.99.0.beta1
|
25
|
+
- - <
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: '4'
|
22
28
|
type: :runtime
|
23
29
|
prerelease: false
|
24
30
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -26,7 +32,13 @@ dependencies:
|
|
26
32
|
requirements:
|
27
33
|
- - ! '>='
|
28
34
|
- !ruby/object:Gem::Version
|
29
|
-
version:
|
35
|
+
version: 2.14.2
|
36
|
+
- - ! '>='
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: 2.99.0.beta1
|
39
|
+
- - <
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '4'
|
30
42
|
- !ruby/object:Gem::Dependency
|
31
43
|
name: rake
|
32
44
|
requirement: !ruby/object:Gem::Requirement
|
@@ -61,11 +73,15 @@ files:
|
|
61
73
|
- Rakefile
|
62
74
|
- data/nyan-cat.mp3
|
63
75
|
- demo.rb
|
76
|
+
- gemfiles/rspec1
|
77
|
+
- gemfiles/rspec2
|
64
78
|
- lib/nyan_cat_format/music.rb
|
65
79
|
- lib/nyan_cat_format/wide.rb
|
66
80
|
- lib/nyan_cat_formatter.rb
|
81
|
+
- lib/nyan_cat_formatter/common.rb
|
67
82
|
- lib/nyan_cat_formatter/rspec1.rb
|
68
83
|
- lib/nyan_cat_formatter/rspec2.rb
|
84
|
+
- lib/nyan_cat_formatter/rspec3.rb
|
69
85
|
- lib/nyan_cat_music_formatter.rb
|
70
86
|
- lib/nyan_cat_wide_formatter.rb
|
71
87
|
- lib/nyan_cat_wide_music_formatter.rb
|
@@ -104,3 +120,4 @@ test_files:
|
|
104
120
|
- spec/nyan_cat_music_formatter_spec.rb
|
105
121
|
- spec/nyan_cat_wide_formatter_spec.rb
|
106
122
|
- spec/spec_helper.rb
|
123
|
+
has_rdoc:
|