shindo 0.1.4 → 0.1.5
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/bin/shindo +3 -80
- data/bin/shindont +4 -0
- data/lib/shindo.rb +17 -42
- data/lib/shindo/bin.rb +83 -0
- data/lib/shindo/taciturn.rb +65 -0
- data/lib/shindo/verbose.rb +45 -0
- data/shindo.gemspec +6 -2
- metadata +7 -3
data/bin/shindo
CHANGED
@@ -1,81 +1,4 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
@
|
3
|
-
|
4
|
-
|
5
|
-
formatador.display_line('Gracefully Exiting... (ctrl-c to force)')
|
6
|
-
Thread.main[:exit] = true
|
7
|
-
else
|
8
|
-
formatador.display_line('Exiting...')
|
9
|
-
Thread.exit
|
10
|
-
end
|
11
|
-
end
|
12
|
-
Kernel.trap('INT', @interrupt)
|
13
|
-
|
14
|
-
require File.join(File.dirname(__FILE__), '..', 'lib', 'shindo')
|
15
|
-
|
16
|
-
helpers = Dir.glob(File.join(Dir.pwd, 'tests', '**', '*helper.rb')).sort_by {|helper| helper.count(File::SEPARATOR)}
|
17
|
-
tags = []
|
18
|
-
for argument in ARGV
|
19
|
-
if argument.match(/^[\+\-]/)
|
20
|
-
tags << argument
|
21
|
-
else
|
22
|
-
path = File.expand_path(argument)
|
23
|
-
if File.directory?(path)
|
24
|
-
tests ||= []
|
25
|
-
tests |= Dir.glob(File.join(path, '**', '*tests.rb'))
|
26
|
-
elsif File.exists?(path)
|
27
|
-
tests ||= []
|
28
|
-
tests << path
|
29
|
-
else
|
30
|
-
Formatador.display_line("[red][bold]#{argument}[/] [red]does not exist, please fix this path and try again.[/]")
|
31
|
-
Kernel.exit(1)
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
# ARGV was empty or only contained tags
|
37
|
-
unless tests
|
38
|
-
tests = Dir.glob(File.join('tests', '**', '*tests.rb'))
|
39
|
-
end
|
40
|
-
|
41
|
-
@started_at = Time.now
|
42
|
-
def run_in_thread(helpers, tests, tags)
|
43
|
-
shindo = Thread.new {
|
44
|
-
Thread.current[:tags] = tags
|
45
|
-
for file in helpers
|
46
|
-
unless Thread.main[:exit]
|
47
|
-
load(file)
|
48
|
-
end
|
49
|
-
end
|
50
|
-
for file in tests
|
51
|
-
unless Thread.main[:exit]
|
52
|
-
load(file)
|
53
|
-
end
|
54
|
-
end
|
55
|
-
}
|
56
|
-
shindo.join
|
57
|
-
if shindo[:reload]
|
58
|
-
run_in_thread(helpers, tests, tags)
|
59
|
-
else
|
60
|
-
@totals = shindo[:totals]
|
61
|
-
end
|
62
|
-
end
|
63
|
-
run_in_thread(helpers, tests, tags)
|
64
|
-
|
65
|
-
@totals ||= { :failed => 0, :pending => 0, :succeeded => 0 }
|
66
|
-
@success = @totals[:failed] == 0
|
67
|
-
lines = []
|
68
|
-
lines << "[red]#{@totals[:failed]} failed[/]," if @totals[:failed] > 0
|
69
|
-
lines << "[yellow]#{@totals[:pending]} pending[/]," if @totals[:pending] > 0
|
70
|
-
lines << "[green]#{@totals[:succeeded]} succeeded[/]"
|
71
|
-
lines = lines[0...-2].join(', ') << ' and ' << lines[-1] if lines.length > 3
|
72
|
-
lines << "in [bold]#{Time.now - @started_at}[/] seconds"
|
73
|
-
Formatador.display_line
|
74
|
-
Formatador.display_line(lines.join(' '))
|
75
|
-
Formatador.display_line
|
76
|
-
|
77
|
-
if @success
|
78
|
-
Kernel.exit(0)
|
79
|
-
else
|
80
|
-
Kernel.exit(1)
|
81
|
-
end
|
2
|
+
@thread_locals = { :interactive => true }
|
3
|
+
require File.join(File.dirname(__FILE__), '..', 'lib', 'shindo', 'verbose')
|
4
|
+
require File.join(File.dirname(__FILE__), '..', 'lib', 'shindo', 'bin')
|
data/bin/shindont
ADDED
data/lib/shindo.rb
CHANGED
@@ -5,7 +5,7 @@ require 'gestalt'
|
|
5
5
|
module Shindo
|
6
6
|
|
7
7
|
unless const_defined?(:VERSION)
|
8
|
-
VERSION = '0.1.
|
8
|
+
VERSION = '0.1.5'
|
9
9
|
end
|
10
10
|
|
11
11
|
def self.tests(description = nil, tags = [], &block)
|
@@ -18,7 +18,8 @@ module Shindo
|
|
18
18
|
def initialize(description, tags = [], &block)
|
19
19
|
@afters = []
|
20
20
|
@befores = []
|
21
|
-
@
|
21
|
+
@description_stack = []
|
22
|
+
@tag_stack = []
|
22
23
|
Thread.current[:formatador] = Formatador.new
|
23
24
|
Thread.current[:reload] = false
|
24
25
|
Thread.current[:tags] ||= []
|
@@ -35,7 +36,6 @@ module Shindo
|
|
35
36
|
end
|
36
37
|
Thread.current[:formatador].display_line
|
37
38
|
tests(description, tags, &block)
|
38
|
-
Thread.current[:formatador].display_line
|
39
39
|
end
|
40
40
|
|
41
41
|
def after(&block)
|
@@ -60,13 +60,14 @@ module Shindo
|
|
60
60
|
unless tags.empty?
|
61
61
|
description << " (#{tags.join(', ')})"
|
62
62
|
end
|
63
|
+
@description_stack.push(description)
|
63
64
|
|
64
65
|
# if the test includes +tags and discludes -tags, evaluate it
|
65
66
|
if (@if_tagged.empty? || !(@if_tagged & @tag_stack.flatten).empty?) &&
|
66
67
|
(@unless_tagged.empty? || (@unless_tagged & @tag_stack.flatten).empty?)
|
67
68
|
if block_given?
|
68
69
|
begin
|
69
|
-
|
70
|
+
display_description(description)
|
70
71
|
Thread.current[:formatador].indent { instance_eval(&block) }
|
71
72
|
rescue => error
|
72
73
|
display_error(error)
|
@@ -75,14 +76,15 @@ module Shindo
|
|
75
76
|
@description = description
|
76
77
|
end
|
77
78
|
else
|
78
|
-
|
79
|
+
display_description("[light_black]#{description}[/]")
|
79
80
|
end
|
80
81
|
|
82
|
+
@description_stack.pop
|
81
83
|
@afters.pop
|
82
84
|
@befores.pop
|
83
85
|
@tag_stack.pop
|
84
86
|
|
85
|
-
Thread.exit if Thread.
|
87
|
+
Thread.exit if Thread.main[:exit] || Thread.current[:reload]
|
86
88
|
self
|
87
89
|
end
|
88
90
|
|
@@ -103,19 +105,16 @@ module Shindo
|
|
103
105
|
def assert(type, expectation, description, &block)
|
104
106
|
return if Thread.main[:exit] || Thread.current[:reload]
|
105
107
|
description = [@description, description].compact.join(' ')
|
106
|
-
success = nil
|
107
|
-
@gestalt = Gestalt.new({'formatador' => Thread.current[:formatador]})
|
108
108
|
if block_given?
|
109
109
|
begin
|
110
110
|
for before in @befores.flatten.compact
|
111
111
|
before.call
|
112
112
|
end
|
113
|
-
value =
|
114
|
-
success = case type
|
113
|
+
value, success = case type
|
115
114
|
when :raises
|
116
|
-
|
115
|
+
raises?(expectation, &block)
|
117
116
|
when :returns
|
118
|
-
|
117
|
+
returns?(expectation, &block)
|
119
118
|
end
|
120
119
|
for after in @afters.flatten.compact
|
121
120
|
after.call
|
@@ -125,9 +124,9 @@ module Shindo
|
|
125
124
|
value = error
|
126
125
|
end
|
127
126
|
if success
|
128
|
-
|
127
|
+
display_success(description)
|
129
128
|
else
|
130
|
-
|
129
|
+
display_failure(description)
|
131
130
|
case value
|
132
131
|
when Exception, Interrupt
|
133
132
|
display_error(value)
|
@@ -141,35 +140,16 @@ module Shindo
|
|
141
140
|
end
|
142
141
|
@message = nil
|
143
142
|
end
|
144
|
-
if STDOUT.tty?
|
143
|
+
if Thread.current[:interactive] && STDOUT.tty?
|
145
144
|
prompt(description, &block)
|
146
145
|
end
|
147
146
|
end
|
148
147
|
else
|
149
|
-
|
148
|
+
display_pending(description)
|
150
149
|
end
|
151
150
|
success
|
152
151
|
end
|
153
152
|
|
154
|
-
def display_error(error)
|
155
|
-
Thread.current[:formatador].display_line("[red]#{error.message} (#{error.class})[/]")
|
156
|
-
unless error.backtrace.empty?
|
157
|
-
Thread.current[:formatador].indent do
|
158
|
-
Thread.current[:formatador].display_lines(error.backtrace.map {|line| "[red]#{line}[/]"})
|
159
|
-
end
|
160
|
-
end
|
161
|
-
end
|
162
|
-
|
163
|
-
def failure(description, &block)
|
164
|
-
Thread.current[:totals][:failed] += 1
|
165
|
-
Thread.current[:formatador].display_line("[red]- #{description}[/]")
|
166
|
-
end
|
167
|
-
|
168
|
-
def pending(description, &block)
|
169
|
-
Thread.current[:totals][:pending] += 1
|
170
|
-
Thread.current[:formatador].display_line("[yellow]# #{description}[/]")
|
171
|
-
end
|
172
|
-
|
173
153
|
def prompt(description, &block)
|
174
154
|
return if Thread.main[:exit] || Thread.current[:reload]
|
175
155
|
Thread.current[:formatador].display("Action? [c,e,i,q,r,t,?]? ")
|
@@ -211,7 +191,7 @@ module Shindo
|
|
211
191
|
end
|
212
192
|
when 'q', 'quit', 'exit'
|
213
193
|
Thread.current[:formatador].display_line("Exiting...")
|
214
|
-
Thread.
|
194
|
+
Thread.main[:exit] = true
|
215
195
|
when 'r', 'reload'
|
216
196
|
Thread.current[:formatador].display_line("Reloading...")
|
217
197
|
Thread.current[:reload] = true
|
@@ -235,17 +215,12 @@ module Shindo
|
|
235
215
|
end
|
236
216
|
Thread.current[:formatador].display_line
|
237
217
|
end
|
238
|
-
unless continue || Thread.
|
218
|
+
unless continue || Thread.main[:exit]
|
239
219
|
Thread.current[:formatador].display_line("[red]- #{description}[/]")
|
240
220
|
prompt(description, &block)
|
241
221
|
end
|
242
222
|
end
|
243
223
|
|
244
|
-
def success(description, &block)
|
245
|
-
Thread.current[:totals][:succeeded] += 1
|
246
|
-
Thread.current[:formatador].display_line("[green]+ #{description}[/]")
|
247
|
-
end
|
248
|
-
|
249
224
|
end
|
250
225
|
|
251
226
|
end
|
data/lib/shindo/bin.rb
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'shindo')
|
2
|
+
|
3
|
+
@interrupt = lambda do
|
4
|
+
formatador = Thread.current[:formatador] || Formatador
|
5
|
+
unless Thread.main[:exit]
|
6
|
+
formatador.display_line('Gracefully Exiting... (ctrl-c to force)')
|
7
|
+
Thread.main[:exit] = true
|
8
|
+
else
|
9
|
+
formatador.display_line('Exiting...')
|
10
|
+
Thread.exit
|
11
|
+
end
|
12
|
+
end
|
13
|
+
Kernel.trap('INT', @interrupt)
|
14
|
+
|
15
|
+
helpers = Dir.glob(File.join(Dir.pwd, 'tests', '**', '*helper.rb')).sort_by {|helper| helper.count(File::SEPARATOR)}
|
16
|
+
tags = []
|
17
|
+
for argument in ARGV
|
18
|
+
if argument.match(/^[\+\-]/)
|
19
|
+
tags << argument
|
20
|
+
else
|
21
|
+
path = File.expand_path(argument)
|
22
|
+
if File.directory?(path)
|
23
|
+
tests ||= []
|
24
|
+
tests |= Dir.glob(File.join(path, '**', '*tests.rb'))
|
25
|
+
elsif File.exists?(path)
|
26
|
+
tests ||= []
|
27
|
+
tests << path
|
28
|
+
else
|
29
|
+
Formatador.display_line("[red][bold]#{argument}[/] [red]does not exist, please fix this path and try again.[/]")
|
30
|
+
Kernel.exit(1)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# ARGV was empty or only contained tags
|
36
|
+
unless tests
|
37
|
+
tests = Dir.glob(File.join('tests', '**', '*tests.rb'))
|
38
|
+
end
|
39
|
+
|
40
|
+
@started_at = Time.now
|
41
|
+
def run_in_thread(helpers, tests, thread_locals)
|
42
|
+
shindo = Thread.new {
|
43
|
+
for key, value in thread_locals
|
44
|
+
Thread.current[key] = value
|
45
|
+
end
|
46
|
+
for file in helpers
|
47
|
+
unless Thread.main[:exit]
|
48
|
+
Thread.current[:file] = file
|
49
|
+
load(file)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
for file in tests
|
53
|
+
unless Thread.main[:exit]
|
54
|
+
load(file)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
}
|
58
|
+
shindo.join
|
59
|
+
if shindo[:reload]
|
60
|
+
run_in_thread(helpers, tests, thread_locals)
|
61
|
+
else
|
62
|
+
@totals = shindo[:totals]
|
63
|
+
end
|
64
|
+
end
|
65
|
+
run_in_thread(helpers, tests, @thread_locals.merge({:tags => tags}))
|
66
|
+
|
67
|
+
@totals ||= { :failed => 0, :pending => 0, :succeeded => 0 }
|
68
|
+
@success = @totals[:failed] == 0
|
69
|
+
lines = []
|
70
|
+
lines << "[red]#{@totals[:failed]} failed[/]," if @totals[:failed] > 0
|
71
|
+
lines << "[yellow]#{@totals[:pending]} pending[/]," if @totals[:pending] > 0
|
72
|
+
lines << "[green]#{@totals[:succeeded]} succeeded[/]"
|
73
|
+
lines = lines[0...-2].join(', ') << ' and ' << lines[-1] if lines.length > 3
|
74
|
+
lines << "in [bold]#{Time.now - @started_at}[/] seconds"
|
75
|
+
Formatador.display_line
|
76
|
+
Formatador.display_line(lines.join(' '))
|
77
|
+
Formatador.display_line
|
78
|
+
|
79
|
+
if @success
|
80
|
+
Kernel.exit(0)
|
81
|
+
else
|
82
|
+
Kernel.exit(1)
|
83
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module Shindo
|
2
|
+
class Tests
|
3
|
+
|
4
|
+
private
|
5
|
+
|
6
|
+
def display_description_stack(description_stack = @description_stack, formatador = Formatador.new)
|
7
|
+
return if description_stack.empty?
|
8
|
+
formatador.indent do
|
9
|
+
formatador.display_line(description_stack.pop)
|
10
|
+
display_description_stack(description_stack, formatador)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def display_description(description)
|
15
|
+
unless @indented
|
16
|
+
print ' '
|
17
|
+
@indented = true
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def display_error(error)
|
22
|
+
Thread.current[:formatador].display_line
|
23
|
+
Thread.current[:formatador].display_line(Thread.current[:file])
|
24
|
+
display_description_stack
|
25
|
+
Thread.current[:formatador].display_line("[red]#{error.message} (#{error.class})[/]")
|
26
|
+
unless error.backtrace.empty?
|
27
|
+
Thread.current[:formatador].indent do
|
28
|
+
Thread.current[:formatador].display_lines(error.backtrace.map {|line| "[red]#{line}[/]"})
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def display_failure(description)
|
34
|
+
Thread.current[:totals][:failed] += 1
|
35
|
+
Thread.current[:formatador].display_line
|
36
|
+
Thread.current[:formatador].display_line(Thread.current[:file])
|
37
|
+
display_description_stack
|
38
|
+
Thread.current[:formatador].display_line("[red]- #{description}[/]")
|
39
|
+
end
|
40
|
+
|
41
|
+
def display_pending(description)
|
42
|
+
Thread.current[:totals][:pending] += 1
|
43
|
+
print Formatador.parse("[yellow]#[/]")
|
44
|
+
end
|
45
|
+
|
46
|
+
def display_success(description)
|
47
|
+
Thread.current[:totals][:succeeded] += 1
|
48
|
+
print Formatador.parse("[green]+[/]")
|
49
|
+
end
|
50
|
+
|
51
|
+
def raises?(expectation, &block)
|
52
|
+
value = begin
|
53
|
+
instance_eval(&block)
|
54
|
+
rescue => error
|
55
|
+
error
|
56
|
+
end
|
57
|
+
[value, value.is_a?(expectation)]
|
58
|
+
end
|
59
|
+
|
60
|
+
def returns?(expectation, &block)
|
61
|
+
[value = instance_eval(&block), value == expectation]
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Shindo
|
2
|
+
class Tests
|
3
|
+
|
4
|
+
private
|
5
|
+
|
6
|
+
def display_description(description)
|
7
|
+
Thread.current[:formatador].display_line(description)
|
8
|
+
end
|
9
|
+
|
10
|
+
def display_error(error)
|
11
|
+
Thread.current[:formatador].display_line("[red]#{error.message} (#{error.class})[/]")
|
12
|
+
unless error.backtrace.empty?
|
13
|
+
Thread.current[:formatador].indent do
|
14
|
+
Thread.current[:formatador].display_lines(error.backtrace.map {|line| "[red]#{line}[/]"})
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def display_failure(description)
|
20
|
+
Thread.current[:totals][:failed] += 1
|
21
|
+
Thread.current[:formatador].display_line("[red]- #{description}[/]")
|
22
|
+
end
|
23
|
+
|
24
|
+
def display_pending(description)
|
25
|
+
Thread.current[:totals][:pending] += 1
|
26
|
+
Thread.current[:formatador].display_line("[yellow]# #{description}[/]")
|
27
|
+
end
|
28
|
+
|
29
|
+
def display_success(description)
|
30
|
+
Thread.current[:totals][:succeeded] += 1
|
31
|
+
Thread.current[:formatador].display_line("[green]+ #{description}[/]")
|
32
|
+
end
|
33
|
+
|
34
|
+
def raises?(expectation, &block)
|
35
|
+
@gestalt = Gestalt.new({'formatador' => Thread.current[:formatador]})
|
36
|
+
[value = @gestalt.run(&block), value.is_a?(expectation)]
|
37
|
+
end
|
38
|
+
|
39
|
+
def returns?(expectation, &block)
|
40
|
+
@gestalt = Gestalt.new({'formatador' => Thread.current[:formatador]})
|
41
|
+
[value = @gestalt.run(&block), value == expectation]
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
data/shindo.gemspec
CHANGED
@@ -13,8 +13,8 @@ Gem::Specification.new do |s|
|
|
13
13
|
## If your rubyforge_project name is different, then edit it and comment out
|
14
14
|
## the sub! line in the Rakefile
|
15
15
|
s.name = 'shindo'
|
16
|
-
s.version = '0.1.
|
17
|
-
s.date = '2010-
|
16
|
+
s.version = '0.1.5'
|
17
|
+
s.date = '2010-06-14'
|
18
18
|
s.rubyforge_project = 'shindo'
|
19
19
|
|
20
20
|
## Make sure your summary is short. The description may be as long
|
@@ -65,8 +65,12 @@ Gem::Specification.new do |s|
|
|
65
65
|
README.rdoc
|
66
66
|
Rakefile
|
67
67
|
bin/shindo
|
68
|
+
bin/shindont
|
68
69
|
lib/shindo.rb
|
70
|
+
lib/shindo/bin.rb
|
69
71
|
lib/shindo/rake.rb
|
72
|
+
lib/shindo/taciturn.rb
|
73
|
+
lib/shindo/verbose.rb
|
70
74
|
shindo.gemspec
|
71
75
|
tests/basic_tests.rb
|
72
76
|
tests/bin_tests.rb
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 1
|
8
|
-
-
|
9
|
-
version: 0.1.
|
8
|
+
- 5
|
9
|
+
version: 0.1.5
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- geemus (Wesley Beary)
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-
|
17
|
+
date: 2010-06-14 00:00:00 -07:00
|
18
18
|
default_executable: shindo
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -59,8 +59,12 @@ files:
|
|
59
59
|
- README.rdoc
|
60
60
|
- Rakefile
|
61
61
|
- bin/shindo
|
62
|
+
- bin/shindont
|
62
63
|
- lib/shindo.rb
|
64
|
+
- lib/shindo/bin.rb
|
63
65
|
- lib/shindo/rake.rb
|
66
|
+
- lib/shindo/taciturn.rb
|
67
|
+
- lib/shindo/verbose.rb
|
64
68
|
- shindo.gemspec
|
65
69
|
- tests/basic_tests.rb
|
66
70
|
- tests/bin_tests.rb
|