nuker 0.0.47 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +7 -0
- data/.ruby-version +1 -0
- data/.rvmrc +62 -0
- data/.rvmrc.08.13.2014-14:58:37 +1 -0
- data/.travis.yml +3 -0
- data/Gemfile +4 -0
- data/LICENSE +165 -0
- data/Rakefile +5 -0
- data/bin/nuker +26 -0
- data/config.ru +2 -0
- data/example-features/generic/example-with-background.feature +11 -0
- data/example-features/generic/example-with-data-table.feature +7 -0
- data/example-features/generic/example-with-scenario-outline-examples.feature +11 -0
- data/example-features/generic/example_with_tags.feature +8 -0
- data/example-features/generic/has-lots-of-tags.feature +5 -0
- data/example-features/generic/multiple-scenarios.feature +7 -0
- data/example-features/too-many-wip-tags/too-many-wip-tags.feature +21 -0
- data/features/counts.feature +25 -0
- data/features/feature_page.feature +69 -0
- data/features/list_tags.feature +31 -0
- data/features/notifications.feature +9 -0
- data/features/progress_bar.feature +21 -0
- data/features/project_home.feature +25 -0
- data/features/projects.feature +19 -0
- data/features/push_features.feature +34 -0
- data/features/scenario_page.feature +84 -0
- data/features/search_features.feature +100 -0
- data/features/step_definitions/feature_page_steps.rb +15 -0
- data/features/step_definitions/notifications_steps.rb +11 -0
- data/features/step_definitions/project_home_steps.rb +10 -0
- data/features/step_definitions/projects_steps.rb +28 -0
- data/features/step_definitions/push_features_steps.rb +48 -0
- data/features/step_definitions/scenario_page_steps.rb +29 -0
- data/features/step_definitions/search_features_steps.rb +24 -0
- data/features/step_definitions/steps.rb +35 -0
- data/features/step_definitions/welcome_page.rb +19 -0
- data/features/support/env.rb +33 -0
- data/features/welcome_page.feature +30 -0
- data/lib/nuker/application.rb +161 -0
- data/lib/nuker/counts_tags.rb +27 -0
- data/lib/nuker/feature.rb +16 -0
- data/lib/nuker/parses_features.rb +30 -0
- data/lib/nuker/project.rb +8 -0
- data/lib/nuker/public/bootstrap.min.css +356 -0
- data/lib/nuker/public/nuker-logo.png +0 -0
- data/lib/nuker/public/scripts/projects.js +6 -0
- data/lib/nuker/public/skin.css +208 -0
- data/lib/nuker/public/wally-logo.png +0 -0
- data/lib/nuker/search_features.rb +47 -0
- data/lib/nuker/version.rb +3 -0
- data/lib/nuker/views/feature.haml +19 -0
- data/lib/nuker/views/feature_link.haml +6 -0
- data/lib/nuker/views/layout.haml +53 -0
- data/lib/nuker/views/progress.haml +15 -0
- data/lib/nuker/views/project.haml +0 -0
- data/lib/nuker/views/scenario.haml +31 -0
- data/lib/nuker/views/search.haml +36 -0
- data/lib/nuker/views/table.haml +10 -0
- data/lib/nuker/views/tag_links.haml +4 -0
- data/lib/nuker.rb +7 -0
- data/nuker.gemspec +37 -0
- data/spec/spec_helper.rb +35 -0
- metadata +88 -3
@@ -0,0 +1,47 @@
|
|
1
|
+
require "komainu"
|
2
|
+
|
3
|
+
module Nuker
|
4
|
+
class SearchFeatures
|
5
|
+
def initialize lists_features
|
6
|
+
@lists_features = lists_features
|
7
|
+
end
|
8
|
+
|
9
|
+
def find(query)
|
10
|
+
searchables = []
|
11
|
+
|
12
|
+
@lists_features.features.each do |feature|
|
13
|
+
feature_text = feature.gherkin["name"]
|
14
|
+
if feature.gherkin["tags"]
|
15
|
+
feature_text += " " + feature.gherkin["tags"].map { |tag| tag["name"] }.join(" ")
|
16
|
+
end
|
17
|
+
if feature.gherkin["description"]
|
18
|
+
feature_text += " " + feature.gherkin["description"]
|
19
|
+
end
|
20
|
+
feature_data = OpenStruct.new
|
21
|
+
feature_data.feature = feature.gherkin
|
22
|
+
feature_data.text = feature_text
|
23
|
+
searchables << feature_data
|
24
|
+
|
25
|
+
if feature.gherkin["elements"]
|
26
|
+
feature.gherkin["elements"].each do |element|
|
27
|
+
element_text = [element["name"]]
|
28
|
+
if element["steps"]
|
29
|
+
element_text << element["steps"].map { |s| s["name"] }
|
30
|
+
end
|
31
|
+
if element["tags"]
|
32
|
+
element_text << element["tags"].map { |t| t["name"] }
|
33
|
+
end
|
34
|
+
scenario_data = OpenStruct.new
|
35
|
+
scenario_data.feature = feature.gherkin
|
36
|
+
scenario_data.scenario = element
|
37
|
+
scenario_data.text = element_text.join(" ")
|
38
|
+
searchables << scenario_data
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
searches_text = Komainu::SearchesText.new(searchables)
|
44
|
+
searches_text.search(query[:query])
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
%h2
|
2
|
+
= @feature.gherkin["name"]
|
3
|
+
%p
|
4
|
+
from
|
5
|
+
%em
|
6
|
+
= @feature.path
|
7
|
+
%section{:class=>"scenarios"}
|
8
|
+
%section{:class => 'feature'}
|
9
|
+
:markdown
|
10
|
+
#{@feature.gherkin["description"]}
|
11
|
+
- if @feature.gherkin["description"]
|
12
|
+
%h2 Scenarios
|
13
|
+
%ul
|
14
|
+
- get_sorted_scenarios(@feature).each do |scenario|
|
15
|
+
%li
|
16
|
+
%a{:href => get_scenario_url(scenario)}
|
17
|
+
= scenario["name"]
|
18
|
+
- if scenario["tags"]
|
19
|
+
= haml :tag_links, {:locals => {:tags => scenario["tags"]}, :layout => false}
|
@@ -0,0 +1,53 @@
|
|
1
|
+
!!! 5
|
2
|
+
%html
|
3
|
+
%head
|
4
|
+
%title Nuker
|
5
|
+
%link{:rel => 'stylesheet', :type => 'text/css', :href => '/bootstrap.min.css'}
|
6
|
+
%link{:rel => 'stylesheet', :type => 'text/css', :href => '/skin.css'}
|
7
|
+
%script{:type => "text/javascript", :src => "http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"}
|
8
|
+
%script{:type => "text/javascript", :src => "/scripts/projects.js"}
|
9
|
+
%meta{:'http-equiv' => 'X-UA-Compatible', :content => 'IE=edge,chrome=1'}
|
10
|
+
%meta{:name => 'viewport', :content => 'width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;'}
|
11
|
+
%body
|
12
|
+
%div.container-fluid
|
13
|
+
%div.logo
|
14
|
+
%h1
|
15
|
+
%a{:href => "/#{current_project ? "projects/" + current_project.name : nil}"} Nuker
|
16
|
+
|
17
|
+
%div.project-list
|
18
|
+
%select#projects{:name => "projects"}
|
19
|
+
- Nuker::Project.all.each do |project|
|
20
|
+
%option{ :value => project.name, :selected => project == current_project }
|
21
|
+
= project.name
|
22
|
+
|
23
|
+
%div.search-bar
|
24
|
+
%form{:method => "GET", :action => "/projects/#{current_project.name}/search", :id => "search"}
|
25
|
+
%input{:type => "text", :id => "q", :name => "q", :placeholder => 'text, @tags etc.', :value => @q }
|
26
|
+
%input.btn{:type => "submit", :id => "search", :value => "Search"}
|
27
|
+
%div.container-fluid
|
28
|
+
%div.sidebar
|
29
|
+
%ul
|
30
|
+
%li
|
31
|
+
%a{:href => "/projects/#{current_project.name}/progress"}
|
32
|
+
Progress
|
33
|
+
%h2
|
34
|
+
= "Features (#{current_project.features.count})"
|
35
|
+
%ul
|
36
|
+
- current_project.features.sort{|a,b| a.name <=> b.name}.each do |feature|
|
37
|
+
= haml :feature_link, {:locals => {:feature => feature}, :layout => false}
|
38
|
+
|
39
|
+
%h2
|
40
|
+
= "Tags (#{tag_count.values.sum})"
|
41
|
+
%ul
|
42
|
+
- tag_count.each do |tag, count|
|
43
|
+
%li
|
44
|
+
%a{:href => "/projects/#{current_project.name}/search?q=#{tag}", :class => "tag-#{tag.delete('@')}"}
|
45
|
+
= "#{tag} (#{count})"
|
46
|
+
|
47
|
+
%div.content
|
48
|
+
- if excessive_wip_tags
|
49
|
+
%div.alert-message.error
|
50
|
+
%p
|
51
|
+
= "You have #{tag_count["@wip"]} @wip tags :("
|
52
|
+
= yield
|
53
|
+
|
@@ -0,0 +1,15 @@
|
|
1
|
+
%h2
|
2
|
+
Progress
|
3
|
+
- if tag_count
|
4
|
+
%p
|
5
|
+
This project has #{scenario_count} scenarios, of which :-
|
6
|
+
%ul{:class => 'chartlist'}
|
7
|
+
- tag_count.each do |tag, count|
|
8
|
+
- ratio = (count.to_f / scenario_count) * 100
|
9
|
+
%li{:class => "#{tag.downcase.gsub("@", "")}"}
|
10
|
+
%a{:href => "/projects/#{current_project.name}/search?q=#{tag}"}
|
11
|
+
= "#{tag} (#{ratio.ceil}%)"
|
12
|
+
%span{:class => "count #{tag}"}
|
13
|
+
= ratio.ceil
|
14
|
+
%span{:class => "index", :style => "width: #{ratio.ceil}%"}
|
15
|
+
= ratio
|
File without changes
|
@@ -0,0 +1,31 @@
|
|
1
|
+
%h2
|
2
|
+
%a{"href" => '../'}
|
3
|
+
= @feature.gherkin["name"]
|
4
|
+
%h2
|
5
|
+
= @scenario["name"]
|
6
|
+
- if @scenario["tags"]
|
7
|
+
= haml :tag_links, {:locals => {:tags => @scenario["tags"]}, :layout => false}
|
8
|
+
- if @background
|
9
|
+
%h3
|
10
|
+
= @background["keyword"] + ":"
|
11
|
+
- @background["steps"].each do |step|
|
12
|
+
%p
|
13
|
+
%span.step-keyword
|
14
|
+
&= step["keyword"]
|
15
|
+
= step["name"]
|
16
|
+
- if @scenario["steps"]
|
17
|
+
%h3 Steps:
|
18
|
+
- @scenario["steps"].each do |step|
|
19
|
+
%p
|
20
|
+
%span.step-keyword
|
21
|
+
= step["keyword"]
|
22
|
+
= escape_once(step["name"])
|
23
|
+
- if step["rows"]
|
24
|
+
= haml :table, {:locals => {:rows => step["rows"]}, :layout => false}
|
25
|
+
- else
|
26
|
+
%p{:class => 'alert-message error'}
|
27
|
+
= "Where's Nuker? This scenario has no steps!?"
|
28
|
+
- if @scenario["examples"]
|
29
|
+
%h3 Examples:
|
30
|
+
= haml :table, {:locals => {:rows => @scenario["examples"].first["rows"]}, :layout => false}
|
31
|
+
|
@@ -0,0 +1,36 @@
|
|
1
|
+
- if params[:q]
|
2
|
+
- if params[:q].length > 0
|
3
|
+
%h2
|
4
|
+
= "Search for '#{params[:q]}'"
|
5
|
+
- if @search_results.suggestion
|
6
|
+
%p
|
7
|
+
Did you mean
|
8
|
+
%a{:href => "/projects/#{current_project.name}/search?q=#{@search_results.suggestion}"}
|
9
|
+
= @search_results.suggestion
|
10
|
+
%ul
|
11
|
+
- @search_results.items.map {|i| i.object.feature["id"] }.uniq.each do |current_feature_id|
|
12
|
+
- root_search_result = @search_results.items.find { |r| r.object.feature["id"] == current_feature_id }
|
13
|
+
%li
|
14
|
+
%a{:href => "/projects/#{current_project.name}/features/#{root_search_result.object.feature["id"]}"}
|
15
|
+
= root_search_result.object.feature["name"]
|
16
|
+
- if root_search_result.object.feature["tags"]
|
17
|
+
= haml :tag_links, {:locals => {:tags => root_search_result.object.feature["tags"]}, :layout => false}
|
18
|
+
%p
|
19
|
+
!= highlighted_search_result_blurb root_search_result
|
20
|
+
%ul
|
21
|
+
- @search_results.items.select { |r| r.object.feature["id"] == current_feature_id }.each do |search_result|
|
22
|
+
- if search_result.object.scenario && search_result.object.scenario["id"]
|
23
|
+
%li
|
24
|
+
%a{:href => "/projects/#{current_project.name}/features/#{search_result.object.scenario["id"].gsub(";", "/scenario/")}"}
|
25
|
+
= search_result.object.scenario["name"]
|
26
|
+
- if search_result.object.scenario["tags"]
|
27
|
+
= haml :tag_links, {:locals => {:tags => search_result.object.scenario["tags"]}, :layout => false}
|
28
|
+
%p
|
29
|
+
!= highlighted_search_result_blurb(search_result)
|
30
|
+
- if @search_results.items.empty?
|
31
|
+
%p{:class => 'alert-message error'}
|
32
|
+
Where's Nuker? This search returned no results.
|
33
|
+
|
34
|
+
- else
|
35
|
+
%p{:class => 'alert-message error'}
|
36
|
+
Where's Nuker? This search returned no results.
|
data/lib/nuker.rb
ADDED
data/nuker.gemspec
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "nuker/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "nuker"
|
7
|
+
s.version = Nuker::VERSION
|
8
|
+
s.authors = ["Marc Bluemner"]
|
9
|
+
s.email = ["m.bluemner@liquidlabs.de"]
|
10
|
+
s.homepage = "https://github.com/rocknrollmarc/nuker"
|
11
|
+
s.summary = %q{Cucumber feature viewer and navigator}
|
12
|
+
s.description = %q{Cucumber feature viewer and navigator}
|
13
|
+
|
14
|
+
s.rubyforge_project = "nuker"
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.files << "README.md"
|
18
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
|
+
s.require_paths = ["lib"]
|
21
|
+
|
22
|
+
s.add_runtime_dependency "rest-client"
|
23
|
+
s.add_runtime_dependency "sinatra"
|
24
|
+
s.add_runtime_dependency "haml"
|
25
|
+
s.add_runtime_dependency "rdiscount"
|
26
|
+
s.add_runtime_dependency "gherkin"
|
27
|
+
s.add_runtime_dependency "komainu"
|
28
|
+
s.add_runtime_dependency "mongo_mapper"
|
29
|
+
s.add_runtime_dependency "bson_ext"
|
30
|
+
|
31
|
+
s.add_development_dependency "cucumber"
|
32
|
+
s.add_development_dependency "capybara"
|
33
|
+
s.add_development_dependency "rspec"
|
34
|
+
s.add_development_dependency "fakefs"
|
35
|
+
s.add_development_dependency "launchy"
|
36
|
+
s.add_development_dependency "pry"
|
37
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
$:.unshift(File.join(File.dirname(__FILE__), "../lib"))
|
2
|
+
ENV['RACK_ENV'] = 'test'
|
3
|
+
require "rack/test"
|
4
|
+
require "fakefs/spec_helpers"
|
5
|
+
require "fileutils"
|
6
|
+
require "nuker"
|
7
|
+
|
8
|
+
before do
|
9
|
+
ARGV.clear
|
10
|
+
ARGV << "application-features"
|
11
|
+
end
|
12
|
+
|
13
|
+
RSpec.configure do |config|
|
14
|
+
config.after :each do
|
15
|
+
Nuker::Project.delete_all
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def project name
|
20
|
+
project = Nuker::Project.first(:name => name)
|
21
|
+
unless project
|
22
|
+
project = Nuker::Project.create(:name => name)
|
23
|
+
end
|
24
|
+
project
|
25
|
+
end
|
26
|
+
|
27
|
+
def create_feature project_name, path, content
|
28
|
+
project = project(project_name)
|
29
|
+
feature = Nuker::Feature.new({
|
30
|
+
:path => path,
|
31
|
+
:gherkin => Nuker::ParsesFeatures.new.parse(content)
|
32
|
+
})
|
33
|
+
project.features << feature
|
34
|
+
project.save
|
35
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nuker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Marc Bluemner
|
@@ -209,11 +209,74 @@ dependencies:
|
|
209
209
|
description: Cucumber feature viewer and navigator
|
210
210
|
email:
|
211
211
|
- m.bluemner@liquidlabs.de
|
212
|
-
executables:
|
212
|
+
executables:
|
213
|
+
- nuker
|
213
214
|
extensions: []
|
214
215
|
extra_rdoc_files: []
|
215
216
|
files:
|
217
|
+
- .gitignore
|
218
|
+
- .ruby-version
|
219
|
+
- .rvmrc
|
220
|
+
- .rvmrc.08.13.2014-14:58:37
|
221
|
+
- .travis.yml
|
222
|
+
- Gemfile
|
223
|
+
- LICENSE
|
216
224
|
- README.md
|
225
|
+
- Rakefile
|
226
|
+
- bin/nuker
|
227
|
+
- config.ru
|
228
|
+
- example-features/generic/example-with-background.feature
|
229
|
+
- example-features/generic/example-with-data-table.feature
|
230
|
+
- example-features/generic/example-with-scenario-outline-examples.feature
|
231
|
+
- example-features/generic/example_with_tags.feature
|
232
|
+
- example-features/generic/has-lots-of-tags.feature
|
233
|
+
- example-features/generic/multiple-scenarios.feature
|
234
|
+
- example-features/too-many-wip-tags/too-many-wip-tags.feature
|
235
|
+
- features/counts.feature
|
236
|
+
- features/feature_page.feature
|
237
|
+
- features/list_tags.feature
|
238
|
+
- features/notifications.feature
|
239
|
+
- features/progress_bar.feature
|
240
|
+
- features/project_home.feature
|
241
|
+
- features/projects.feature
|
242
|
+
- features/push_features.feature
|
243
|
+
- features/scenario_page.feature
|
244
|
+
- features/search_features.feature
|
245
|
+
- features/step_definitions/feature_page_steps.rb
|
246
|
+
- features/step_definitions/notifications_steps.rb
|
247
|
+
- features/step_definitions/project_home_steps.rb
|
248
|
+
- features/step_definitions/projects_steps.rb
|
249
|
+
- features/step_definitions/push_features_steps.rb
|
250
|
+
- features/step_definitions/scenario_page_steps.rb
|
251
|
+
- features/step_definitions/search_features_steps.rb
|
252
|
+
- features/step_definitions/steps.rb
|
253
|
+
- features/step_definitions/welcome_page.rb
|
254
|
+
- features/support/env.rb
|
255
|
+
- features/welcome_page.feature
|
256
|
+
- lib/nuker.rb
|
257
|
+
- lib/nuker/application.rb
|
258
|
+
- lib/nuker/counts_tags.rb
|
259
|
+
- lib/nuker/feature.rb
|
260
|
+
- lib/nuker/parses_features.rb
|
261
|
+
- lib/nuker/project.rb
|
262
|
+
- lib/nuker/public/bootstrap.min.css
|
263
|
+
- lib/nuker/public/nuker-logo.png
|
264
|
+
- lib/nuker/public/scripts/projects.js
|
265
|
+
- lib/nuker/public/skin.css
|
266
|
+
- lib/nuker/public/wally-logo.png
|
267
|
+
- lib/nuker/search_features.rb
|
268
|
+
- lib/nuker/version.rb
|
269
|
+
- lib/nuker/views/feature.haml
|
270
|
+
- lib/nuker/views/feature_link.haml
|
271
|
+
- lib/nuker/views/layout.haml
|
272
|
+
- lib/nuker/views/progress.haml
|
273
|
+
- lib/nuker/views/project.haml
|
274
|
+
- lib/nuker/views/scenario.haml
|
275
|
+
- lib/nuker/views/search.haml
|
276
|
+
- lib/nuker/views/table.haml
|
277
|
+
- lib/nuker/views/tag_links.haml
|
278
|
+
- nuker.gemspec
|
279
|
+
- spec/spec_helper.rb
|
217
280
|
homepage: https://github.com/rocknrollmarc/nuker
|
218
281
|
licenses: []
|
219
282
|
metadata: {}
|
@@ -237,4 +300,26 @@ rubygems_version: 2.2.2
|
|
237
300
|
signing_key:
|
238
301
|
specification_version: 4
|
239
302
|
summary: Cucumber feature viewer and navigator
|
240
|
-
test_files:
|
303
|
+
test_files:
|
304
|
+
- features/counts.feature
|
305
|
+
- features/feature_page.feature
|
306
|
+
- features/list_tags.feature
|
307
|
+
- features/notifications.feature
|
308
|
+
- features/progress_bar.feature
|
309
|
+
- features/project_home.feature
|
310
|
+
- features/projects.feature
|
311
|
+
- features/push_features.feature
|
312
|
+
- features/scenario_page.feature
|
313
|
+
- features/search_features.feature
|
314
|
+
- features/step_definitions/feature_page_steps.rb
|
315
|
+
- features/step_definitions/notifications_steps.rb
|
316
|
+
- features/step_definitions/project_home_steps.rb
|
317
|
+
- features/step_definitions/projects_steps.rb
|
318
|
+
- features/step_definitions/push_features_steps.rb
|
319
|
+
- features/step_definitions/scenario_page_steps.rb
|
320
|
+
- features/step_definitions/search_features_steps.rb
|
321
|
+
- features/step_definitions/steps.rb
|
322
|
+
- features/step_definitions/welcome_page.rb
|
323
|
+
- features/support/env.rb
|
324
|
+
- features/welcome_page.feature
|
325
|
+
- spec/spec_helper.rb
|