football_formatter 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.
- checksums.yaml +15 -0
- 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 +13 -0
- data/Rakefile +6 -0
- data/data/nyan-cat.mp3 +0 -0
- data/demo.rb +30 -0
- data/football_formatter.gemspec +22 -0
- data/lib/nyan_cat_format/music.rb +80 -0
- data/lib/nyan_cat_format/wide.rb +20 -0
- data/lib/nyan_cat_formatter/rspec1.rb +56 -0
- data/lib/nyan_cat_formatter/rspec2.rb +39 -0
- data/lib/nyan_cat_formatter.rb +226 -0
- data/lib/nyan_cat_music_formatter.rb +7 -0
- data/lib/nyan_cat_wide_formatter.rb +7 -0
- data/lib/nyan_cat_wide_music_formatter.rb +9 -0
- data/nyan_example.gif +0 -0
- data/spec/nyan_cat_formatter_spec.rb +205 -0
- data/spec/nyan_cat_music_formatter_spec.rb +85 -0
- data/spec/nyan_cat_wide_formatter_spec.rb +44 -0
- data/spec/spec_helper.rb +3 -0
- metadata +102 -0
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
MGUwODhhODMxY2NmZjA2ODk2MDNhMjIzNzAxMjk5NDI2OTk0OTk4Nw==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
YzQxNWZlMWM0NzgzMGZjOWY3NzczZGIzNzFkNGVmYzJkMzY1MGZkNA==
|
7
|
+
SHA512:
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
MjA1ZWY4OGMzYWMyOWMxOWY2NDQxMjdmNTU1Y2VmMjI0YTZiMjk4MjYwMTIz
|
10
|
+
MzRmNjZkM2Q2NDc2ZTBhMjY1NGI0ZjAxZjhjMmY3MzgyNDdiYmU4ZTdjNDJj
|
11
|
+
OWRlOWMxZDFkOTNlNTIzMGMxNmUwMGM1ZjM2ZGM0NGJhNzkwNGI=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
Njc1ZTFmMjZiYjhmM2E2N2FhNzE1MmE3OTlhNTliOTAwZDRiYWZlN2FkMmE2
|
14
|
+
ZDU2YTlkYzk3YjgwZDBkMWU1MTdjYzljMmRiNTgxNGE2OTViYWE5NjE3MTFl
|
15
|
+
M2FlZjNmZTY0MzQ0MGUwMGUyODU4MTRiNTA1MDUwOTJhZWZhMGQ=
|
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,13 @@
|
|
1
|
+
RSpec Football Formatter
|
2
|
+
========
|
3
|
+
|
4
|
+
Initial release of a football themed rspec formatter built from Matt Sears Nyan Cat Formatter.
|
5
|
+
|
6
|
+
Next challenge:
|
7
|
+
Make the colors and quarterback names customizable for each NFL team.
|
8
|
+
|
9
|
+
|
10
|
+
Author
|
11
|
+
----------
|
12
|
+
[Matt Sears](http://www.mattsears.com) :: @mattsears
|
13
|
+
Ben Cutrell :: @bcutrell
|
data/Rakefile
ADDED
data/data/nyan-cat.mp3
ADDED
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,0,0,0,0,0,0,0,0,0,1,
|
13
|
+
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,22 @@
|
|
1
|
+
$:.push File.expand_path("../lib", __FILE__)
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = "football_formatter"
|
5
|
+
s.version = "0"
|
6
|
+
s.authors = ["Matt Sears", "Ben Cutrell"]
|
7
|
+
s.email = ["matt@mattsears.com", "bcutrell13@gmail.com"]
|
8
|
+
s.homepage = "https://github.com/bcutrell/football_formatter"
|
9
|
+
s.summary = %q{football themed rspec formatter, built from nyan-cat-formatter}
|
10
|
+
s.description = s.summary
|
11
|
+
|
12
|
+
s.rubyforge_project = "football_formatter"
|
13
|
+
|
14
|
+
s.files = `git ls-files`.split("\n")
|
15
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
16
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
17
|
+
s.require_paths = ["lib"]
|
18
|
+
|
19
|
+
s.add_dependency "rspec", ">= 2.13"
|
20
|
+
|
21
|
+
s.add_development_dependency "rake"
|
22
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
module NyanCatFormat
|
2
|
+
module Music
|
3
|
+
|
4
|
+
MUSIC_LENGTH = 27.06 # seconds
|
5
|
+
|
6
|
+
def osx?
|
7
|
+
platform.downcase.include?("darwin")
|
8
|
+
end
|
9
|
+
|
10
|
+
def linux?
|
11
|
+
platform.downcase.include?('linux')
|
12
|
+
end
|
13
|
+
|
14
|
+
def kernel=(kernel)
|
15
|
+
@kernel = kernel
|
16
|
+
end
|
17
|
+
|
18
|
+
def kernel
|
19
|
+
@kernel ||= Kernel
|
20
|
+
end
|
21
|
+
|
22
|
+
def platform=(platform)
|
23
|
+
@platform = platform
|
24
|
+
end
|
25
|
+
|
26
|
+
def platform
|
27
|
+
@platform ||= RUBY_PLATFORM
|
28
|
+
end
|
29
|
+
|
30
|
+
def nyan_mp3
|
31
|
+
File.expand_path('../../../data/nyan-cat.mp3', __FILE__)
|
32
|
+
end
|
33
|
+
|
34
|
+
def start input
|
35
|
+
super
|
36
|
+
t = Thread.new do
|
37
|
+
loop do
|
38
|
+
if osx?
|
39
|
+
kernel.system("afplay #{nyan_mp3} &")
|
40
|
+
elsif linux?
|
41
|
+
play_on_linux
|
42
|
+
end
|
43
|
+
Thread.current["started_playing"] ||= true
|
44
|
+
sleep MUSIC_LENGTH
|
45
|
+
end
|
46
|
+
end
|
47
|
+
until t["started_playing"]
|
48
|
+
sleep 0.001
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def kill_music
|
53
|
+
if File.exists? nyan_mp3
|
54
|
+
if osx?
|
55
|
+
system("killall -9 afplay &>/dev/null")
|
56
|
+
elsif linux?
|
57
|
+
kill_music_on_linux
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def dump_summary(duration, example_count, failure_count, pending_count)
|
63
|
+
kill_music
|
64
|
+
super
|
65
|
+
end
|
66
|
+
|
67
|
+
private
|
68
|
+
|
69
|
+
def play_on_linux
|
70
|
+
kernel.system("[ -e #{nyan_mp3} ] && type mpg321 &>/dev/null && mpg321 #{nyan_mp3} &>/dev/null &") if kernel.system('which mpg321 &>/dev/null && type mpg321 &>/dev/null')
|
71
|
+
kernel.system("[ -e #{nyan_mp3} ] && type mpg123 &>/dev/null && mpg123 #{nyan_mp3} &>/dev/null &") if kernel.system('which mpg123 &>/dev/null && type mpg123 &>/dev/null')
|
72
|
+
end
|
73
|
+
|
74
|
+
def kill_music_on_linux
|
75
|
+
system("killall -9 mpg321 &>/dev/null") if kernel.system("which mpg321 &>/dev/null && type mpg321 &>/dev/null")
|
76
|
+
system("killall -9 mpg123 &>/dev/null") if kernel.system("which mpg123 &>/dev/null && type mpg123 &>/dev/null")
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module NyanCatFormat
|
2
|
+
module Wide
|
3
|
+
|
4
|
+
def example_width(example = current)
|
5
|
+
net_width_for(example) - net_width_for(example - 1)
|
6
|
+
end
|
7
|
+
|
8
|
+
def net_width_for(example)
|
9
|
+
@net_width ||= {}
|
10
|
+
|
11
|
+
@net_width[example] ||= begin
|
12
|
+
return 0 if example < 0
|
13
|
+
net_width = terminal_width - padding_width - cat_length
|
14
|
+
rough_example_width = (net_width * example.to_f / @example_count.to_f)
|
15
|
+
rough_example_width.round
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
module RSpec1
|
2
|
+
|
3
|
+
def start(example_count)
|
4
|
+
super(example_count)
|
5
|
+
@example_count = example_count
|
6
|
+
@current = @color_index = @passing_count = @failure_count = @pending_count = 0
|
7
|
+
@example_results = []
|
8
|
+
end
|
9
|
+
|
10
|
+
def example_passed(example)
|
11
|
+
super
|
12
|
+
@passing_count += 1
|
13
|
+
tick PASS
|
14
|
+
end
|
15
|
+
|
16
|
+
def example_pending(example, message = nil)
|
17
|
+
super
|
18
|
+
@pending_count =+1
|
19
|
+
tick PENDING
|
20
|
+
end
|
21
|
+
|
22
|
+
def example_failed(example, counter = nil, failure = nil)
|
23
|
+
super
|
24
|
+
@failure_count =+1
|
25
|
+
tick FAIL
|
26
|
+
end
|
27
|
+
|
28
|
+
def start_dump
|
29
|
+
@current = @example_count
|
30
|
+
end
|
31
|
+
|
32
|
+
def dump_pending
|
33
|
+
output.puts "\e[0;33m"
|
34
|
+
super
|
35
|
+
end
|
36
|
+
|
37
|
+
def dump_failure(*args)
|
38
|
+
output.puts "\e[0;31m"
|
39
|
+
super
|
40
|
+
end
|
41
|
+
|
42
|
+
def dump_summary(duration, example_count, failure_count, pending_count)
|
43
|
+
@output.puts "\nYou've Nyaned for #{format_duration(duration)}\n".each_char.map {|c| rainbowify(c)}.join
|
44
|
+
summary = "#{example_count} Wins #{'s' unless example_count == 1}, #{failure_count} Loses #{'s' unless failure_count == 1}"
|
45
|
+
summary << ", #{pending_count} pending" if pending_count > 0
|
46
|
+
|
47
|
+
if failure_count == 0
|
48
|
+
@output.puts failure_color(summary)
|
49
|
+
elsif pending_count > 0
|
50
|
+
@output.puts pending_color(summary)
|
51
|
+
else
|
52
|
+
@output.puts success_color(summary)
|
53
|
+
end
|
54
|
+
@output.flush
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module RSpec2
|
2
|
+
|
3
|
+
def start(example_count)
|
4
|
+
super(example_count)
|
5
|
+
@current = @color_index = @passing_count = 0
|
6
|
+
@example_results = []
|
7
|
+
end
|
8
|
+
|
9
|
+
def example_passed(example)
|
10
|
+
super(example)
|
11
|
+
tick PASS
|
12
|
+
end
|
13
|
+
|
14
|
+
def example_pending(example)
|
15
|
+
super(example)
|
16
|
+
@pending_count +=1
|
17
|
+
tick PENDING
|
18
|
+
end
|
19
|
+
|
20
|
+
def example_failed(example)
|
21
|
+
super(example)
|
22
|
+
@failure_count +=1
|
23
|
+
tick FAIL
|
24
|
+
end
|
25
|
+
|
26
|
+
def start_dump
|
27
|
+
@current = @example_count
|
28
|
+
end
|
29
|
+
|
30
|
+
def dump_summary(duration, example_count, failure_count, pending_count)
|
31
|
+
dump_profile if profile_examples? && failure_count == 0
|
32
|
+
summary = "\nTom Brady has been throwing footballs for #{format_duration(duration)}\n".split(//).map { |c| rainbowify(c) }
|
33
|
+
output.puts summary.join
|
34
|
+
output.puts colorise_summary(summary_line(example_count, failure_count, pending_count))
|
35
|
+
if respond_to?(:dump_commands_to_rerun_failed_examples)
|
36
|
+
dump_commands_to_rerun_failed_examples
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,226 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
rspec_bin = $0.split('/').last
|
4
|
+
if rspec_bin == 'spec'
|
5
|
+
['spec', 'nyan_cat_formatter/rspec1', 'spec/runner/formatter/base_text_formatter'].each {|f| require f}
|
6
|
+
parent_class = Spec::Runner::Formatter::BaseTextFormatter
|
7
|
+
rspec_module = RSpec1
|
8
|
+
else
|
9
|
+
['nyan_cat_formatter/rspec2', 'rspec/core/formatters/base_text_formatter'].each {|f| require f}
|
10
|
+
parent_class = RSpec::Core::Formatters::BaseTextFormatter
|
11
|
+
rspec_module = RSpec2
|
12
|
+
end
|
13
|
+
|
14
|
+
NyanCatFormatter = Class.new(parent_class) do
|
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")
|
125
|
+
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
|
+
" ( || || )",
|
140
|
+
" '.// \\\\.'",
|
141
|
+
" `'-=..=-'`"
|
142
|
+
],
|
143
|
+
[ " _.-=""=-._ ",
|
144
|
+
" .'\\\\-++++-//'.",
|
145
|
+
" ( || || )",
|
146
|
+
" '.// \\\\.'",
|
147
|
+
" `'-=..=-'`"
|
148
|
+
]
|
149
|
+
]
|
150
|
+
end
|
151
|
+
|
152
|
+
# Colorizes the string with raindow colors of the rainbow
|
153
|
+
#
|
154
|
+
# @params string [String]
|
155
|
+
# @return [String]
|
156
|
+
def rainbowify(string)
|
157
|
+
c = colors[@color_index % colors.size]
|
158
|
+
@color_index += 1
|
159
|
+
"#{ESC}38;5;#{c}m#{string}#{NND}"
|
160
|
+
end
|
161
|
+
|
162
|
+
# Calculates the colors of the rainbow
|
163
|
+
#
|
164
|
+
# @return [Array]
|
165
|
+
def colors
|
166
|
+
@colors ||= (0...(6 * 7)).map do |n|
|
167
|
+
pi_3 = Math::PI / 3
|
168
|
+
n *= 1.0 / 6
|
169
|
+
r = (3 * Math.sin(n ) + 3).to_i
|
170
|
+
g = (3 * Math.sin(n + 2 * pi_3) + 3).to_i
|
171
|
+
b = (3 * Math.sin(n + 4 * pi_3) + 3).to_i
|
172
|
+
36 * r + 6 * g + b + 16
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
# Determines how to color the example. If pass, it is rainbowified, otherwise
|
177
|
+
# we assign red if failed or yellow if an error occurred.
|
178
|
+
#
|
179
|
+
# @return [String]
|
180
|
+
def highlight(mark = PASS)
|
181
|
+
case mark
|
182
|
+
when PASS; rainbowify PASS_ARY[@color_index%2]
|
183
|
+
when FAIL; "\e[31m#{mark}\e[0m"
|
184
|
+
when ERROR; "\e[33m#{mark}\e[0m"
|
185
|
+
when PENDING; "\e[33m#{mark}\e[0m"
|
186
|
+
else mark
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
# Converts a float of seconds into a minutes/seconds string
|
191
|
+
#
|
192
|
+
# @return [String]
|
193
|
+
def format_duration(duration)
|
194
|
+
seconds = ((duration % 60) * 100.0).round / 100.0 # 1.8.7 safe .round(2)
|
195
|
+
seconds = seconds.to_i if seconds.to_i == seconds # drop that zero if it's not needed
|
196
|
+
|
197
|
+
message = "#{seconds} second#{seconds == 1 ? "" : "s"}"
|
198
|
+
message = "#{(duration / 60).to_i} minute#{(duration / 60).to_i == 1 ? "" : "s"} and " + message if duration >= 60
|
199
|
+
|
200
|
+
message
|
201
|
+
end
|
202
|
+
|
203
|
+
|
204
|
+
# Determines if the specs have completed
|
205
|
+
#
|
206
|
+
# @returns [Boolean] true if finished; false otherwise
|
207
|
+
def finished?
|
208
|
+
(@current == @example_count)
|
209
|
+
end
|
210
|
+
|
211
|
+
# Determines if the any specs failed or are in pending state
|
212
|
+
#
|
213
|
+
# @returns [Boolean] true if failed or pending; false otherwise
|
214
|
+
def failed_or_pending?
|
215
|
+
(@failure_count.to_i > 0 || @pending_count.to_i > 0)
|
216
|
+
end
|
217
|
+
|
218
|
+
# Returns the cat length
|
219
|
+
#
|
220
|
+
# @returns [Fixnum]
|
221
|
+
def cat_length
|
222
|
+
nyan_cat.split("\n").group_by(&:size).max.first
|
223
|
+
end
|
224
|
+
|
225
|
+
end
|
226
|
+
|
data/nyan_example.gif
ADDED
Binary file
|
@@ -0,0 +1,205 @@
|
|
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 == [
|
38
|
+
'_,------, ',
|
39
|
+
'_| /\_/\ ',
|
40
|
+
'~|_( ^ .^) ',
|
41
|
+
' "" "" '
|
42
|
+
].join("\n")
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'should update the scoreboard' do
|
46
|
+
@formatter.scoreboard.size.should == 4
|
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 == [
|
66
|
+
'_,------, ',
|
67
|
+
'_| /\_/\ ',
|
68
|
+
'~|_( o .o) ',
|
69
|
+
' "" "" '
|
70
|
+
].join("\n")
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
describe 'example_failed' do
|
76
|
+
|
77
|
+
it 'should call the increment method' do
|
78
|
+
@formatter.should_receive :tick
|
79
|
+
@formatter.example_failed(@example)
|
80
|
+
end
|
81
|
+
|
82
|
+
it 'should increment the failure count' do
|
83
|
+
lambda { @formatter.example_failed(@example)}.
|
84
|
+
should change(@formatter, :failure_count).by(1)
|
85
|
+
end
|
86
|
+
|
87
|
+
it 'should alert Nyan Cat' do
|
88
|
+
@formatter.example_failed(@example)
|
89
|
+
@formatter.nyan_cat.should == [
|
90
|
+
'_,------, ',
|
91
|
+
'_| /\_/\ ',
|
92
|
+
'~|_( o .o) ',
|
93
|
+
' "" "" '
|
94
|
+
].join("\n")
|
95
|
+
end
|
96
|
+
|
97
|
+
it 'should kill nyan if the specs are finished' do
|
98
|
+
@formatter.example_failed(@example)
|
99
|
+
@formatter.stub(:finished?).and_return(true)
|
100
|
+
@formatter.nyan_cat.should == [
|
101
|
+
'_,------, ',
|
102
|
+
'_| /\_/\ ',
|
103
|
+
'~|_( x .x) ',
|
104
|
+
' "" "" '
|
105
|
+
].join("\n")
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
describe 'tick' do
|
112
|
+
|
113
|
+
before do
|
114
|
+
@formatter.stub!(:current).and_return(1)
|
115
|
+
@formatter.stub!(:example_count).and_return(2)
|
116
|
+
@formatter.tick
|
117
|
+
end
|
118
|
+
|
119
|
+
it 'should increment the current' do
|
120
|
+
@formatter.current.should == 1
|
121
|
+
end
|
122
|
+
|
123
|
+
it 'should store the marks in an array' do
|
124
|
+
@formatter.example_results.should include('=')
|
125
|
+
end
|
126
|
+
|
127
|
+
end
|
128
|
+
|
129
|
+
describe 'rainbowify' do
|
130
|
+
|
131
|
+
it 'should increment the color index count' do
|
132
|
+
lambda { @formatter.rainbowify('=') }.should change(@formatter, :color_index).by(1)
|
133
|
+
end
|
134
|
+
|
135
|
+
end
|
136
|
+
|
137
|
+
describe 'highlight' do
|
138
|
+
|
139
|
+
it 'should rainbowify passing examples' do
|
140
|
+
@formatter.highlight('=').should == "\e[38;5;154m-\e[0m"
|
141
|
+
end
|
142
|
+
|
143
|
+
it 'should mark failing examples as red' do
|
144
|
+
@formatter.highlight('*').should == "\e[31m*\e[0m"
|
145
|
+
end
|
146
|
+
|
147
|
+
it 'should mark pending examples as yellow' do
|
148
|
+
@formatter.highlight('!').should == "\e[33m!\e[0m"
|
149
|
+
end
|
150
|
+
|
151
|
+
end
|
152
|
+
|
153
|
+
describe 'start' do
|
154
|
+
|
155
|
+
it 'should set the total amount of specs' do
|
156
|
+
@formatter.example_count.should == 2
|
157
|
+
end
|
158
|
+
|
159
|
+
it 'should set the current to 0' do
|
160
|
+
@formatter.current.should == 0
|
161
|
+
end
|
162
|
+
|
163
|
+
end
|
164
|
+
|
165
|
+
describe "#format_duration" do
|
166
|
+
it "should return just seconds for sub 60 seconds" do
|
167
|
+
@formatter.format_duration(5.3).should eq("5.3 seconds")
|
168
|
+
end
|
169
|
+
|
170
|
+
it "should remove that extra zero if it is not needed" do
|
171
|
+
@formatter.format_duration(1.0).should eq("1 second")
|
172
|
+
end
|
173
|
+
|
174
|
+
it "should plurlaize seconds" do
|
175
|
+
@formatter.format_duration(1.1).should eq("1.1 seconds")
|
176
|
+
end
|
177
|
+
|
178
|
+
it "add a minute if it is just over 60 seconds" do
|
179
|
+
@formatter.format_duration(63.2543456456).should eq("1 minute and 3.25 seconds")
|
180
|
+
end
|
181
|
+
|
182
|
+
it "should pluralize minutes" do
|
183
|
+
@formatter.format_duration(987.34).should eq("16 minutes and 27.34 seconds")
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
describe "example width" do
|
188
|
+
[15, 36, 60].each do |n|
|
189
|
+
context "for #{n} examples" do
|
190
|
+
before { @formatter.start(n) }
|
191
|
+
|
192
|
+
[0.25, 0.5, 0.75].each do |p|
|
193
|
+
i = (n * p).to_i
|
194
|
+
before { i.times { @formatter.tick } }
|
195
|
+
|
196
|
+
context "when in example #{i}" do
|
197
|
+
it "should return 1 as the example width" do
|
198
|
+
@formatter.example_width.should == 1
|
199
|
+
end
|
200
|
+
end
|
201
|
+
end
|
202
|
+
end
|
203
|
+
end
|
204
|
+
end
|
205
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'stringio'
|
3
|
+
require 'nyan_cat_music_formatter'
|
4
|
+
|
5
|
+
class MockKernel
|
6
|
+
def system(string)
|
7
|
+
seen << string
|
8
|
+
end
|
9
|
+
|
10
|
+
def seen
|
11
|
+
@seen ||= []
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
describe NyanCatMusicFormatter do
|
16
|
+
let(:path_to_mp3) { NyanCatMusicFormatter.new(NyanCatFormatter).nyan_mp3 }
|
17
|
+
let(:stdout) { StringIO.new }
|
18
|
+
let(:formatter) { described_class.new stdout }
|
19
|
+
let(:mock_kernel) { MockKernel.new }
|
20
|
+
|
21
|
+
before { formatter.kernel = mock_kernel }
|
22
|
+
|
23
|
+
describe 'kernel' do
|
24
|
+
it 'defaults to Kernel' do
|
25
|
+
described_class.new(stdout).kernel.should == Kernel
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'can be set' do
|
29
|
+
formatter = described_class.new stdout
|
30
|
+
formatter.kernel = 'something else'
|
31
|
+
formatter.kernel.should == 'something else'
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe 'platform' do
|
36
|
+
it 'defaults to RUBY_PLATFORM' do
|
37
|
+
described_class.new(stdout).platform.should eq RUBY_PLATFORM
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'can be set' do
|
41
|
+
formatter = described_class.new stdout
|
42
|
+
formatter.platform = 'something else'
|
43
|
+
formatter.platform.should == 'something else'
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
describe 'start' do
|
48
|
+
it 'sets the total amount of specs' do
|
49
|
+
formatter.start 3
|
50
|
+
formatter.example_count.should == 3
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'sets the current to 0' do
|
54
|
+
formatter.start 3
|
55
|
+
formatter.current.should == 0
|
56
|
+
end
|
57
|
+
|
58
|
+
context 'when on OS X' do
|
59
|
+
before { formatter.platform = 'darwin' }
|
60
|
+
|
61
|
+
it 'plays the song in the background' do
|
62
|
+
formatter.start 3
|
63
|
+
mock_kernel.seen.should include "afplay #{path_to_mp3} &"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
context 'when on linux' do
|
68
|
+
before { formatter.platform = 'linux'}
|
69
|
+
it 'plays the song for linux too' do
|
70
|
+
formatter.start 10
|
71
|
+
mock_kernel.seen.any? { |entry| entry. end_with? "mpg321 #{path_to_mp3} &>/dev/null &" }.should be
|
72
|
+
mock_kernel.seen.any? { |entry| entry. end_with? "mpg123 #{path_to_mp3} &>/dev/null &" }.should be
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
context 'when not on OS X' do
|
77
|
+
before { formatter.platform = 'windows' }
|
78
|
+
|
79
|
+
it 'does not play the song' do
|
80
|
+
formatter.start 4
|
81
|
+
mock_kernel.seen.should be_empty
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'stringio'
|
3
|
+
require 'nyan_cat_wide_formatter'
|
4
|
+
|
5
|
+
describe NyanCatWideFormatter do
|
6
|
+
before do
|
7
|
+
@output = StringIO.new
|
8
|
+
@formatter = NyanCatWideFormatter.new(@output)
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "cat situation" do
|
12
|
+
before do
|
13
|
+
@formatter.stub!(:terminal_width).and_return(100)
|
14
|
+
@formatter.stub!(:cat_length).and_return(11)
|
15
|
+
@whole_net_width = 100 - 2*2 - 6 - 11
|
16
|
+
end
|
17
|
+
|
18
|
+
context "for 35 examples" do
|
19
|
+
before do
|
20
|
+
@formatter.start(35)
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should calculate the net width for example 3" do
|
24
|
+
@formatter.net_width_for(3).should == (@whole_net_width * 3.0 / 35.0).round
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should calculate the net width for example 30" do
|
28
|
+
@formatter.net_width_for(5).should == (@whole_net_width * 5.0 / 35.0).round
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
context "for 50 examples" do
|
33
|
+
before { @formatter.start(50) }
|
34
|
+
|
35
|
+
it "should calculate the net width for example 1" do
|
36
|
+
@formatter.net_width_for(1).should == (@whole_net_width * 1.0 / 50.0).round
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should calculate the net width for example 25" do
|
40
|
+
@formatter.net_width_for(25).should == (@whole_net_width * 25.0 / 50.0).round
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,102 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: football_formatter
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '0'
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Matt Sears
|
8
|
+
- Ben Cutrell
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-09-15 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rspec
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - ! '>='
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '2.13'
|
21
|
+
type: :runtime
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ! '>='
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: '2.13'
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: rake
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - ! '>='
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '0'
|
35
|
+
type: :development
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ! '>='
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0'
|
42
|
+
description: football themed rspec formatter, built from nyan-cat-formatter
|
43
|
+
email:
|
44
|
+
- matt@mattsears.com
|
45
|
+
- bcutrell13@gmail.com
|
46
|
+
executables: []
|
47
|
+
extensions: []
|
48
|
+
extra_rdoc_files: []
|
49
|
+
files:
|
50
|
+
- .gitignore
|
51
|
+
- .rspec
|
52
|
+
- .rvmrc
|
53
|
+
- .travis.yml
|
54
|
+
- CHANGELOG.md
|
55
|
+
- Gemfile
|
56
|
+
- LICENSE.md
|
57
|
+
- README.md
|
58
|
+
- Rakefile
|
59
|
+
- data/nyan-cat.mp3
|
60
|
+
- demo.rb
|
61
|
+
- football_formatter.gemspec
|
62
|
+
- lib/nyan_cat_format/music.rb
|
63
|
+
- lib/nyan_cat_format/wide.rb
|
64
|
+
- lib/nyan_cat_formatter.rb
|
65
|
+
- lib/nyan_cat_formatter/rspec1.rb
|
66
|
+
- lib/nyan_cat_formatter/rspec2.rb
|
67
|
+
- lib/nyan_cat_music_formatter.rb
|
68
|
+
- lib/nyan_cat_wide_formatter.rb
|
69
|
+
- lib/nyan_cat_wide_music_formatter.rb
|
70
|
+
- nyan_example.gif
|
71
|
+
- spec/nyan_cat_formatter_spec.rb
|
72
|
+
- spec/nyan_cat_music_formatter_spec.rb
|
73
|
+
- spec/nyan_cat_wide_formatter_spec.rb
|
74
|
+
- spec/spec_helper.rb
|
75
|
+
homepage: https://github.com/bcutrell/football_formatter
|
76
|
+
licenses: []
|
77
|
+
metadata: {}
|
78
|
+
post_install_message:
|
79
|
+
rdoc_options: []
|
80
|
+
require_paths:
|
81
|
+
- lib
|
82
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
83
|
+
requirements:
|
84
|
+
- - ! '>='
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: '0'
|
87
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
88
|
+
requirements:
|
89
|
+
- - ! '>='
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
version: '0'
|
92
|
+
requirements: []
|
93
|
+
rubyforge_project: football_formatter
|
94
|
+
rubygems_version: 2.1.3
|
95
|
+
signing_key:
|
96
|
+
specification_version: 4
|
97
|
+
summary: football themed rspec formatter, built from nyan-cat-formatter
|
98
|
+
test_files:
|
99
|
+
- spec/nyan_cat_formatter_spec.rb
|
100
|
+
- spec/nyan_cat_music_formatter_spec.rb
|
101
|
+
- spec/nyan_cat_wide_formatter_spec.rb
|
102
|
+
- spec/spec_helper.rb
|