cuporter 0.2.4 → 0.2.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/Rakefile +3 -2
- data/lib/cuporter/example_set_node.rb +0 -4
- data/lib/cuporter/feature_parser.rb +7 -5
- data/lib/cuporter/formatters/cuporter.css +9 -2
- data/lib/cuporter/formatters/html_node_writer.rb +4 -1
- data/lib/cuporter/node.rb +3 -16
- data/lib/cuporter/tag_list_node.rb +15 -0
- data/lib/cuporter/tag_report.rb +2 -2
- metadata +21 -19
- data/features/pretty_print.feature +0 -7
- data/features/step_definitions/cuporter_steps.rb +0 -8
- data/features/support/env.rb +0 -2
- data/spec/cuporter/example_set_node_spec.rb +0 -26
- data/spec/cuporter/feature_parser_spec.rb +0 -78
- data/spec/cuporter/functional/scenario_outlines_spec.rb +0 -431
- data/spec/cuporter/functional/single_feature_spec.rb +0 -65
- data/spec/cuporter/node_numberer_spec.rb +0 -80
- data/spec/cuporter/node_spec.rb +0 -81
- data/spec/cuporter/sort_node_spec.rb +0 -187
- data/spec/cuporter/support/functional/cli.rb +0 -10
- data/spec/cuporter/tag_list_node_spec.rb +0 -289
- data/spec/spec_helper.rb +0 -8
data/Rakefile
CHANGED
@@ -56,7 +56,7 @@ namespace :cuporter do
|
|
56
56
|
|
57
57
|
spec = Gem::Specification.new do |s|
|
58
58
|
s.name = 'cuporter'
|
59
|
-
s.version = '0.2.
|
59
|
+
s.version = '0.2.5'
|
60
60
|
s.rubyforge_project = s.name
|
61
61
|
|
62
62
|
s.platform = Gem::Platform::RUBY
|
@@ -69,11 +69,12 @@ namespace :cuporter do
|
|
69
69
|
s.email = 'twcamper@thoughtworks.com'
|
70
70
|
s.homepage = 'http://github.com/twcamper/cuporter'
|
71
71
|
s.required_ruby_version = '>= 1.8.7'
|
72
|
+
s.add_dependency('builder', '>= 2.1.2')
|
72
73
|
s.default_executable = "cuporter"
|
73
74
|
s.executables = [s.default_executable]
|
74
75
|
|
75
76
|
s.files = %w(LICENSE README.textile Rakefile) +
|
76
|
-
FileList["lib/**/*.{rb,css}", "
|
77
|
+
FileList["lib/**/*.{rb,css}", "bin/*"].to_a
|
77
78
|
|
78
79
|
s.require_path = "lib"
|
79
80
|
end
|
@@ -10,16 +10,17 @@ module Cuporter
|
|
10
10
|
EXAMPLE_SET_LINE = /^\s*(Examples:[^#]*)$/
|
11
11
|
EXAMPLE_LINE = /^\s*(\|.*\|)\s*$/
|
12
12
|
|
13
|
-
def initialize
|
13
|
+
def initialize(file)
|
14
|
+
@file = file
|
14
15
|
@current_tags = []
|
15
16
|
end
|
16
17
|
|
17
|
-
def self.parse(
|
18
|
-
self.new.parse
|
18
|
+
def self.parse(file)
|
19
|
+
self.new(file).parse
|
19
20
|
end
|
20
21
|
|
21
|
-
def parse
|
22
|
-
lines =
|
22
|
+
def parse
|
23
|
+
lines = File.read(@file).split(/\n/)
|
23
24
|
|
24
25
|
lines.each_with_index do |line, i|
|
25
26
|
case line
|
@@ -28,6 +29,7 @@ module Cuporter
|
|
28
29
|
@current_tags |= $1.strip.split(/\s+/)
|
29
30
|
when FEATURE_LINE
|
30
31
|
@feature = TagListNode.new($1, @current_tags)
|
32
|
+
@feature.file = @file.sub(/^.*features\//,"features/")
|
31
33
|
@current_tags = []
|
32
34
|
when SCENARIO_LINE
|
33
35
|
# How do we know when we have read all the lines from a "Scenario Outline:"?
|
@@ -34,8 +34,8 @@ ul {
|
|
34
34
|
.feature_name {
|
35
35
|
margin-left: -2em;
|
36
36
|
padding-left: 2em;
|
37
|
-
padding-top: 0.
|
38
|
-
padding-bottom: 0.
|
37
|
+
padding-top: 0.3em;
|
38
|
+
padding-bottom: 0.3em;
|
39
39
|
font-weight: bold;
|
40
40
|
background-color: #24A6C1;
|
41
41
|
color: white;
|
@@ -68,4 +68,11 @@ ul {
|
|
68
68
|
left: 4.5em;
|
69
69
|
font-weight: bold;
|
70
70
|
}
|
71
|
+
.file {
|
72
|
+
float: right;
|
73
|
+
padding-right: 0.5em;
|
74
|
+
font-weight: normal;
|
75
|
+
font-size: 1.1em;
|
76
|
+
color: black;
|
71
77
|
|
78
|
+
}
|
@@ -29,7 +29,10 @@ module Cuporter
|
|
29
29
|
|
30
30
|
def write_node_name(node)
|
31
31
|
builder.span("#{node.number}.", :class => :number) if node.number
|
32
|
-
builder.div(
|
32
|
+
builder.div(:class => "#{node_class(node.name)}_name") do
|
33
|
+
builder.span(node.name)
|
34
|
+
builder.span(node.file, :class => :file) if node.file
|
35
|
+
end
|
33
36
|
end
|
34
37
|
|
35
38
|
def write_children(node)
|
data/lib/cuporter/node.rb
CHANGED
@@ -3,8 +3,9 @@ module Cuporter
|
|
3
3
|
class Node
|
4
4
|
include Comparable
|
5
5
|
|
6
|
-
attr_reader :name
|
7
|
-
attr_accessor :number
|
6
|
+
attr_reader :name
|
7
|
+
attr_accessor :children, :number, :file
|
8
|
+
|
8
9
|
|
9
10
|
def initialize(name)
|
10
11
|
@name = name.to_s.strip
|
@@ -67,20 +68,6 @@ module Cuporter
|
|
67
68
|
end
|
68
69
|
alias :== :eql?
|
69
70
|
|
70
|
-
# Have my children adopt the other node's grandchildren.
|
71
|
-
#
|
72
|
-
# Copy children of other node's top-level, direct descendants to this
|
73
|
-
# node's direct descendants of the same name.
|
74
|
-
def merge(other)
|
75
|
-
other.children.each do |other_child|
|
76
|
-
direct_child = find_or_create_child(other_child.name)
|
77
|
-
new_grandchild = Node.new(other.name)
|
78
|
-
other_child.children.collect do |c|
|
79
|
-
new_grandchild.add_child(c)
|
80
|
-
end
|
81
|
-
direct_child.add_child(new_grandchild)
|
82
|
-
end
|
83
|
-
end
|
84
71
|
|
85
72
|
def total
|
86
73
|
number_all_descendants unless @numberer
|
@@ -21,5 +21,20 @@ module Cuporter
|
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
|
+
# Have my children adopt the other node's grandchildren.
|
25
|
+
#
|
26
|
+
# Copy children of other node's top-level, direct descendants to this
|
27
|
+
# node's direct descendants of the same name.
|
28
|
+
def merge(other)
|
29
|
+
other.children.each do |other_child|
|
30
|
+
direct_child = find_or_create_child(other_child.name)
|
31
|
+
new_grandchild = Node.new(other.name)
|
32
|
+
new_grandchild.children = other_child.children
|
33
|
+
new_grandchild.file = other.file
|
34
|
+
|
35
|
+
direct_child.add_child(new_grandchild)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
24
39
|
end
|
25
40
|
end
|
data/lib/cuporter/tag_report.rb
CHANGED
@@ -13,8 +13,8 @@ module Cuporter
|
|
13
13
|
def scenarios_per_tag
|
14
14
|
tags = TagListNode.new("report",[])
|
15
15
|
files.each do |file|
|
16
|
-
|
17
|
-
tags.merge(
|
16
|
+
feature = FeatureParser.parse(file)
|
17
|
+
tags.merge(feature) if feature
|
18
18
|
end
|
19
19
|
tags.sort_all_descendants!
|
20
20
|
tags
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cuporter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 29
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 2
|
9
|
-
-
|
10
|
-
version: 0.2.
|
9
|
+
- 5
|
10
|
+
version: 0.2.5
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Tim Camper
|
@@ -15,10 +15,25 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-09-
|
18
|
+
date: 2010-09-14 00:00:00 -04:00
|
19
19
|
default_executable: cuporter
|
20
|
-
dependencies:
|
21
|
-
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: builder
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 15
|
30
|
+
segments:
|
31
|
+
- 2
|
32
|
+
- 1
|
33
|
+
- 2
|
34
|
+
version: 2.1.2
|
35
|
+
type: :runtime
|
36
|
+
version_requirements: *id001
|
22
37
|
description: Scrapes Cucumber *.feature files to build report on tag usage
|
23
38
|
email: twcamper@thoughtworks.com
|
24
39
|
executables:
|
@@ -48,19 +63,6 @@ files:
|
|
48
63
|
- lib/cuporter/tag_report.rb
|
49
64
|
- lib/cuporter.rb
|
50
65
|
- lib/cuporter/formatters/cuporter.css
|
51
|
-
- spec/cuporter/node_spec.rb
|
52
|
-
- spec/cuporter/sort_node_spec.rb
|
53
|
-
- spec/cuporter/feature_parser_spec.rb
|
54
|
-
- spec/cuporter/support/functional/cli.rb
|
55
|
-
- spec/cuporter/node_numberer_spec.rb
|
56
|
-
- spec/cuporter/example_set_node_spec.rb
|
57
|
-
- spec/cuporter/functional/scenario_outlines_spec.rb
|
58
|
-
- spec/cuporter/functional/single_feature_spec.rb
|
59
|
-
- spec/cuporter/tag_list_node_spec.rb
|
60
|
-
- spec/spec_helper.rb
|
61
|
-
- features/pretty_print.feature
|
62
|
-
- features/support/env.rb
|
63
|
-
- features/step_definitions/cuporter_steps.rb
|
64
66
|
- bin/cuporter
|
65
67
|
has_rdoc: true
|
66
68
|
homepage: http://github.com/twcamper/cuporter
|
data/features/support/env.rb
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
module Cuporter
|
3
|
-
describe ExampleSetNode do
|
4
|
-
context 'empty' do
|
5
|
-
it 'raises no error when numbering' do
|
6
|
-
node = ExampleSetNode.new("Scenarios: stuff", [])
|
7
|
-
expect do
|
8
|
-
node.number_all_descendants
|
9
|
-
end.to_not raise_error
|
10
|
-
node.total.should == 0
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
context 'with children' do
|
15
|
-
it 'does not count first or "header" row' do
|
16
|
-
node = ExampleSetNode.new("Scenarios: stuff", [])
|
17
|
-
node.add_child(Node.new("|col1|col2|"))
|
18
|
-
node.add_child(Node.new("|val1|val2|"))
|
19
|
-
|
20
|
-
node.number_all_descendants
|
21
|
-
node.children.first.number.should be_nil
|
22
|
-
node.children.last.number.should == 1
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
@@ -1,78 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
module Cuporter
|
4
|
-
describe FeatureParser do
|
5
|
-
context "#tags" do
|
6
|
-
context "one tag" do
|
7
|
-
it "returns one tag" do
|
8
|
-
feature = FeatureParser.parse("@wip\nFeature: foo")
|
9
|
-
feature.tags.should == ["@wip"]
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
context "two tags on one line" do
|
14
|
-
it "returns two tags" do
|
15
|
-
feature = FeatureParser.parse(" \n@smoke @wip\nFeature: foo")
|
16
|
-
feature.tags.sort.should == %w[@smoke @wip].sort
|
17
|
-
end
|
18
|
-
end
|
19
|
-
context "two tags on two lines" do
|
20
|
-
it "returns two tags" do
|
21
|
-
feature = FeatureParser.parse(" \n@smoke\n @wip\nFeature: foo")
|
22
|
-
feature.tags.sort.should == %w[@smoke @wip].sort
|
23
|
-
end
|
24
|
-
end
|
25
|
-
context "no tags" do
|
26
|
-
it "returns no tags" do
|
27
|
-
feature = FeatureParser.parse("\nFeature: foo")
|
28
|
-
feature.tags.should == []
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
end
|
33
|
-
|
34
|
-
context "#name" do
|
35
|
-
let(:name) {"Feature: consume a fairly typical feature name, and barf it back up"}
|
36
|
-
context "sentence with comma" do
|
37
|
-
it "returns the full name" do
|
38
|
-
feature = FeatureParser.parse("\n#{name}\n Background: blah")
|
39
|
-
feature.name.should == name
|
40
|
-
end
|
41
|
-
end
|
42
|
-
context "name followed by comment" do
|
43
|
-
it "returns only the full name" do
|
44
|
-
feature = FeatureParser.parse("# Here is a feature comment\n# And another comment\n #{name} # comment text here\n Background: blah")
|
45
|
-
feature.name.should == name
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
end
|
50
|
-
|
51
|
-
context "#parse" do
|
52
|
-
context "table which is not an example set" do
|
53
|
-
it "does not raise an error" do
|
54
|
-
content = <<EOF
|
55
|
-
|
56
|
-
Feature: table not examples
|
57
|
-
|
58
|
-
Scenario: no examples under here
|
59
|
-
Given foo
|
60
|
-
When bar
|
61
|
-
Then wow:
|
62
|
-
| All |
|
63
|
-
| Some |
|
64
|
-
| Any |
|
65
|
-
| Few |
|
66
|
-
| Most |
|
67
|
-
EOF
|
68
|
-
|
69
|
-
expect do
|
70
|
-
FeatureParser.parse(content)
|
71
|
-
end.to_not raise_error
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|