wally 0.0.17 → 0.0.18
Sign up to get free protection for your applications and to get access to all the features.
- data/features/counts.feature +19 -0
- data/features/notifications.feature +1 -1
- data/features/step_definitions/browse_features_steps.rb +6 -0
- data/lib/wally/application.rb +4 -3
- data/lib/wally/counts_tags.rb +2 -2
- data/lib/wally/lists_features.rb +3 -1
- data/lib/wally/public/skin.css +6 -0
- data/lib/wally/version.rb +1 -1
- data/lib/wally/views/feature.haml +3 -0
- data/lib/wally/views/layout.haml +9 -2
- data/lib/wally/views/scenario.haml +15 -2
- data/spec/wally/counts_tags_spec.rb +12 -0
- metadata +22 -20
@@ -0,0 +1,19 @@
|
|
1
|
+
Feature: Counts
|
2
|
+
In order to understand the size of the project
|
3
|
+
As a stakeholder
|
4
|
+
I want a visual indication of the number of tags, scenarios and features
|
5
|
+
|
6
|
+
Scenario: Tags, scenarios, and features count
|
7
|
+
Given a feature file named "sample.feature" with the contents:
|
8
|
+
"""
|
9
|
+
@tag1
|
10
|
+
Feature: Tag Feature
|
11
|
+
@tag2 @multiple
|
12
|
+
Scenario: Tag Foo 1
|
13
|
+
@tag3 @multiple
|
14
|
+
Scenario: Tag Bar 2
|
15
|
+
"""
|
16
|
+
When I visit the home page
|
17
|
+
Then I should see a heading "Features (1)"
|
18
|
+
And I should see a heading "Tags (4)"
|
19
|
+
And I should see a heading "Scenarios (2)"
|
@@ -44,3 +44,9 @@ end
|
|
44
44
|
Then /^the features are ordered alphabetically$/ do
|
45
45
|
page.body.should =~ /Elle Macpherson.*Jessica-Jane Clement.*Kate Moss.*Katie Price/m
|
46
46
|
end
|
47
|
+
|
48
|
+
|
49
|
+
Then /^I should see a heading "([^"]*)"$/ do |text|
|
50
|
+
page.body.should have_content text
|
51
|
+
end
|
52
|
+
|
data/lib/wally/application.rb
CHANGED
@@ -13,13 +13,14 @@ before do
|
|
13
13
|
@features = @lists_features.features
|
14
14
|
@tag_count = Wally::CountsTags.new(@lists_features).count_tags
|
15
15
|
@excessive_wip_tags = @tag_count["@wip"] >= 10
|
16
|
+
@scenario_count = @features.to_s.scan(/scenario/).length
|
16
17
|
end
|
17
18
|
|
18
19
|
get '/?' do
|
19
20
|
haml :index
|
20
21
|
end
|
21
22
|
|
22
|
-
get '/features/:feature/?' do |feature|
|
23
|
+
get '/features/:feature/?' do |feature|
|
23
24
|
@features.each do |feature_hash|
|
24
25
|
@feature = feature_hash if feature_hash["id"] == feature
|
25
26
|
end
|
@@ -40,7 +41,7 @@ get '/features/:feature/scenario/:scenario/?' do |feature_id, scenario_id|
|
|
40
41
|
if element["type"] == "background"
|
41
42
|
@background = element
|
42
43
|
end
|
43
|
-
if element["type"] == "scenario" && element["id"] == "#{feature_id};#{scenario_id}"
|
44
|
+
if (element["type"] == "scenario" || element["type"] == "scenario_outline") && element["id"] == "#{feature_id};#{scenario_id}"
|
44
45
|
@scenario = element
|
45
46
|
end
|
46
47
|
end
|
@@ -58,7 +59,7 @@ def get_sorted_scenarios(feature)
|
|
58
59
|
|
59
60
|
if feature["elements"]
|
60
61
|
feature["elements"].each do |element|
|
61
|
-
if element["type"] == "scenario"
|
62
|
+
if element["type"] == "scenario" || element["type"] == "scenario_outline"
|
62
63
|
scenarios << element
|
63
64
|
end
|
64
65
|
end
|
data/lib/wally/counts_tags.rb
CHANGED
@@ -8,14 +8,14 @@ module Wally
|
|
8
8
|
@lists_features.features.inject(Hash.new(0)) do |tag_count, feature|
|
9
9
|
if feature["tags"]
|
10
10
|
feature["tags"].each do |tag|
|
11
|
-
tag_count[tag["name"]] += 1
|
11
|
+
tag_count[tag["name"].downcase] += 1
|
12
12
|
end
|
13
13
|
end
|
14
14
|
if feature["elements"]
|
15
15
|
feature["elements"].each do |element|
|
16
16
|
if element["tags"]
|
17
17
|
element["tags"].each do |tag|
|
18
|
-
tag_count[tag["name"]] += 1
|
18
|
+
tag_count[tag["name"].downcase] += 1
|
19
19
|
end
|
20
20
|
end
|
21
21
|
end
|
data/lib/wally/lists_features.rb
CHANGED
@@ -18,7 +18,9 @@ module Wally
|
|
18
18
|
def features
|
19
19
|
features = []
|
20
20
|
Dir.glob("#{@feature_path}/*.feature").each do |path|
|
21
|
-
|
21
|
+
gherkinese = parse_gherkin(File.read(path))
|
22
|
+
gherkinese["path"] = path
|
23
|
+
features << gherkinese
|
22
24
|
end
|
23
25
|
features.sort {|a,b| a["name"] <=> b["name"]}
|
24
26
|
end
|
data/lib/wally/public/skin.css
CHANGED
@@ -72,6 +72,7 @@ input, textarea, select, .uneditable-input {
|
|
72
72
|
.sidebar {
|
73
73
|
padding-top: 18px;
|
74
74
|
padding-right: 19px;
|
75
|
+
padding-bottom: 200px;
|
75
76
|
border-right: 1px solid #dfdfdf;
|
76
77
|
}
|
77
78
|
|
@@ -102,6 +103,11 @@ p {
|
|
102
103
|
content: "\2691";
|
103
104
|
}
|
104
105
|
|
106
|
+
section.scenarios {
|
107
|
+
border-bottom: 1px dotted #ccc;
|
108
|
+
margin-bottom: 18px;
|
109
|
+
}
|
110
|
+
|
105
111
|
section.feature p:first-child {
|
106
112
|
white-space: pre-wrap
|
107
113
|
}
|
data/lib/wally/version.rb
CHANGED
data/lib/wally/views/layout.haml
CHANGED
@@ -17,13 +17,20 @@
|
|
17
17
|
%input.btn{:type => "submit", :id => "search", :value => "Search"}
|
18
18
|
%div.container-fluid
|
19
19
|
%div.sidebar
|
20
|
+
%ul
|
21
|
+
%li
|
22
|
+
%a{:href => "/search?q="}
|
23
|
+
= "Scenarios (#{@scenario_count})"
|
24
|
+
%li
|
25
|
+
%a{:href => "/"}
|
26
|
+
= "Features (#{@features.length})"
|
20
27
|
%h2
|
21
28
|
Features
|
22
29
|
%ul
|
23
30
|
- @features.each do |feature|
|
24
31
|
= haml :feature_link, {:locals => {:feature => feature}, :layout => false}
|
25
32
|
- if @tag_count.any?
|
26
|
-
%h2 Tags
|
33
|
+
%h2 Tags (#{@tag_count.length})
|
27
34
|
%ul
|
28
35
|
- @tag_count.each do |tag, count|
|
29
36
|
%li
|
@@ -33,5 +40,5 @@
|
|
33
40
|
- if @excessive_wip_tags
|
34
41
|
%div.alert-message.error
|
35
42
|
%p
|
36
|
-
= "You have #{@tag_count["@wip"]} @wip tags"
|
43
|
+
= "You have #{@tag_count["@wip"]} @wip tags :("
|
37
44
|
= yield
|
@@ -8,7 +8,7 @@
|
|
8
8
|
- @background["steps"].each do |step|
|
9
9
|
%p
|
10
10
|
%span.step-keyword
|
11
|
-
|
11
|
+
&= step["keyword"]
|
12
12
|
= step["name"]
|
13
13
|
- if @scenario["steps"]
|
14
14
|
%h3 Steps:
|
@@ -16,7 +16,20 @@
|
|
16
16
|
%p
|
17
17
|
%span.step-keyword
|
18
18
|
= step["keyword"]
|
19
|
-
= step["name"]
|
19
|
+
= escape_once(step["name"])
|
20
20
|
- else
|
21
21
|
%p{:class => 'nosteps'}
|
22
22
|
= "Where's Wally? This scenario has no steps!?"
|
23
|
+
- if @scenario["examples"]
|
24
|
+
%h3 Examples:
|
25
|
+
%table
|
26
|
+
- @scenario["examples"].first["rows"].each_with_index do |row, index|
|
27
|
+
%tr
|
28
|
+
- row["cells"].each do |cell|
|
29
|
+
- if index === 0
|
30
|
+
%th
|
31
|
+
= escape_once(cell)
|
32
|
+
- else
|
33
|
+
%td
|
34
|
+
= escape_once(cell)
|
35
|
+
|
@@ -38,5 +38,17 @@ module Wally
|
|
38
38
|
"@tag3" => 1
|
39
39
|
}
|
40
40
|
end
|
41
|
+
|
42
|
+
it "counts feature tags irrespective of their case" do
|
43
|
+
write_feature("feature-1.feature", "@tag1\nFeature: Feature 1")
|
44
|
+
write_feature("feature-2.feature", "@TAG1\nFeature: Feature 2")
|
45
|
+
write_feature("feature-3.feature", "Feature: Feature 2\n@TAG1\nScenario: Scenario 1")
|
46
|
+
lists_features = ListsFeatures.new("application-features")
|
47
|
+
|
48
|
+
CountsTags.new(lists_features).count_tags.should == {
|
49
|
+
"@tag1" => 3
|
50
|
+
}
|
51
|
+
end
|
52
|
+
|
41
53
|
end
|
42
54
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wally
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.18
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-11-
|
12
|
+
date: 2011-11-27 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: sinatra
|
16
|
-
requirement: &
|
16
|
+
requirement: &70275484147260 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70275484147260
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: haml
|
27
|
-
requirement: &
|
27
|
+
requirement: &70275484146640 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70275484146640
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: rdiscount
|
38
|
-
requirement: &
|
38
|
+
requirement: &70275484145140 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70275484145140
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: gherkin
|
49
|
-
requirement: &
|
49
|
+
requirement: &70275484144540 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70275484144540
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: komainu
|
60
|
-
requirement: &
|
60
|
+
requirement: &70275484143720 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: '0'
|
66
66
|
type: :runtime
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *70275484143720
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: cucumber
|
71
|
-
requirement: &
|
71
|
+
requirement: &70275484140820 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ! '>='
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: '0'
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *70275484140820
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: capybara
|
82
|
-
requirement: &
|
82
|
+
requirement: &70275484134100 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ! '>='
|
@@ -87,10 +87,10 @@ dependencies:
|
|
87
87
|
version: '0'
|
88
88
|
type: :development
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *70275484134100
|
91
91
|
- !ruby/object:Gem::Dependency
|
92
92
|
name: rspec
|
93
|
-
requirement: &
|
93
|
+
requirement: &70275484133480 !ruby/object:Gem::Requirement
|
94
94
|
none: false
|
95
95
|
requirements:
|
96
96
|
- - ! '>='
|
@@ -98,10 +98,10 @@ dependencies:
|
|
98
98
|
version: '0'
|
99
99
|
type: :development
|
100
100
|
prerelease: false
|
101
|
-
version_requirements: *
|
101
|
+
version_requirements: *70275484133480
|
102
102
|
- !ruby/object:Gem::Dependency
|
103
103
|
name: fakefs
|
104
|
-
requirement: &
|
104
|
+
requirement: &70275484132820 !ruby/object:Gem::Requirement
|
105
105
|
none: false
|
106
106
|
requirements:
|
107
107
|
- - ! '>='
|
@@ -109,7 +109,7 @@ dependencies:
|
|
109
109
|
version: '0'
|
110
110
|
type: :development
|
111
111
|
prerelease: false
|
112
|
-
version_requirements: *
|
112
|
+
version_requirements: *70275484132820
|
113
113
|
description: ''
|
114
114
|
email:
|
115
115
|
- andrew.vos@gmail.com
|
@@ -131,6 +131,7 @@ files:
|
|
131
131
|
- example-features/generic/multiple-scenarios.feature
|
132
132
|
- example-features/too-many-wip-tags/too-many-wip-tags.feature
|
133
133
|
- features/browse_features.feature
|
134
|
+
- features/counts.feature
|
134
135
|
- features/list_tags.feature
|
135
136
|
- features/notifications.feature
|
136
137
|
- features/search_features.feature
|
@@ -186,6 +187,7 @@ specification_version: 3
|
|
186
187
|
summary: ''
|
187
188
|
test_files:
|
188
189
|
- features/browse_features.feature
|
190
|
+
- features/counts.feature
|
189
191
|
- features/list_tags.feature
|
190
192
|
- features/notifications.feature
|
191
193
|
- features/search_features.feature
|