nyan-cat-formatter 0.5.2 → 0.6.0
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/.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:
|