specdown 0.4.0.beta.1 → 0.4.0.beta.2
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/CHANGELOG.markdown +4 -0
- data/README.markdown +4 -10
- data/VERSION +1 -1
- data/features/exception_facade.feature +8 -8
- data/features/readme.feature +97 -0
- data/features/report_summary.feature +13 -13
- data/features/step_definitions/exception_facade.rb +1 -1
- data/features/step_definitions/{runner.rb → readme.rb} +2 -2
- data/features/step_definitions/report_summary.rb +1 -1
- data/features/step_definitions/reporter.rb +3 -3
- data/features/step_definitions/test.rb +129 -0
- data/features/test.feature +131 -0
- data/lib/specdown.rb +9 -15
- data/lib/specdown/command.rb +16 -11
- data/lib/specdown/event_handlers/command.rb +4 -0
- data/lib/specdown/event_handlers/readme.rb +7 -0
- data/lib/specdown/event_handlers/test.rb +8 -0
- data/lib/specdown/readme.rb +58 -0
- data/lib/specdown/{runner → readme}/exception_facade.rb +3 -3
- data/lib/specdown/readme/report_summary.rb +37 -0
- data/lib/specdown/readme/stats.rb +29 -0
- data/lib/specdown/reporter.rb +6 -6
- data/lib/specdown/reporters/color_terminal_reporter.rb +2 -2
- data/lib/specdown/reporters/terminal_reporter.rb +6 -6
- data/lib/specdown/reporters/text_reporter.rb +5 -5
- data/lib/specdown/specdown.rb +15 -4
- data/lib/specdown/templates/color_summary.erb +9 -11
- data/lib/specdown/templates/summary.erb +8 -10
- data/lib/specdown/test.rb +37 -0
- data/lib/specdown/tree.rb +0 -3
- metadata +40 -27
- data/features/runner.feature +0 -99
- data/lib/specdown/event_handlers/after_test.rb +0 -4
- data/lib/specdown/event_handlers/before_test.rb +0 -4
- data/lib/specdown/event_handlers/command_complete.rb +0 -4
- data/lib/specdown/event_handlers/run_complete.rb +0 -3
- data/lib/specdown/event_handlers/run_started.rb +0 -3
- data/lib/specdown/event_handlers/test_failed.rb +0 -3
- data/lib/specdown/event_handlers/test_passed.rb +0 -3
- data/lib/specdown/event_handlers/test_pending.rb +0 -3
- data/lib/specdown/event_handlers/test_undefined.rb +0 -3
- data/lib/specdown/hook.rb +0 -20
- data/lib/specdown/hooks.rb +0 -40
- data/lib/specdown/runner.rb +0 -61
- data/lib/specdown/runner/report_summary.rb +0 -37
- data/lib/specdown/runner/stats.rb +0 -31
data/lib/specdown.rb
CHANGED
@@ -2,34 +2,28 @@ require 'kramdown'
|
|
2
2
|
require 'term/ansicolor'
|
3
3
|
require 'erb'
|
4
4
|
require 'optparse'
|
5
|
+
require 'hook'
|
5
6
|
require 'specdown/parser'
|
6
7
|
require 'specdown/implicit_parser'
|
7
8
|
require 'specdown/node'
|
8
9
|
require 'specdown/tree'
|
9
|
-
require 'specdown/
|
10
|
+
require 'specdown/readme'
|
10
11
|
require 'specdown/reporter'
|
11
|
-
require 'specdown/
|
12
|
+
require 'specdown/test'
|
13
|
+
require 'specdown/readme/stats'
|
12
14
|
require 'specdown/command'
|
13
15
|
require 'specdown/event_server'
|
14
|
-
require 'specdown/event_handlers/
|
15
|
-
require 'specdown/event_handlers/
|
16
|
-
require 'specdown/event_handlers/
|
17
|
-
require 'specdown/event_handlers/run_complete'
|
18
|
-
require 'specdown/event_handlers/run_started'
|
19
|
-
require 'specdown/event_handlers/test_failed'
|
20
|
-
require 'specdown/event_handlers/test_passed'
|
21
|
-
require 'specdown/event_handlers/test_pending'
|
22
|
-
require 'specdown/event_handlers/test_undefined'
|
16
|
+
require 'specdown/event_handlers/test'
|
17
|
+
require 'specdown/event_handlers/command'
|
18
|
+
require 'specdown/event_handlers/readme'
|
23
19
|
require 'specdown/pending'
|
24
20
|
require 'specdown/pending_exception'
|
25
21
|
require 'specdown/config'
|
26
22
|
require 'specdown/specdown'
|
27
23
|
require 'specdown/sandbox_factory'
|
28
|
-
require 'specdown/hooks'
|
29
|
-
require 'specdown/hook'
|
30
24
|
require 'specdown/command/option_parser'
|
31
|
-
require 'specdown/
|
32
|
-
require 'specdown/
|
25
|
+
require 'specdown/readme/report_summary'
|
26
|
+
require 'specdown/readme/exception_facade'
|
33
27
|
require 'specdown/reporters/terminal_reporter'
|
34
28
|
require 'specdown/reporters/color_terminal_reporter'
|
35
29
|
require 'specdown/reporters/text_reporter'
|
data/lib/specdown/command.rb
CHANGED
@@ -1,9 +1,20 @@
|
|
1
1
|
module Specdown
|
2
2
|
class Command
|
3
|
+
include ::Hook
|
4
|
+
hook :execute
|
5
|
+
|
6
|
+
attr_reader :readmes
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
@readmes = []
|
10
|
+
end
|
11
|
+
|
3
12
|
def execute
|
4
|
-
|
5
|
-
|
6
|
-
|
13
|
+
with_hooks :execute do
|
14
|
+
load_test_environment
|
15
|
+
parse_options
|
16
|
+
run
|
17
|
+
end
|
7
18
|
end
|
8
19
|
|
9
20
|
private
|
@@ -18,15 +29,9 @@ module Specdown
|
|
18
29
|
end
|
19
30
|
|
20
31
|
def run
|
21
|
-
@results = []
|
22
|
-
|
23
|
-
Kernel.at_exit do
|
24
|
-
Specdown::EventServer.event :command_complete, @results
|
25
|
-
end
|
26
|
-
|
27
32
|
Specdown::Config.tests.each do |markdown|
|
28
|
-
@
|
29
|
-
@
|
33
|
+
@readmes << Specdown::Readme.new(markdown)
|
34
|
+
@readmes.last.execute
|
30
35
|
end
|
31
36
|
end
|
32
37
|
end
|
@@ -0,0 +1,7 @@
|
|
1
|
+
Specdown::Readme.before_execute do |readme|
|
2
|
+
Specdown.reporter.print_readme_start readme if Specdown::Config.format == :condensed
|
3
|
+
end
|
4
|
+
|
5
|
+
Specdown::Readme.after_execute do |readme|
|
6
|
+
Specdown.reporter.print_readme_end readme if Specdown::Config.format == :condensed
|
7
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
Specdown::Test.after_execute do |test|
|
2
|
+
case test.status
|
3
|
+
when :passing then Specdown.reporter.print_success test
|
4
|
+
when :failing then Specdown.reporter.print_failure test
|
5
|
+
when :undefined then Specdown.reporter.print_undefined test
|
6
|
+
when :pending then Specdown.reporter.print_pending test
|
7
|
+
end
|
8
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module Specdown
|
2
|
+
class Readme
|
3
|
+
include ::Hook
|
4
|
+
hook :execute
|
5
|
+
|
6
|
+
attr_reader :tests, :stats, :file_path
|
7
|
+
|
8
|
+
def initialize(file_path)
|
9
|
+
@file_path = file_path
|
10
|
+
@tests = []
|
11
|
+
@stats = Stats.new self
|
12
|
+
build_tests
|
13
|
+
end
|
14
|
+
|
15
|
+
def exceptions
|
16
|
+
@tests.collect(&:exception).compact
|
17
|
+
end
|
18
|
+
|
19
|
+
def pending_exceptions
|
20
|
+
exceptions.select {|e| e.exception_class == Specdown::PendingException }
|
21
|
+
end
|
22
|
+
|
23
|
+
def undefined_implicits
|
24
|
+
@tests.collect(&:undefined_implicits).flatten
|
25
|
+
end
|
26
|
+
|
27
|
+
def file_name
|
28
|
+
File.basename @file_path
|
29
|
+
end
|
30
|
+
|
31
|
+
def execute
|
32
|
+
with_hooks :execute do
|
33
|
+
@tests.map &:execute
|
34
|
+
end
|
35
|
+
|
36
|
+
self
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
def build_tests
|
41
|
+
tree = Parser.parse File.read(file_path), Specdown::Config.implicit_specs
|
42
|
+
depth_first_search(tree.root)
|
43
|
+
end
|
44
|
+
|
45
|
+
def depth_first_search(node, code=[], undefined_implicits=[])
|
46
|
+
if node.children.empty?
|
47
|
+
test = Specdown::Test.new self
|
48
|
+
test.code = code + [node.code]
|
49
|
+
test.undefined_implicits = undefined_implicits + node.undefined_implicits
|
50
|
+
@tests << test
|
51
|
+
else
|
52
|
+
node.children.each do |child|
|
53
|
+
depth_first_search(child, code + [node.code], undefined_implicits + node.undefined_implicits)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
module Specdown
|
2
2
|
class ExceptionFacade
|
3
|
-
def initialize(exception,
|
3
|
+
def initialize(exception, readme)
|
4
4
|
@exception = exception
|
5
|
-
@
|
5
|
+
@readme = readme
|
6
6
|
end
|
7
7
|
|
8
8
|
def exception_class
|
@@ -18,7 +18,7 @@ module Specdown
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def test_filename
|
21
|
-
@
|
21
|
+
@readme.file_name
|
22
22
|
end
|
23
23
|
end
|
24
24
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Specdown
|
2
|
+
class ReportSummary
|
3
|
+
attr_reader :readmes
|
4
|
+
|
5
|
+
def initialize(readmes)
|
6
|
+
@readmes = readmes.respond_to?(:map) ? readmes : [readmes]
|
7
|
+
end
|
8
|
+
|
9
|
+
def num_markdowns
|
10
|
+
@num_markdowns ||= @readmes.count
|
11
|
+
end
|
12
|
+
|
13
|
+
def num_tests
|
14
|
+
@num_tests ||= @readmes.map(&:stats).map(&:num_tests).inject(0, &:+)
|
15
|
+
end
|
16
|
+
|
17
|
+
def num_pending
|
18
|
+
@num_pending ||= @readmes.map(&:stats).map(&:num_pending).inject(0, &:+)
|
19
|
+
end
|
20
|
+
|
21
|
+
def num_undefined
|
22
|
+
@num_undefined ||= @readmes.map(&:stats).map(&:num_undefined).inject(0, &:+)
|
23
|
+
end
|
24
|
+
|
25
|
+
def num_failing
|
26
|
+
@num_failing ||= @readmes.map(&:stats).map(&:num_failing).inject(0, &:+)
|
27
|
+
end
|
28
|
+
|
29
|
+
def num_passing
|
30
|
+
@num_passing ||= @readmes.map(&:stats).map(&:num_passing).inject(0, &:+)
|
31
|
+
end
|
32
|
+
|
33
|
+
def exceptions
|
34
|
+
@exceptions ||= @readmes.map(&:tests).flatten.map(&:exception).compact
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Specdown
|
2
|
+
class Stats
|
3
|
+
attr_reader :readme
|
4
|
+
|
5
|
+
def initialize(readme=nil)
|
6
|
+
@readme = readme
|
7
|
+
end
|
8
|
+
|
9
|
+
def num_tests
|
10
|
+
@readme.tests.count
|
11
|
+
end
|
12
|
+
|
13
|
+
def num_passing
|
14
|
+
@readme.tests.select {|test| test.status == :passing}.count
|
15
|
+
end
|
16
|
+
|
17
|
+
def num_failing
|
18
|
+
@readme.tests.select {|test| test.status == :failing}.count
|
19
|
+
end
|
20
|
+
|
21
|
+
def num_pending
|
22
|
+
@readme.tests.select {|test| test.status == :pending}.count
|
23
|
+
end
|
24
|
+
|
25
|
+
def num_undefined
|
26
|
+
@readme.tests.select {|test| test.status == :undefined}.count
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/lib/specdown/reporter.rb
CHANGED
@@ -1,22 +1,22 @@
|
|
1
1
|
module Specdown
|
2
2
|
module Reporter
|
3
|
-
def summary(
|
4
|
-
ReportSummary.new(
|
3
|
+
def summary(readmes)
|
4
|
+
ReportSummary.new(readmes)
|
5
5
|
end
|
6
6
|
|
7
7
|
def print_start
|
8
8
|
raise NotImplementedError
|
9
9
|
end
|
10
10
|
|
11
|
-
def
|
11
|
+
def print_readme_start(readme)
|
12
12
|
raise NotImplementedError
|
13
13
|
end
|
14
14
|
|
15
|
-
def
|
15
|
+
def print_readme_summary(readme)
|
16
16
|
raise NotImplementedError
|
17
17
|
end
|
18
18
|
|
19
|
-
def
|
19
|
+
def print_readme_end(readme)
|
20
20
|
raise NotImplementedError
|
21
21
|
end
|
22
22
|
|
@@ -28,7 +28,7 @@ module Specdown
|
|
28
28
|
raise NotImplementedError
|
29
29
|
end
|
30
30
|
|
31
|
-
def print_summary(
|
31
|
+
def print_summary(readmes)
|
32
32
|
raise NotImplementedError
|
33
33
|
end
|
34
34
|
|
@@ -16,8 +16,8 @@ module Specdown
|
|
16
16
|
Term::ANSIColor.yellow super
|
17
17
|
end
|
18
18
|
|
19
|
-
def
|
20
|
-
print Term::ANSIColor.bold("#{
|
19
|
+
def print_readme_start(readme)
|
20
|
+
print Term::ANSIColor.bold("#{readme.file_name}: ")
|
21
21
|
end
|
22
22
|
|
23
23
|
private
|
@@ -24,14 +24,14 @@ module Specdown
|
|
24
24
|
def print_end
|
25
25
|
end
|
26
26
|
|
27
|
-
def
|
28
|
-
print "#{
|
27
|
+
def print_readme_start(readme)
|
28
|
+
print "#{readme.file_name}: "
|
29
29
|
end
|
30
30
|
|
31
|
-
def
|
31
|
+
def print_readme_summary(readme)
|
32
32
|
end
|
33
33
|
|
34
|
-
def
|
34
|
+
def print_readme_end(readme)
|
35
35
|
print "\n"
|
36
36
|
end
|
37
37
|
|
@@ -57,8 +57,8 @@ module Specdown
|
|
57
57
|
print undefined
|
58
58
|
end
|
59
59
|
|
60
|
-
def print_summary(
|
61
|
-
@report_summary = summary(
|
60
|
+
def print_summary(readmes)
|
61
|
+
@report_summary = summary(readmes)
|
62
62
|
bounding = binding rescue proc {}
|
63
63
|
template.run bounding
|
64
64
|
end
|
@@ -11,11 +11,11 @@ module Specdown
|
|
11
11
|
@file.write "\n\n"
|
12
12
|
end
|
13
13
|
|
14
|
-
def
|
15
|
-
@file.write(
|
14
|
+
def print_readme_start(readme)
|
15
|
+
@file.write(readme.file_name + ": ")
|
16
16
|
end
|
17
17
|
|
18
|
-
def
|
18
|
+
def print_readme_end(readme)
|
19
19
|
@file.write "\n\n"
|
20
20
|
end
|
21
21
|
|
@@ -39,8 +39,8 @@ module Specdown
|
|
39
39
|
@file.close
|
40
40
|
end
|
41
41
|
|
42
|
-
def print_summary(
|
43
|
-
@report_summary = summary(
|
42
|
+
def print_summary(readmes)
|
43
|
+
@report_summary = summary(readmes)
|
44
44
|
bounding = binding rescue proc {}
|
45
45
|
@file.write template.result(bounding)
|
46
46
|
end
|
data/lib/specdown/specdown.rb
CHANGED
@@ -3,7 +3,6 @@ module Specdown
|
|
3
3
|
|
4
4
|
def reset!
|
5
5
|
Config.reset!
|
6
|
-
Hooks.reset!
|
7
6
|
end
|
8
7
|
|
9
8
|
def sandbox
|
@@ -15,14 +14,26 @@ module Specdown
|
|
15
14
|
end
|
16
15
|
|
17
16
|
def before(*filters, &callback)
|
18
|
-
|
17
|
+
Specdown::Test.before_execute do |test|
|
18
|
+
if filters.empty? || filters.any? {|filter| filter.match test.readme.file_name}
|
19
|
+
callback.call
|
20
|
+
end
|
21
|
+
end
|
19
22
|
end
|
20
23
|
|
21
24
|
def after(*filters, &callback)
|
22
|
-
|
25
|
+
Specdown::Test.after_execute do |test|
|
26
|
+
if filters.empty? || filters.any? {|filter| filter.match test.readme.file_name}
|
27
|
+
callback.call
|
28
|
+
end
|
29
|
+
end
|
23
30
|
end
|
24
31
|
|
25
32
|
def around(*filters, &callback)
|
26
|
-
|
33
|
+
Specdown::Test.around_execute do |test|
|
34
|
+
if filters.empty? || filters.any? {|filter| filter.match test.readme.file_name}
|
35
|
+
callback.call
|
36
|
+
end
|
37
|
+
end
|
27
38
|
end
|
28
39
|
end
|
@@ -1,27 +1,25 @@
|
|
1
1
|
|
2
2
|
|
3
3
|
---------------------------------------------------------------------------
|
4
|
-
<%= Term::ANSIColor.bold format_stat("markdown", @report_summary.num_markdowns)
|
5
|
-
<%= Term::ANSIColor.bold format_stat("test", @report_summary.num_tests)
|
6
|
-
<%= Term::ANSIColor.cyan format_stat("pending test", @report_summary.
|
7
|
-
<%= Term::ANSIColor.green format_stat("success", @report_summary.
|
8
|
-
<%= Term::ANSIColor.red format_stat("failure", @report_summary.
|
9
|
-
<%= Term::ANSIColor.yellow(@report_summary.num_undefined.to_s + " undefined")
|
4
|
+
<%= Term::ANSIColor.bold format_stat("markdown", @report_summary.num_markdowns) %>
|
5
|
+
<%= Term::ANSIColor.bold format_stat("test", @report_summary.num_tests) %>
|
6
|
+
<%= Term::ANSIColor.cyan format_stat("pending test", @report_summary.num_pending) %>
|
7
|
+
<%= Term::ANSIColor.green format_stat("success", @report_summary.num_passing) %>
|
8
|
+
<%= Term::ANSIColor.red format_stat("failure", @report_summary.num_failing) %>
|
9
|
+
<%= Term::ANSIColor.yellow(@report_summary.num_undefined.to_s + " undefined") %>
|
10
10
|
---------------------------------------------------------------------------
|
11
|
-
<%
|
12
|
-
<% stat.exceptions.each do |e| %>
|
11
|
+
<% readmes.collect(&:exceptions).flatten.each do |e| %>
|
13
12
|
<%= Term::ANSIColor.bold(Term::ANSIColor.cyan "In #{e.test_filename}") %>: <%= Term::ANSIColor.bold(Term::ANSIColor.red "#<#{e.exception_class}>:") %> <%=e.exception_message%>
|
14
13
|
<%= Term::ANSIColor.red e.exception_backtrace.join("\n") %>
|
15
14
|
<% end %>
|
16
|
-
<%
|
17
|
-
<% runners.collect(&:stats).collect(&:pending_exceptions).flatten.each do |pending_exception| %>
|
15
|
+
<% readmes.collect(&:pending_exceptions).flatten.each do |pending_exception| %>
|
18
16
|
<%= Term::ANSIColor.bold(Term::ANSIColor.cyan "In #{pending_exception.test_filename}") %>: <%= Term::ANSIColor.bold(Term::ANSIColor.red "#<#{pending_exception.exception_class}>:") %> <%=pending_exception.exception_message%>
|
19
17
|
<%= Term::ANSIColor.red pending_exception.exception_backtrace.join("\n") %>
|
20
18
|
<% end %>
|
21
19
|
<% if @report_summary.num_undefined > 0 %>
|
22
20
|
<%= Term::ANSIColor.yellow 'Now add the following implicit spec definition to a file suffixed with ".specdown":'%>
|
23
21
|
<% end %>
|
24
|
-
<%
|
22
|
+
<% readmes.collect(&:undefined_implicits).flatten.each do |implicit_key| %>
|
25
23
|
<%= Term::ANSIColor.yellow implicit_key %>
|
26
24
|
<%= Term::ANSIColor.yellow("-" * implicit_key.length) %>
|
27
25
|
|
@@ -1,27 +1,25 @@
|
|
1
1
|
|
2
2
|
|
3
3
|
---------------------------------------------------------------------------
|
4
|
-
<%= format_stat("markdown",
|
5
|
-
<%= format_stat("test",
|
6
|
-
<%= format_stat("pending test",
|
7
|
-
<%= format_stat("success",
|
8
|
-
<%= format_stat("failure",
|
4
|
+
<%= format_stat("markdown", @report_summary.num_markdowns) %>
|
5
|
+
<%= format_stat("test", @report_summary.num_tests) %>
|
6
|
+
<%= format_stat("pending test", @report_summary.num_pending) %>
|
7
|
+
<%= format_stat("success", @report_summary.num_passing) %>
|
8
|
+
<%= format_stat("failure", @report_summary.num_failing) %>
|
9
9
|
<%= @report_summary.num_undefined %> undefined
|
10
10
|
---------------------------------------------------------------------------
|
11
|
-
<%
|
12
|
-
<% stat.exceptions.each do |e| %>
|
11
|
+
<% readmes.collect(&:exceptions).flatten.each do |e| %>
|
13
12
|
In <%=e.test_filename%>: <#<%=e.exception_class%>> <%=e.exception_message%>
|
14
13
|
<%= e.exception_backtrace.join "\n" %>
|
15
14
|
<% end %>
|
16
|
-
<%
|
15
|
+
<% readmes.collect(&:pending_exceptions).flatten.each do |e| %>
|
17
16
|
In <%=e.test_filename%>: <#<%=e.exception_class%>> <%=e.exception_message%>
|
18
17
|
<%= e.exception_backtrace.join "\n" %>
|
19
18
|
<% end %>
|
20
|
-
<% end %>
|
21
19
|
<% if @report_summary.num_undefined > 0 %>
|
22
20
|
Now add the following implicit spec definition to a file suffixed with ".specdown":
|
23
21
|
<% end %>
|
24
|
-
<%
|
22
|
+
<% readmes.collect(&:undefined_implicits).flatten.each do |implicit_key| %>
|
25
23
|
<%= implicit_key %>
|
26
24
|
<%= "-" * implicit_key.length %>
|
27
25
|
|