smooth-jazz-nyan-cat-formatter 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +4 -0
- data/.rspec +2 -0
- data/.rvmrc +1 -0
- data/.travis.yml +5 -0
- data/CHANGELOG.md +4 -0
- data/Gemfile +4 -0
- data/LICENSE.md +20 -0
- data/README.md +92 -0
- data/Rakefile +6 -0
- data/data/nyan-cat.mp3 +0 -0
- data/data/smooth-jazz-nyan-cat.mp3 +0 -0
- data/demo.rb +30 -0
- data/lib/nyan_cat_formatter.rb +237 -0
- data/lib/nyan_cat_formatter/padded_string_io.rb +20 -0
- data/lib/nyan_cat_formatter/rspec1.rb +64 -0
- data/lib/nyan_cat_formatter/rspec2.rb +72 -0
- data/lib/nyan_cat_music_formatter.rb +45 -0
- data/lib/smooth_jazz_nyan_cat_formatter.rb +7 -0
- data/lib/smooth_jazz_nyan_cat_music_formatter.rb +11 -0
- data/lib/smooth_jazzy.rb +29 -0
- data/nyan-cat-formatter.gemspec +20 -0
- data/spec/nyan_cat_formatter_spec.rb +199 -0
- data/spec/nyan_cat_music_formatter_spec.rb +74 -0
- data/spec/smooth_jazz_nyan_cat_formatter_spec.rb +44 -0
- data/spec/smooth_jazz_nyan_cat_music_formatter_spec.rb +60 -0
- data/spec/spec_helper.rb +15 -0
- metadata +124 -0
data/.gitignore
ADDED
data/.rspec
ADDED
data/.rvmrc
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
rvm 1.9.3@nyan-cat-formatter --create
|
data/CHANGELOG.md
ADDED
data/Gemfile
ADDED
data/LICENSE.md
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2011 Matt Sears
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,92 @@
|
|
1
|
+
Nyan Cat RSpec Formatter [![Build Status](https://secure.travis-ci.org/mattsears/nyan-cat-formatter.png)](http://travis-ci.org/mattsears/nyan-cat-formatter)
|
2
|
+
========
|
3
|
+
|
4
|
+
```
|
5
|
+
-_-_-_-_-_-_-_,------,
|
6
|
+
_-_-_-_-_-_-_-| /\_/\
|
7
|
+
-_-_-_-_-_-_-~|__( ^ .^)
|
8
|
+
_-_-_-_-_-_-_-"" ""
|
9
|
+
```
|
10
|
+
|
11
|
+
This is my take on the Nyan Cat RSpec Formatter. It simply creates a rainbow trail of test results. It also counts the number of examples as they execute and highlights failed and pending specs.
|
12
|
+
|
13
|
+
The rainbow changes colors as it runs. See it in action [here](http://vimeo.com/32424001).
|
14
|
+
|
15
|
+
Works with RSpec 1.3 and RSpec 2.
|
16
|
+
|
17
|
+
Using Nyan Cat
|
18
|
+
---------------
|
19
|
+
|
20
|
+
You can either specify the formatting when using the `rspec` command:
|
21
|
+
|
22
|
+
rspec --format NyanCatFormatter
|
23
|
+
|
24
|
+
Or add `--format NyanCatFormatter` to a `.rspec` file placed in your project's root directory,
|
25
|
+
so that you won't have to specify the `--format` option everytime you run the command.
|
26
|
+
|
27
|
+
###Using with Bundler
|
28
|
+
|
29
|
+
To use Nyan Cat with a project that uses Bundler (Rails or Sinatra f.e.) you need to add Nyan Cat dependecy to your Gemfile:
|
30
|
+
|
31
|
+
group :test do
|
32
|
+
gem "nyan-cat-formatter"
|
33
|
+
end
|
34
|
+
|
35
|
+
And then run `bundle install`.
|
36
|
+
|
37
|
+
Installing it
|
38
|
+
-------------
|
39
|
+
|
40
|
+
```
|
41
|
+
$ gem install nyan-cat-formatter
|
42
|
+
```
|
43
|
+
|
44
|
+
If you want to use Nyan Cat as your default formatter, simply put the options in your .rspec file:
|
45
|
+
|
46
|
+
```
|
47
|
+
--format NyanCatFormatter
|
48
|
+
```
|
49
|
+
|
50
|
+
Playing the Nyan Cat song
|
51
|
+
-------------------------
|
52
|
+
|
53
|
+
You can then enjoy playback in two ways:
|
54
|
+
|
55
|
+
**1. Play the song only when desired using a command line option:**
|
56
|
+
|
57
|
+
Use the following command to run your specs:
|
58
|
+
|
59
|
+
```
|
60
|
+
$ rspec spec -f NyanCatMusicFormatter
|
61
|
+
```
|
62
|
+
|
63
|
+
And enjoy the site of Nyan Cat running across your terminal to the Nyan Cat song!
|
64
|
+
|
65
|
+
**2. Play the song by default when you run your specs:**
|
66
|
+
|
67
|
+
Make sure your .rspec file in your application's root directory contains the following:
|
68
|
+
|
69
|
+
```
|
70
|
+
--color
|
71
|
+
--format NyanCatMusicFormatter
|
72
|
+
```
|
73
|
+
|
74
|
+
Then run `rspec spec` and enjoy Nyan Cat formatted text output accompanied by the Nyan Cat song by default!
|
75
|
+
|
76
|
+
**This currently only works on Mac OS X or on Linux (if you have mpg321 installed).**
|
77
|
+
|
78
|
+
Contributing
|
79
|
+
----------
|
80
|
+
|
81
|
+
Once you've made your great commits:
|
82
|
+
|
83
|
+
1. Fork Nyan Cat
|
84
|
+
2. Create a topic branch - git checkout -b my_branch
|
85
|
+
3. Push to your branch - git push origin my_branch
|
86
|
+
4. Create a Pull Request from your branch
|
87
|
+
5. That's it!
|
88
|
+
|
89
|
+
Author
|
90
|
+
----------
|
91
|
+
[Matt Sears](https://wwww.mattsears.com) :: @mattsears
|
92
|
+
|
data/Rakefile
ADDED
data/data/nyan-cat.mp3
ADDED
Binary file
|
Binary file
|
data/demo.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
require_relative 'spec/spec_helper'
|
2
|
+
require 'stringio'
|
3
|
+
|
4
|
+
describe NyanCatFormatter do
|
5
|
+
|
6
|
+
before do
|
7
|
+
@output = StringIO.new
|
8
|
+
@formatter = NyanCatFormatter.new(@output)
|
9
|
+
@formatter.start(2)
|
10
|
+
@example = RSpec::Core::ExampleGroup.describe.example
|
11
|
+
|
12
|
+
@samples = [0,0,0,0,0,0,0,0,0,0,0,1,
|
13
|
+
0]
|
14
|
+
|
15
|
+
sleep(0.1) # Just to slow it down a little :-)
|
16
|
+
end
|
17
|
+
|
18
|
+
100.times do |index|
|
19
|
+
it "should perform passing specs" do
|
20
|
+
@formatter.current.should == @samples.sample
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should perform pending specs" do
|
24
|
+
if @samples.sample == 1
|
25
|
+
pending
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
@@ -0,0 +1,237 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'nyan_cat_formatter/padded_string_io'
|
4
|
+
|
5
|
+
rspec_bin = $0.split('/').last
|
6
|
+
if rspec_bin == 'spec'
|
7
|
+
['spec', 'nyan_cat_formatter/rspec1', 'spec/runner/formatter/base_text_formatter'].each {|f| require f}
|
8
|
+
parent_class = Spec::Runner::Formatter::BaseTextFormatter
|
9
|
+
rspec_module = RSpec1
|
10
|
+
else
|
11
|
+
['nyan_cat_formatter/rspec2', 'rspec/core/formatters/base_text_formatter'].each {|f| require f}
|
12
|
+
parent_class = RSpec::Core::Formatters::BaseTextFormatter
|
13
|
+
rspec_module = RSpec2
|
14
|
+
end
|
15
|
+
|
16
|
+
NyanCatFormatter = Class.new(parent_class) do
|
17
|
+
|
18
|
+
ESC = "\e["
|
19
|
+
NND = "#{ESC}0m"
|
20
|
+
PASS = '='
|
21
|
+
PASS_ARY = ['-', '-', '_', '_', '-', '-', '‾', '‾']
|
22
|
+
FAIL = '*'
|
23
|
+
ERROR = '!'
|
24
|
+
PENDING = '+'
|
25
|
+
|
26
|
+
include rspec_module
|
27
|
+
|
28
|
+
attr_reader :current, :example_results, :color_index, :pending_count,
|
29
|
+
:failure_count, :example_count
|
30
|
+
|
31
|
+
def initialize(args)
|
32
|
+
super PaddedStringIO.new(terminal_width)
|
33
|
+
end
|
34
|
+
|
35
|
+
# Increments the example count and displays the current progress
|
36
|
+
#
|
37
|
+
# @returns nothing
|
38
|
+
def tick(mark = PASS)
|
39
|
+
@example_results << mark
|
40
|
+
@current = (@current > @example_count) ? @example_count : @current + 1
|
41
|
+
dump_progress
|
42
|
+
end
|
43
|
+
|
44
|
+
# Determine which Ascii Nyan Cat to display. If tests are complete,
|
45
|
+
# Nyan Cat goes to sleep. If there are failing or pending examples,
|
46
|
+
# Nyan Cat is concerned.
|
47
|
+
#
|
48
|
+
# @return [String] Nyan Cat
|
49
|
+
def nyan_cat
|
50
|
+
if self.failed_or_pending? && self.finished?
|
51
|
+
ascii_cat('x')[@color_index/2%2].join("\n") #'~|_(x.x)'
|
52
|
+
elsif self.failed_or_pending?
|
53
|
+
ascii_cat('o')[@color_index/2%2].join("\n") #'~|_(o.o)'
|
54
|
+
elsif self.finished?
|
55
|
+
ascii_cat('-')[@color_index/2%2].join("\n") # '~|_(-.-)'
|
56
|
+
else
|
57
|
+
ascii_cat('^')[@color_index/2%2].join("\n") # '~|_(^.^)'
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
# Displays the current progress in all Nyan Cat glory
|
62
|
+
#
|
63
|
+
# @return nothing
|
64
|
+
def dump_progress
|
65
|
+
padding = @example_count.to_s.length * 2 + 2
|
66
|
+
line = nyan_trail.split("\n").each_with_index.inject([]) do |result, (trail, index)|
|
67
|
+
value = "#{scoreboard[index]}/#{@example_count}:"
|
68
|
+
value = " " * value.length if scoreboard[index].strip == ""
|
69
|
+
result << format("%s %s", value, trail)
|
70
|
+
end.join("\n")
|
71
|
+
output.print line + eol
|
72
|
+
end
|
73
|
+
|
74
|
+
# Determines how we end the trail line. If complete, return a newline etc.
|
75
|
+
#
|
76
|
+
# @return [String]
|
77
|
+
def eol
|
78
|
+
return "\n" if @current == @example_count
|
79
|
+
length = (nyan_cat.split("\n").length - 1)
|
80
|
+
length > 0 ? format("\e[1A" * length + "\r") : "\r"
|
81
|
+
end
|
82
|
+
|
83
|
+
# Calculates the current flight length
|
84
|
+
#
|
85
|
+
# @return [Fixnum]
|
86
|
+
def current_width
|
87
|
+
padding = @example_count.to_s.length * 2 + 6
|
88
|
+
cat_length = nyan_cat.split("\n").group_by(&:size).max.first
|
89
|
+
padding + @current + cat_length
|
90
|
+
end
|
91
|
+
|
92
|
+
# A Unix trick using stty to get the console columns
|
93
|
+
#
|
94
|
+
# @return [Fixnum]
|
95
|
+
def terminal_width
|
96
|
+
if defined? JRUBY_VERSION
|
97
|
+
default_width = 80
|
98
|
+
else
|
99
|
+
default_width = `stty size`.split.map { |x| x.to_i }.reverse.first - 1
|
100
|
+
end
|
101
|
+
@terminal_width ||= default_width
|
102
|
+
end
|
103
|
+
|
104
|
+
# Creates a data store of pass, failed, and pending example results
|
105
|
+
# We have to pad the results here because sprintf can't properly pad color
|
106
|
+
#
|
107
|
+
# @return [Array]
|
108
|
+
def scoreboard
|
109
|
+
@pending_examples ||= []
|
110
|
+
@failed_examples ||= []
|
111
|
+
padding = @example_count.to_s.length
|
112
|
+
[ @current.to_s.rjust(padding),
|
113
|
+
green((@current - @pending_examples.size - @failed_examples.size).to_s.rjust(padding)),
|
114
|
+
yellow(@pending_examples.size.to_s.rjust(padding)),
|
115
|
+
red(@failed_examples.size.to_s.rjust(padding)),
|
116
|
+
"".rjust(padding),
|
117
|
+
"".rjust(padding) ]
|
118
|
+
end
|
119
|
+
|
120
|
+
# Creates a rainbow trail
|
121
|
+
#
|
122
|
+
# @return [String] the sprintf format of the Nyan cat
|
123
|
+
def nyan_trail
|
124
|
+
nyan_cat_lines = nyan_cat.split("\n").each_with_index.map do |line, index|
|
125
|
+
@color_index = @current%8
|
126
|
+
marks = @example_results.map{ |mark| highlight(mark, index) }
|
127
|
+
marks.shift(current_width - terminal_width) if current_width >= terminal_width
|
128
|
+
format("%s#{line}", marks.join)
|
129
|
+
end.join("\n")
|
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
|
+
"_| /\\_/\\ ",
|
140
|
+
"~|_( #{o} .#{o}) ",
|
141
|
+
" \"\" \"\" ",
|
142
|
+
"----------"
|
143
|
+
],
|
144
|
+
[ "----------",
|
145
|
+
"_,------, ",
|
146
|
+
"_| /\\_/\\",
|
147
|
+
"^|__( #{o} .#{o}) ",
|
148
|
+
" \"\" \"\" ",
|
149
|
+
"----------"
|
150
|
+
]]
|
151
|
+
end
|
152
|
+
|
153
|
+
# Colorizes the string with raindow colors of the rainbow
|
154
|
+
#
|
155
|
+
# @params string [String]
|
156
|
+
# @return [String]
|
157
|
+
def rainbowify(string)
|
158
|
+
c = colors[@color_index % colors.size]
|
159
|
+
@color_index += 1
|
160
|
+
colorize(string, c)
|
161
|
+
end
|
162
|
+
|
163
|
+
def rgb(r,g,b)
|
164
|
+
16+r*36+g*6+b
|
165
|
+
end
|
166
|
+
|
167
|
+
def colorize(string, color)
|
168
|
+
"#{ESC}38;5;#{color}m#{string}#{NND}"
|
169
|
+
end
|
170
|
+
|
171
|
+
# Calculates the colors of the rainbow
|
172
|
+
#
|
173
|
+
# @return [Array]
|
174
|
+
def colors
|
175
|
+
@colors ||= (0...(6 * 7)).map do |n|
|
176
|
+
pi_3 = Math::PI / 3
|
177
|
+
n *= 1.0 / 6
|
178
|
+
r = (3 * Math.sin(n ) + 3).to_i
|
179
|
+
g = (3 * Math.sin(n + 2 * pi_3) + 3).to_i
|
180
|
+
b = (3 * Math.sin(n + 4 * pi_3) + 3).to_i
|
181
|
+
36 * r + 6 * g + b + 16
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
def trail_colors
|
186
|
+
return [rgb(5,0,0),
|
187
|
+
rgb(5,2,0),
|
188
|
+
rgb(5,5,0),
|
189
|
+
rgb(0,5,0),
|
190
|
+
rgb(0,0,5),
|
191
|
+
rgb(1,0,5)]
|
192
|
+
end
|
193
|
+
|
194
|
+
# Determines how to color the example. If pass, it is rainbowified, otherwise
|
195
|
+
# we assign red if failed or yellow if an error occurred.
|
196
|
+
#
|
197
|
+
# @return [String]
|
198
|
+
def highlight(mark = PASS, index = 0)
|
199
|
+
@color_index += 1
|
200
|
+
case mark
|
201
|
+
when PASS; colorize PASS_ARY[@color_index%8], trail_colors[index]
|
202
|
+
when FAIL; "\e[31m#{mark}\e[0m"
|
203
|
+
when ERROR; "\e[33m#{mark}\e[0m"
|
204
|
+
when PENDING; "\e[33m#{mark}\e[0m"
|
205
|
+
else mark
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
209
|
+
# Converts a float of seconds into a minutes/seconds string
|
210
|
+
#
|
211
|
+
# @return [String]
|
212
|
+
def format_duration(duration)
|
213
|
+
seconds = ((duration % 60) * 100.0).round / 100.0 # 1.8.7 safe .round(2)
|
214
|
+
seconds = seconds.to_i if seconds.to_i == seconds # drop that zero if it's not needed
|
215
|
+
|
216
|
+
message = "#{seconds} second#{seconds == 1 ? "" : "s"}"
|
217
|
+
message = "#{(duration / 60).to_i} minute#{(duration / 60).to_i == 1 ? "" : "s"} and " + message if duration >= 60
|
218
|
+
|
219
|
+
message
|
220
|
+
end
|
221
|
+
|
222
|
+
|
223
|
+
# Determines if the specs have completed
|
224
|
+
#
|
225
|
+
# @returns [Boolean] true if finished; false otherwise
|
226
|
+
def finished?
|
227
|
+
(@current == @example_count)
|
228
|
+
end
|
229
|
+
|
230
|
+
# Determines if the any specs failed or are in pending state
|
231
|
+
#
|
232
|
+
# @returns [Boolean] true if failed or pending; false otherwise
|
233
|
+
def failed_or_pending?
|
234
|
+
(@failure_count.to_i > 0 || @pending_count.to_i > 0)
|
235
|
+
end
|
236
|
+
end
|
237
|
+
|
@@ -0,0 +1,20 @@
|
|
1
|
+
class PaddedStringIO
|
2
|
+
def initialize(terminal_size)
|
3
|
+
@output = $stdout
|
4
|
+
@terminal_size = terminal_size
|
5
|
+
end
|
6
|
+
|
7
|
+
def puts(output_strings = '')
|
8
|
+
unless output_strings.is_a?(Array)
|
9
|
+
output_strings = [output_strings]
|
10
|
+
end
|
11
|
+
output_strings.each do |output_string|
|
12
|
+
@output.puts output_string.ljust(@terminal_size)
|
13
|
+
# super 'foo'
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def method_missing(*args)
|
18
|
+
@output.send(*args)
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'rspec/instafail'
|
2
|
+
|
3
|
+
module RSpec1
|
4
|
+
|
5
|
+
def start(example_count)
|
6
|
+
super(example_count)
|
7
|
+
@example_count = example_count
|
8
|
+
@current = @color_index = @passing_count = @failure_count = @pending_count = 0
|
9
|
+
@example_results = []
|
10
|
+
end
|
11
|
+
|
12
|
+
def example_passed(example)
|
13
|
+
super
|
14
|
+
@passing_count += 1
|
15
|
+
tick PASS
|
16
|
+
end
|
17
|
+
|
18
|
+
def example_pending(example, message = nil)
|
19
|
+
super
|
20
|
+
@pending_count =+1
|
21
|
+
tick PENDING
|
22
|
+
end
|
23
|
+
|
24
|
+
def example_failed(example, counter = nil, failure = nil)
|
25
|
+
super
|
26
|
+
@failure_count =+1
|
27
|
+
tick FAIL
|
28
|
+
instafail.example_failed(example)
|
29
|
+
end
|
30
|
+
|
31
|
+
def start_dump
|
32
|
+
@current = @example_count
|
33
|
+
end
|
34
|
+
|
35
|
+
def dump_pending
|
36
|
+
output.puts "\e[0;33m"
|
37
|
+
super
|
38
|
+
end
|
39
|
+
|
40
|
+
def dump_failure(*args)
|
41
|
+
output.puts "\e[0;31m"
|
42
|
+
super
|
43
|
+
end
|
44
|
+
|
45
|
+
def dump_summary(duration, example_count, failure_count, pending_count)
|
46
|
+
NyanCatMusicFormatter.new(NyanCatFormatter).kill_music if NyanCatMusicFormatter
|
47
|
+
@output.puts "\nYou've Nyaned for #{format_duration(duration)}\n".each_char.map {|c| rainbowify(c)}.join
|
48
|
+
summary = "#{example_count} example#{'s' unless example_count == 1}, #{failure_count} failure#{'s' unless failure_count == 1}"
|
49
|
+
summary << ", #{pending_count} pending" if pending_count > 0
|
50
|
+
|
51
|
+
if failure_count == 0
|
52
|
+
@output.puts red(summary)
|
53
|
+
elsif pending_count > 0
|
54
|
+
@output.puts yellow(summary)
|
55
|
+
else
|
56
|
+
@output.puts green(summary)
|
57
|
+
end
|
58
|
+
@output.flush
|
59
|
+
end
|
60
|
+
|
61
|
+
def instafail
|
62
|
+
@instafail ||= RSpec::Instafail.new(output)
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'rspec/instafail'
|
2
|
+
|
3
|
+
module RSpec2
|
4
|
+
|
5
|
+
def start(example_count)
|
6
|
+
super(example_count)
|
7
|
+
@current = @color_index = @passing_count = 0
|
8
|
+
@example_results = []
|
9
|
+
end
|
10
|
+
|
11
|
+
def example_passed(example)
|
12
|
+
super(example)
|
13
|
+
tick PASS
|
14
|
+
end
|
15
|
+
|
16
|
+
def example_pending(example)
|
17
|
+
super(example)
|
18
|
+
@pending_count +=1
|
19
|
+
tick PENDING
|
20
|
+
end
|
21
|
+
|
22
|
+
def example_failed(example)
|
23
|
+
super(example)
|
24
|
+
@failure_count +=1
|
25
|
+
instafail.example_failed(example)
|
26
|
+
tick FAIL
|
27
|
+
end
|
28
|
+
|
29
|
+
def start_dump
|
30
|
+
@current = @example_count
|
31
|
+
end
|
32
|
+
|
33
|
+
def dump_failures
|
34
|
+
nil
|
35
|
+
end
|
36
|
+
|
37
|
+
def dump_summary(duration, example_count, failure_count, pending_count)
|
38
|
+
NyanCatMusicFormatter.new(NyanCatFormatter).kill_music if NyanCatMusicFormatter
|
39
|
+
dump_profile if profile_examples? && failure_count == 0
|
40
|
+
summary = "\nYou've Nyaned for #{format_duration(duration)}\n".split(//).map { |c| rainbowify(c) }
|
41
|
+
output.puts summary.join
|
42
|
+
output.puts colorise_summary(summary_line(example_count, failure_count, pending_count))
|
43
|
+
if respond_to?(:dump_commands_to_rerun_failed_examples)
|
44
|
+
dump_commands_to_rerun_failed_examples
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def instafail
|
49
|
+
@instafail ||= RSpec::Instafail.new(output)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
=begin
|
54
|
+
module RSpec
|
55
|
+
module Core
|
56
|
+
module Formatters
|
57
|
+
class BaseTextFormatter < BaseFormatter
|
58
|
+
def dump_failure(example, index)
|
59
|
+
output.puts "#{short_padding}#{index.next}) #{example.full_description} "
|
60
|
+
exception = example.execution_result[:exception]
|
61
|
+
output.puts "#{long_padding}#{red("Failure/Error:")} #{red(read_failed_line(exception, example).strip)} "
|
62
|
+
output.puts "#{long_padding}#{red(exception.class.name << ":")} " unless exception.class.name =~ /RSpec/
|
63
|
+
exception.message.to_s.split("\n").each { |line| output.puts "#{long_padding} #{red(line)} " } if exception.message
|
64
|
+
if shared_group = find_shared_group(example)
|
65
|
+
dump_shared_failure_info(shared_group)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
=end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'nyan_cat_formatter'
|
3
|
+
|
4
|
+
class NyanCatMusicFormatter < NyanCatFormatter
|
5
|
+
def osx?
|
6
|
+
platform.downcase.include?("darwin")
|
7
|
+
end
|
8
|
+
|
9
|
+
def linux?
|
10
|
+
platform.downcase.include?('linux')
|
11
|
+
end
|
12
|
+
|
13
|
+
def kernel=(kernel)
|
14
|
+
@kernel = kernel
|
15
|
+
end
|
16
|
+
|
17
|
+
def kernel
|
18
|
+
@kernel ||= Kernel
|
19
|
+
end
|
20
|
+
|
21
|
+
def platform=(platform)
|
22
|
+
@platform = platform
|
23
|
+
end
|
24
|
+
|
25
|
+
def platform
|
26
|
+
@platform ||= RUBY_PLATFORM
|
27
|
+
end
|
28
|
+
|
29
|
+
def nyan_mp3
|
30
|
+
File.expand_path('../../data/nyan-cat.mp3', __FILE__)
|
31
|
+
end
|
32
|
+
|
33
|
+
def start input
|
34
|
+
super
|
35
|
+
kernel.system("afplay #{nyan_mp3} &") if osx?
|
36
|
+
kernel.system("[ -e #{nyan_mp3} ] && type mpg321 &>/dev/null && mpg321 #{nyan_mp3} &>/dev/null &") if linux?
|
37
|
+
end
|
38
|
+
|
39
|
+
def kill_music
|
40
|
+
if File.exists? nyan_mp3
|
41
|
+
system("killall -9 afplay &>/dev/null") if osx?
|
42
|
+
system("killall -9 mpg321 &>/dev/null") if linux?
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'smooth_jazzy'
|
3
|
+
require 'nyan_cat_music_formatter'
|
4
|
+
|
5
|
+
class SmoothJazzNyanCatMusicFormatter < NyanCatMusicFormatter
|
6
|
+
include SmoothJazzy
|
7
|
+
|
8
|
+
def nyan_mp3
|
9
|
+
File.expand_path('../../data/smooth-jazz-nyan-cat.mp3', __FILE__)
|
10
|
+
end
|
11
|
+
end
|
data/lib/smooth_jazzy.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
module SmoothJazzy
|
4
|
+
# Ascii version of Nyan cat. Two cats in the array allow Nyan to animate running.
|
5
|
+
#
|
6
|
+
# @param o [String] Nyan's eye
|
7
|
+
# @return [Array] Nyan cats
|
8
|
+
def ascii_cat(o = '^')
|
9
|
+
if o=='^'
|
10
|
+
face = '⌐■.■'
|
11
|
+
else
|
12
|
+
face = "#{o} .#{o}"
|
13
|
+
end
|
14
|
+
[[ "----------",
|
15
|
+
"_,------, ",
|
16
|
+
"_| /\\_/\\ ",
|
17
|
+
"~|_( #{face}) ",
|
18
|
+
" \"\" \"\" ",
|
19
|
+
"----------"
|
20
|
+
],
|
21
|
+
[ "----------",
|
22
|
+
"_,------, ",
|
23
|
+
"_| /\\_/\\",
|
24
|
+
"^|__( #{face}) ",
|
25
|
+
" \"\" \"\" ",
|
26
|
+
"----------"
|
27
|
+
]]
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
$:.push File.expand_path("../lib", __FILE__)
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = "smooth-jazz-nyan-cat-formatter"
|
5
|
+
s.version = "0.1.1"
|
6
|
+
s.authors = ["Ryan Spore"]
|
7
|
+
s.email = ["ry@nspore.com"]
|
8
|
+
s.summary = %q{Nyan Cat inspired RSpec formatter! Now with more Jazz! }
|
9
|
+
s.description = %q{Nyan Cat inspired RSpec formatter! Now with more Jazz! }
|
10
|
+
|
11
|
+
s.files = `git ls-files`.split("\n")
|
12
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
13
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
14
|
+
s.require_paths = ["lib"]
|
15
|
+
|
16
|
+
# specify any dependencies here; for example:
|
17
|
+
s.add_development_dependency "rake"
|
18
|
+
s.add_development_dependency "rspec"
|
19
|
+
s.add_dependency "rspec-instafail"
|
20
|
+
end
|
@@ -0,0 +1,199 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'stringio'
|
3
|
+
|
4
|
+
describe NyanCatFormatter do
|
5
|
+
|
6
|
+
before do
|
7
|
+
rspec_bin = $0.split('/').last
|
8
|
+
@output = StringIO.new
|
9
|
+
if rspec_bin == 'rspec'
|
10
|
+
@formatter = NyanCatFormatter.new(@output)
|
11
|
+
@example = RSpec::Core::ExampleGroup.describe.example
|
12
|
+
else
|
13
|
+
formatter_options = OpenStruct.new(:colour => true, :dry_run => false, :autospec => nil)
|
14
|
+
@formatter = NyanCatFormatter.new(formatter_options, @output)
|
15
|
+
@example = Spec::Example::ExampleProxy.new("should pass")
|
16
|
+
@formatter.instance_variable_set(:@example_group, OpenStruct.new(:description => "group"))
|
17
|
+
end
|
18
|
+
@formatter.start(2)
|
19
|
+
sleep(0.1) # Just to slow it down a little :-)
|
20
|
+
end
|
21
|
+
|
22
|
+
describe 'passed, pending and failed' do
|
23
|
+
|
24
|
+
before do
|
25
|
+
@formatter.stub!(:tick)
|
26
|
+
end
|
27
|
+
|
28
|
+
describe 'example_passed' do
|
29
|
+
|
30
|
+
it 'should call the increment method' do
|
31
|
+
@formatter.should_receive :tick
|
32
|
+
@formatter.example_passed(@example)
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'should relax Nyan Cat' do
|
36
|
+
@formatter.example_passed(@example)
|
37
|
+
@formatter.nyan_cat.should include [
|
38
|
+
'_,------, ',
|
39
|
+
'_| /\_/\ ',
|
40
|
+
'~|_( ^ .^) ',
|
41
|
+
' "" "" '
|
42
|
+
].join("\n")
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'should update the scoreboard' do
|
46
|
+
@formatter.scoreboard.size.should == 6
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
describe 'example_pending' do
|
52
|
+
|
53
|
+
it 'should call the tick method' do
|
54
|
+
@formatter.should_receive :tick
|
55
|
+
@formatter.example_pending(@example)
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'should increment the pending count' do
|
59
|
+
lambda { @formatter.example_pending(@example)}.
|
60
|
+
should change(@formatter, :pending_count).by(1)
|
61
|
+
end
|
62
|
+
|
63
|
+
it 'should alert Nyan Cat' do
|
64
|
+
@formatter.example_pending(@example)
|
65
|
+
@formatter.nyan_cat.should include [
|
66
|
+
'_,------, ',
|
67
|
+
'_| /\_/\ ',
|
68
|
+
'~|_( o .o) ',
|
69
|
+
' "" "" '
|
70
|
+
].join("\n")
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
describe 'example_failed' do
|
76
|
+
before do
|
77
|
+
@formatter.instafail.stub!(:example_failed)
|
78
|
+
end
|
79
|
+
|
80
|
+
it 'should call the increment method' do
|
81
|
+
@formatter.should_receive :tick
|
82
|
+
@formatter.example_failed(@example)
|
83
|
+
end
|
84
|
+
|
85
|
+
it 'should increment the failure count' do
|
86
|
+
lambda { @formatter.example_failed(@example)}.
|
87
|
+
should change(@formatter, :failure_count).by(1)
|
88
|
+
end
|
89
|
+
|
90
|
+
it 'should alert Nyan Cat' do
|
91
|
+
@formatter.example_failed(@example)
|
92
|
+
@formatter.nyan_cat.should include [
|
93
|
+
'_,------, ',
|
94
|
+
'_| /\_/\ ',
|
95
|
+
'~|_( o .o) ',
|
96
|
+
' "" "" '
|
97
|
+
].join("\n")
|
98
|
+
end
|
99
|
+
|
100
|
+
it 'should kill nyan if the specs are finished' do
|
101
|
+
@formatter.example_failed(@example)
|
102
|
+
@formatter.stub(:finished?).and_return(true)
|
103
|
+
@formatter.nyan_cat.should include [
|
104
|
+
'_,------, ',
|
105
|
+
'_| /\_/\ ',
|
106
|
+
'~|_( x .x) ',
|
107
|
+
' "" "" '
|
108
|
+
].join("\n")
|
109
|
+
end
|
110
|
+
|
111
|
+
it 'should call instafail.example_failed' do
|
112
|
+
@formatter.instafail.should_receive(:example_failed).with(@example)
|
113
|
+
@formatter.example_failed(@example)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
describe 'tick' do
|
119
|
+
|
120
|
+
before do
|
121
|
+
@formatter.stub!(:current).and_return(1)
|
122
|
+
@formatter.stub!(:example_count).and_return(2)
|
123
|
+
@formatter.tick
|
124
|
+
end
|
125
|
+
|
126
|
+
it 'should increment the current' do
|
127
|
+
@formatter.current.should == 1
|
128
|
+
end
|
129
|
+
|
130
|
+
it 'should store the marks in an array' do
|
131
|
+
@formatter.example_results.should include('=')
|
132
|
+
end
|
133
|
+
|
134
|
+
end
|
135
|
+
|
136
|
+
describe 'rainbowify' do
|
137
|
+
|
138
|
+
it 'should increment the color index count' do
|
139
|
+
lambda { @formatter.rainbowify('=') }.should change(@formatter, :color_index).by(1)
|
140
|
+
end
|
141
|
+
|
142
|
+
end
|
143
|
+
|
144
|
+
describe 'highlight' do
|
145
|
+
|
146
|
+
it 'should rainbowify passing examples' do
|
147
|
+
@formatter.highlight('=').should == "\e[38;5;196m-\e[0m"
|
148
|
+
end
|
149
|
+
|
150
|
+
it 'should mark failing examples as red' do
|
151
|
+
@formatter.highlight('*').should == "\e[31m*\e[0m"
|
152
|
+
end
|
153
|
+
|
154
|
+
it 'should mark pending examples as yellow' do
|
155
|
+
@formatter.highlight('!').should == "\e[33m!\e[0m"
|
156
|
+
end
|
157
|
+
|
158
|
+
end
|
159
|
+
|
160
|
+
describe 'start' do
|
161
|
+
|
162
|
+
it 'should set the total amount of specs' do
|
163
|
+
@formatter.example_count.should == 2
|
164
|
+
end
|
165
|
+
|
166
|
+
it 'should set the current to 0' do
|
167
|
+
@formatter.current.should == 0
|
168
|
+
end
|
169
|
+
|
170
|
+
end
|
171
|
+
|
172
|
+
describe "#format_duration" do
|
173
|
+
it "should return just seconds for sub 60 seconds" do
|
174
|
+
@formatter.format_duration(5.3).should eq("5.3 seconds")
|
175
|
+
end
|
176
|
+
|
177
|
+
it "should remove that extra zero if it is not needed" do
|
178
|
+
@formatter.format_duration(1.0).should eq("1 second")
|
179
|
+
end
|
180
|
+
|
181
|
+
it "should plurlaize seconds" do
|
182
|
+
@formatter.format_duration(1.1).should eq("1.1 seconds")
|
183
|
+
end
|
184
|
+
|
185
|
+
it "add a minute if it is just over 60 seconds" do
|
186
|
+
@formatter.format_duration(63.2543456456).should eq("1 minute and 3.25 seconds")
|
187
|
+
end
|
188
|
+
|
189
|
+
it "should pluralize minutes" do
|
190
|
+
@formatter.format_duration(987.34).should eq("16 minutes and 27.34 seconds")
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
describe '#instafail' do
|
195
|
+
it 'should be an instance of RSpec::Instafail' do
|
196
|
+
@formatter.instafail.should be_instance_of(RSpec::Instafail)
|
197
|
+
end
|
198
|
+
end
|
199
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'stringio'
|
3
|
+
require 'nyan_cat_music_formatter'
|
4
|
+
|
5
|
+
describe NyanCatMusicFormatter do
|
6
|
+
let(:path_to_mp3) { NyanCatMusicFormatter.new(stdout).nyan_mp3 }
|
7
|
+
let(:stdout) { StringIO.new }
|
8
|
+
let(:formatter) { described_class.new stdout }
|
9
|
+
let(:mock_kernel) { MockKernel.new }
|
10
|
+
|
11
|
+
before { formatter.kernel = mock_kernel }
|
12
|
+
|
13
|
+
describe 'kernel' do
|
14
|
+
it 'defaults to Kernel' do
|
15
|
+
described_class.new(stdout).kernel.should == Kernel
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'can be set' do
|
19
|
+
formatter = described_class.new stdout
|
20
|
+
formatter.kernel = 'something else'
|
21
|
+
formatter.kernel.should == 'something else'
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe 'platform' do
|
26
|
+
it 'defaults to RUBY_PLATFORM' do
|
27
|
+
described_class.new(stdout).platform.should eq RUBY_PLATFORM
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'can be set' do
|
31
|
+
formatter = described_class.new stdout
|
32
|
+
formatter.platform = 'something else'
|
33
|
+
formatter.platform.should == 'something else'
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe 'start' do
|
38
|
+
it 'sets the total amount of specs' do
|
39
|
+
formatter.start 3
|
40
|
+
formatter.example_count.should == 3
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'sets the current to 0' do
|
44
|
+
formatter.start 3
|
45
|
+
formatter.current.should == 0
|
46
|
+
end
|
47
|
+
|
48
|
+
context 'when on OS X' do
|
49
|
+
before { formatter.platform = 'darwin' }
|
50
|
+
|
51
|
+
it 'plays the song in the background' do
|
52
|
+
formatter.start 3
|
53
|
+
mock_kernel.seen.should include "afplay #{path_to_mp3} &"
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
context 'when on linux' do
|
58
|
+
before { formatter.platform = 'linux'}
|
59
|
+
it 'plays the song for linux too' do
|
60
|
+
formatter.start 10
|
61
|
+
mock_kernel.seen.any? { |entry| entry. end_with? "mpg321 #{path_to_mp3} &>/dev/null &" }.should be
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
context 'when not on OS X' do
|
66
|
+
before { formatter.platform = 'windows' }
|
67
|
+
|
68
|
+
it 'does not play the song' do
|
69
|
+
formatter.start 4
|
70
|
+
mock_kernel.seen.should be_empty
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'spec_helper'
|
3
|
+
require 'stringio'
|
4
|
+
|
5
|
+
describe SmoothJazzNyanCatFormatter do
|
6
|
+
before do
|
7
|
+
rspec_bin = $0.split('/').last
|
8
|
+
@output = StringIO.new
|
9
|
+
if rspec_bin == 'rspec'
|
10
|
+
@formatter = SmoothJazzNyanCatFormatter.new(@output)
|
11
|
+
@example = RSpec::Core::ExampleGroup.describe.example
|
12
|
+
else
|
13
|
+
formatter_options = OpenStruct.new(:colour => true, :dry_run => false, :autospec => nil)
|
14
|
+
@formatter = SmoothJazzNyanCatFormatter.new(formatter_options, @output)
|
15
|
+
@example = Spec::Example::ExampleProxy.new("should pass")
|
16
|
+
@formatter.instance_variable_set(:@example_group, OpenStruct.new(:description => "group"))
|
17
|
+
end
|
18
|
+
@formatter.start(2)
|
19
|
+
end
|
20
|
+
|
21
|
+
describe 'inherited behavior' do
|
22
|
+
it 'should inherit from the NyanCatMusicFormatter' do
|
23
|
+
@formatter.should be_a(NyanCatFormatter)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe 'passed, pending and failed' do
|
28
|
+
before do
|
29
|
+
@formatter.stub!(:tick)
|
30
|
+
end
|
31
|
+
|
32
|
+
describe 'example_passed' do
|
33
|
+
it 'should relax Nyan Cat' do
|
34
|
+
@formatter.example_passed(@example)
|
35
|
+
@formatter.nyan_cat.should include [
|
36
|
+
'_,------, ',
|
37
|
+
'_| /\_/\ ',
|
38
|
+
'~|_( ⌐■.■) ',
|
39
|
+
' "" "" '
|
40
|
+
].join("\n")
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'spec_helper'
|
3
|
+
require 'stringio'
|
4
|
+
require 'smooth_jazz_nyan_cat_music_formatter'
|
5
|
+
|
6
|
+
describe SmoothJazzNyanCatMusicFormatter do
|
7
|
+
let(:path_to_mp3) { @formatter.nyan_mp3 }
|
8
|
+
let(:stdout) { StringIO.new }
|
9
|
+
let(:mock_kernel) { MockKernel.new }
|
10
|
+
|
11
|
+
before do
|
12
|
+
@formatter = nil
|
13
|
+
rspec_bin = $0.split('/').last
|
14
|
+
if rspec_bin == 'rspec'
|
15
|
+
@formatter = SmoothJazzNyanCatMusicFormatter.new(stdout)
|
16
|
+
@example = RSpec::Core::ExampleGroup.describe.example
|
17
|
+
else
|
18
|
+
formatter_options = OpenStruct.new(:colour => true, :dry_run => false, :autospec => nil)
|
19
|
+
@formatter = SmoothJazzNyanCatMusicFormatter.new(formatter_options, stdout)
|
20
|
+
@example = Spec::Example::ExampleProxy.new("should pass")
|
21
|
+
@formatter.instance_variable_set(:@example_group, OpenStruct.new(:description => "group"))
|
22
|
+
end
|
23
|
+
@formatter.start(2)
|
24
|
+
@formatter.kernel = mock_kernel
|
25
|
+
end
|
26
|
+
|
27
|
+
describe 'inherited behavior' do
|
28
|
+
it 'should inherit from the NyanCatMusicFormatter' do
|
29
|
+
@formatter.should be_a(NyanCatFormatter)
|
30
|
+
@formatter.should be_a(NyanCatMusicFormatter)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe 'start' do
|
35
|
+
context 'when on OS X' do
|
36
|
+
before { @formatter.platform = 'darwin' }
|
37
|
+
|
38
|
+
it 'plays the song in the background' do
|
39
|
+
@formatter.start 3
|
40
|
+
mock_kernel.seen.should include "afplay #{path_to_mp3} &"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe 'example_passed' do
|
46
|
+
before do
|
47
|
+
@formatter.stub!(:tick)
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'should relax Nyan Cat' do
|
51
|
+
@formatter.example_passed(@example)
|
52
|
+
@formatter.nyan_cat.should include [
|
53
|
+
'_,------, ',
|
54
|
+
'_| /\_/\ ',
|
55
|
+
'~|_( ⌐■.■) ',
|
56
|
+
' "" "" '
|
57
|
+
].join("\n")
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
2
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
3
|
+
require 'nyan_cat_formatter'
|
4
|
+
require 'smooth_jazz_nyan_cat_formatter'
|
5
|
+
require 'rspec/instafail'
|
6
|
+
|
7
|
+
class MockKernel
|
8
|
+
def system(string)
|
9
|
+
seen << string
|
10
|
+
end
|
11
|
+
|
12
|
+
def seen
|
13
|
+
@seen ||= []
|
14
|
+
end
|
15
|
+
end
|
metadata
ADDED
@@ -0,0 +1,124 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: smooth-jazz-nyan-cat-formatter
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Ryan Spore
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-10-03 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rake
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rspec
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: rspec-instafail
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :runtime
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
description: ! 'Nyan Cat inspired RSpec formatter! Now with more Jazz! '
|
63
|
+
email:
|
64
|
+
- ry@nspore.com
|
65
|
+
executables: []
|
66
|
+
extensions: []
|
67
|
+
extra_rdoc_files: []
|
68
|
+
files:
|
69
|
+
- .gitignore
|
70
|
+
- .rspec
|
71
|
+
- .rvmrc
|
72
|
+
- .travis.yml
|
73
|
+
- CHANGELOG.md
|
74
|
+
- Gemfile
|
75
|
+
- LICENSE.md
|
76
|
+
- README.md
|
77
|
+
- Rakefile
|
78
|
+
- data/nyan-cat.mp3
|
79
|
+
- data/smooth-jazz-nyan-cat.mp3
|
80
|
+
- demo.rb
|
81
|
+
- lib/nyan_cat_formatter.rb
|
82
|
+
- lib/nyan_cat_formatter/padded_string_io.rb
|
83
|
+
- lib/nyan_cat_formatter/rspec1.rb
|
84
|
+
- lib/nyan_cat_formatter/rspec2.rb
|
85
|
+
- lib/nyan_cat_music_formatter.rb
|
86
|
+
- lib/smooth_jazz_nyan_cat_formatter.rb
|
87
|
+
- lib/smooth_jazz_nyan_cat_music_formatter.rb
|
88
|
+
- lib/smooth_jazzy.rb
|
89
|
+
- nyan-cat-formatter.gemspec
|
90
|
+
- spec/nyan_cat_formatter_spec.rb
|
91
|
+
- spec/nyan_cat_music_formatter_spec.rb
|
92
|
+
- spec/smooth_jazz_nyan_cat_formatter_spec.rb
|
93
|
+
- spec/smooth_jazz_nyan_cat_music_formatter_spec.rb
|
94
|
+
- spec/spec_helper.rb
|
95
|
+
homepage:
|
96
|
+
licenses: []
|
97
|
+
post_install_message:
|
98
|
+
rdoc_options: []
|
99
|
+
require_paths:
|
100
|
+
- lib
|
101
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
102
|
+
none: false
|
103
|
+
requirements:
|
104
|
+
- - ! '>='
|
105
|
+
- !ruby/object:Gem::Version
|
106
|
+
version: '0'
|
107
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
108
|
+
none: false
|
109
|
+
requirements:
|
110
|
+
- - ! '>='
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
version: '0'
|
113
|
+
requirements: []
|
114
|
+
rubyforge_project:
|
115
|
+
rubygems_version: 1.8.24
|
116
|
+
signing_key:
|
117
|
+
specification_version: 3
|
118
|
+
summary: Nyan Cat inspired RSpec formatter! Now with more Jazz!
|
119
|
+
test_files:
|
120
|
+
- spec/nyan_cat_formatter_spec.rb
|
121
|
+
- spec/nyan_cat_music_formatter_spec.rb
|
122
|
+
- spec/smooth_jazz_nyan_cat_formatter_spec.rb
|
123
|
+
- spec/smooth_jazz_nyan_cat_music_formatter_spec.rb
|
124
|
+
- spec/spec_helper.rb
|