kaya 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +26 -0
- data/CHANGELOG +52 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/NOTAS +19 -0
- data/README.md +279 -0
- data/Rakefile +1 -0
- data/bin/kaya +4 -0
- data/documentation/api.md +47 -0
- data/documentation/api_execution_data.md +47 -0
- data/documentation/configuration.md +13 -0
- data/documentation/custom_parameters.md +117 -0
- data/documentation/document_kaya.md +122 -0
- data/documentation/link.md +12 -0
- data/documentation/results.md +119 -0
- data/documentation/start.md +19 -0
- data/documentation/suites.md +60 -0
- data/documentation/test_suite_information.md +9 -0
- data/kaya.gemspec +42 -0
- data/lib/generators/task_rack.rb +160 -0
- data/lib/generators/templates/Gemfile.tt +2 -0
- data/lib/generators/templates/config.ru.tt +2 -0
- data/lib/generators/templates/kaya_conf.tt +49 -0
- data/lib/generators/templates/kaya_log.tt +0 -0
- data/lib/generators/templates/sidekiq_log.tt +0 -0
- data/lib/generators/templates/tasks.kaya.tt +10 -0
- data/lib/generators/templates/unicorn.rb.tt +21 -0
- data/lib/kaya/API/error.rb +17 -0
- data/lib/kaya/API/execution.rb +141 -0
- data/lib/kaya/API/result.rb +49 -0
- data/lib/kaya/API/results.rb +31 -0
- data/lib/kaya/API/suite.rb +42 -0
- data/lib/kaya/API/suites.rb +36 -0
- data/lib/kaya/background_jobs/sidekiq.rb +35 -0
- data/lib/kaya/background_jobs/workers/execution_checker.rb +20 -0
- data/lib/kaya/background_jobs/workers/garbage_cleaner.rb +31 -0
- data/lib/kaya/commands/bye.rb +12 -0
- data/lib/kaya/commands/help.rb +13 -0
- data/lib/kaya/commands/install.rb +27 -0
- data/lib/kaya/commands/reset.rb +39 -0
- data/lib/kaya/commands/reset_suites.rb +40 -0
- data/lib/kaya/commands/restart.rb +9 -0
- data/lib/kaya/commands/start.rb +104 -0
- data/lib/kaya/commands/stop.rb +53 -0
- data/lib/kaya/cuba.rb +287 -0
- data/lib/kaya/cucumber/features.rb +15 -0
- data/lib/kaya/cucumber/task.rb +64 -0
- data/lib/kaya/custom/execution_data.rb +50 -0
- data/lib/kaya/custom/params.rb +34 -0
- data/lib/kaya/database/mongo_connector.rb +285 -0
- data/lib/kaya/error/errors.rb +55 -0
- data/lib/kaya/execution.rb +57 -0
- data/lib/kaya/results/result.rb +493 -0
- data/lib/kaya/results/results.rb +47 -0
- data/lib/kaya/suites/custom/params.rb +151 -0
- data/lib/kaya/suites/suite.rb +177 -0
- data/lib/kaya/suites/suites.rb +130 -0
- data/lib/kaya/support/clean.rb +12 -0
- data/lib/kaya/support/configuration.rb +254 -0
- data/lib/kaya/support/console.rb +11 -0
- data/lib/kaya/support/documentation.rb +34 -0
- data/lib/kaya/support/error_handler_helper.rb +24 -0
- data/lib/kaya/support/files_cleanner.rb +136 -0
- data/lib/kaya/support/git.rb +161 -0
- data/lib/kaya/support/if_config.rb +14 -0
- data/lib/kaya/support/logo.rb +23 -0
- data/lib/kaya/support/logs.rb +37 -0
- data/lib/kaya/support/notification.rb +127 -0
- data/lib/kaya/support/processes.rb +96 -0
- data/lib/kaya/support/query_string.rb +22 -0
- data/lib/kaya/support/request.rb +32 -0
- data/lib/kaya/support/risk.rb +9 -0
- data/lib/kaya/support/time_helper.rb +11 -0
- data/lib/kaya/support/update.rb +65 -0
- data/lib/kaya/version.rb +3 -0
- data/lib/kaya/view/body.mote +60 -0
- data/lib/kaya/view/custom/params/select_list.mote +14 -0
- data/lib/kaya/view/custom/params/text.mote +9 -0
- data/lib/kaya/view/custom/params.mote +9 -0
- data/lib/kaya/view/error_handler.mote +40 -0
- data/lib/kaya/view/features/feature.mote +14 -0
- data/lib/kaya/view/features/features_list.mote +10 -0
- data/lib/kaya/view/features.mote +57 -0
- data/lib/kaya/view/footer.mote +10 -0
- data/lib/kaya/view/git_information.mote +21 -0
- data/lib/kaya/view/help/main.mote +21 -0
- data/lib/kaya/view/help/page.mote +2 -0
- data/lib/kaya/view/help/search_result.mote +29 -0
- data/lib/kaya/view/help.mote +72 -0
- data/lib/kaya/view/javascript.mote +96 -0
- data/lib/kaya/view/logs/log.mote +3 -0
- data/lib/kaya/view/modals.mote +31 -0
- data/lib/kaya/view/navigation_bar.mote +48 -0
- data/lib/kaya/view/not_found.mote +40 -0
- data/lib/kaya/view/parser.rb +79 -0
- data/lib/kaya/view/results/all.mote +59 -0
- data/lib/kaya/view/results/console.mote +106 -0
- data/lib/kaya/view/results/detailed_info.mote +112 -0
- data/lib/kaya/view/results/report.mote +1 -0
- data/lib/kaya/view/results/result.mote +23 -0
- data/lib/kaya/view/results/results.mote +52 -0
- data/lib/kaya/view/screenshot.mote +42 -0
- data/lib/kaya/view/sections.rb +25 -0
- data/lib/kaya/view/styles.mote +58 -0
- data/lib/kaya/view/suites/suite.mote +73 -0
- data/lib/kaya/view/suites/suites.mote +9 -0
- data/lib/kaya/view/view.rb +72 -0
- data/lib/kaya.rb +175 -0
- data/test/features/install.feature +18 -0
- data/test/features/support/env.rb +3 -0
- metadata +395 -0
@@ -0,0 +1,73 @@
|
|
1
|
+
<div class='starter-template'>
|
2
|
+
<div class='panel panel-{{Kaya::View.color(suite["status"])}}'>
|
3
|
+
<div class='panel-heading' data-toggle='collapse' data-target='#{{suite["name"].gsub(' ','')}}'>
|
4
|
+
<h4 class='panel-title'>{{suite["name"]}}</h4>
|
5
|
+
% unless suite["status"]=="READY"
|
6
|
+
<div class="spinner">
|
7
|
+
<div class="bounce1"></div>
|
8
|
+
<div class="bounce2"></div>
|
9
|
+
<div class="bounce3"></div>
|
10
|
+
</div>
|
11
|
+
% end
|
12
|
+
</div>
|
13
|
+
|
14
|
+
<div class='panel-body collapse in' id='{{suite["name"].gsub(' ','')}}'>
|
15
|
+
<ul class='list-group'>
|
16
|
+
<li class='list-group-item'>
|
17
|
+
Command: {{suite["command"]}}
|
18
|
+
</li>
|
19
|
+
% if suite["last_result"]
|
20
|
+
% unless suite["status"] == "RUNNING"
|
21
|
+
<li class='list-group-item'>
|
22
|
+
Last result: {{Kaya::View.label_color_for_result_id suite["last_result"]}}
|
23
|
+
</li>
|
24
|
+
<li class='list-group-item'>
|
25
|
+
Started on: {{Kaya::Support::TimeHelper.formatted_time_for suite["last_result"]}}
|
26
|
+
</li>
|
27
|
+
% end
|
28
|
+
% end
|
29
|
+
% if suite["status"] == "RUNNING"
|
30
|
+
<li class='list-group-item'>
|
31
|
+
<a href='#' class='btn btn-info' onclick="refresh_and_open('/{{Kaya::Support::Configuration.hostname}}/kaya/results/log/{{suite['last_result']}}');">
|
32
|
+
See progress
|
33
|
+
</a>
|
34
|
+
</li>
|
35
|
+
% else
|
36
|
+
<li class='list-group-item'>
|
37
|
+
<form name='run' id='{{suite["name"]}}' method='get' action='/{{Kaya::Support::Configuration.hostname}}/kaya/suites/{{suite["name"]}}/run'>
|
38
|
+
|
39
|
+
% unless suite["custom"].empty?
|
40
|
+
% custom_template = Mote.parse(File.read("#{Kaya::View.path}/custom/params.mote"), self, [:custom_params])
|
41
|
+
{{custom_template.call(custom_params:suite["custom"])}}
|
42
|
+
% end
|
43
|
+
<br><br>
|
44
|
+
<input type='submit' class='btn btn-success' value='Execute Suite'>
|
45
|
+
<input type='text' name='execution_name' class='customParam' title='This value could be used to identify the result execution from other execution of this suite. E.g: You could use the release your are going to test' placeholder='Identify your execution' value='{{Kaya::Support::Configuration.auto_execution_id}}' style='height: 34px; padding: 6px 12px; font-size: 14px; line-height: 1.42857143; color: #555; background-color: #fff; background-image: none; border: 1px solid #ccc; border-radius: 4px; font-weight:normal;' />
|
46
|
+
<button type='button' class='btn btn-default' aria-label='Left Align' data-toggle='modal' data-target='#myModal' onclick='javascript:starter_link("{{suite["name"]}}");'>
|
47
|
+
<span class='glyphicon glyphicon-star' aria-hidden='true'>
|
48
|
+
Link
|
49
|
+
</span>
|
50
|
+
</button>
|
51
|
+
% unless suite["info"].empty?
|
52
|
+
<div style="text-align:right">
|
53
|
+
<a href='#'><span title='{{suite["info"]}}' class='glyphicon glyphicon-info-sign' aria-hidden='true' data-toggle='modal' data-target='#myModal' onclick="javascript:info('Information about {{suite["name"]}}','{{suite["info"].gsub('\n','<br>')}}', null);"></span>
|
54
|
+
</a><b>Information</b>
|
55
|
+
</div>
|
56
|
+
% end
|
57
|
+
|
58
|
+
</form>
|
59
|
+
</li>
|
60
|
+
% end
|
61
|
+
</li>
|
62
|
+
</ul>
|
63
|
+
|
64
|
+
% if suite["last_result"] # There is at least one result
|
65
|
+
% if suite["results"]["size"] > 0
|
66
|
+
<a href='/{{Kaya::Support::Configuration.hostname}}/kaya/results/suite/{{suite["name"].gsub(' ','%20')}}' class='btn btn-default pull-center'>All results({{suite["results"]["size"]}})</a>
|
67
|
+
% end
|
68
|
+
% else
|
69
|
+
|
70
|
+
% end
|
71
|
+
</div>
|
72
|
+
</div>
|
73
|
+
</div>
|
@@ -0,0 +1,9 @@
|
|
1
|
+
% suites_list = Kaya::API::Suites.list({})
|
2
|
+
% if suites_list["suites"].size > 0
|
3
|
+
% suite_template = Mote.parse(File.read("#{Kaya::View.path}/suites/suite.mote"), self, [:suite])
|
4
|
+
% suites_list = suites_list["suites"]
|
5
|
+
% suites_list.select!{|suite| suite["name"]==suite_name} if suite_name
|
6
|
+
% suites_list.each do |suite_data|
|
7
|
+
{{suite_template.call(suite:suite_data)}}
|
8
|
+
% end
|
9
|
+
% end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
module Kaya
|
2
|
+
module View
|
3
|
+
|
4
|
+
def self.path
|
5
|
+
File.expand_path('../', __FILE__)
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.label_color_for result
|
9
|
+
if result["summary"]
|
10
|
+
label_color = color result["summary"]
|
11
|
+
"<a href='#' class='label label-#{label_color}' #{access_report?(result)}>#{result['summary'].capitalize}</a>"
|
12
|
+
else
|
13
|
+
"<a href='#' class='label label-default' >No summary</a>"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.color value
|
18
|
+
case value.downcase
|
19
|
+
when /running/
|
20
|
+
"success"
|
21
|
+
when /finished|ready/
|
22
|
+
"primary"
|
23
|
+
when /(stopped|failed)/
|
24
|
+
"danger"
|
25
|
+
when /\d+ scenarios? \(\d+ pending\).*\d+ steps?/
|
26
|
+
"warning"
|
27
|
+
when /\d+ scenarios? \(\d+ passed\).*\d+ steps?/
|
28
|
+
"success"
|
29
|
+
when /\d+ scenarios? \(\d+ failed\).*\d+ steps?/
|
30
|
+
"danger"
|
31
|
+
when /(undefined|pending)/
|
32
|
+
"warning"
|
33
|
+
else
|
34
|
+
"default"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.unviewed
|
39
|
+
'<span class="glyphicon glyphicon-eye-open" aria-hidden="true"></span>'
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.access_report? result
|
43
|
+
if result["status"] =~ /stopped|running/
|
44
|
+
"onclick=\"javascript:refresh_and_open('/#{Kaya::Support::Configuration.hostname}/kaya/results/log/#{result["_id"]}');\""
|
45
|
+
else
|
46
|
+
"onclick=\"javascript:refresh_and_open('/#{Kaya::Support::Configuration.hostname}/kaya/results/report/#{result['_id']}');\"" if result["status"]=='finished' and result["has_report"]
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.label_color_for_result_id result_id
|
51
|
+
result = Kaya::API::Result.info result_id
|
52
|
+
self.label_color_for result if result
|
53
|
+
end
|
54
|
+
|
55
|
+
def self.formatted_for seconds
|
56
|
+
hours = seconds/ 3600
|
57
|
+
seconds = seconds% 3600
|
58
|
+
minutes = seconds/ 60
|
59
|
+
seconds = seconds % 60
|
60
|
+
elapsed = ""
|
61
|
+
elapsed += "#{hours} h " if hours > 0
|
62
|
+
elapsed += " #{minutes} m " if minutes > 0
|
63
|
+
elapsed += "#{seconds} s" if seconds
|
64
|
+
"#{elapsed}"
|
65
|
+
end
|
66
|
+
|
67
|
+
def self.result_started_at result_id
|
68
|
+
result = Kaya::API::Result.info result_id
|
69
|
+
self.formatted_for result["started_at"] if result
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
data/lib/kaya.rb
ADDED
@@ -0,0 +1,175 @@
|
|
1
|
+
require "kaya/version"
|
2
|
+
require "thor"
|
3
|
+
require 'json'
|
4
|
+
require 'colorize'
|
5
|
+
require 'github/markup'
|
6
|
+
require 'redis'
|
7
|
+
require 'sidekiq'
|
8
|
+
require 'mote'
|
9
|
+
require 'byebug'
|
10
|
+
|
11
|
+
require_relative "generators/task_rack"
|
12
|
+
|
13
|
+
|
14
|
+
# Commands
|
15
|
+
require_relative "kaya/commands/install"
|
16
|
+
require_relative "kaya/commands/start"
|
17
|
+
require_relative "kaya/commands/stop"
|
18
|
+
require_relative "kaya/commands/restart"
|
19
|
+
require_relative "kaya/commands/bye"
|
20
|
+
require_relative "kaya/commands/reset"
|
21
|
+
require_relative "kaya/commands/reset_suites"
|
22
|
+
require_relative "kaya/commands/help"
|
23
|
+
|
24
|
+
|
25
|
+
# Custom params
|
26
|
+
require_relative "kaya/custom/params"
|
27
|
+
require_relative "kaya/custom/execution_data"
|
28
|
+
|
29
|
+
|
30
|
+
# Database
|
31
|
+
require_relative "kaya/database/mongo_connector"
|
32
|
+
|
33
|
+
|
34
|
+
# Suites
|
35
|
+
require_relative "kaya/suites/suites"
|
36
|
+
require_relative "kaya/suites/suite"
|
37
|
+
require_relative "kaya/suites/custom/params"
|
38
|
+
|
39
|
+
|
40
|
+
# Results
|
41
|
+
require_relative "kaya/results/results"
|
42
|
+
require_relative "kaya/results/result"
|
43
|
+
|
44
|
+
|
45
|
+
# View
|
46
|
+
require_relative "kaya/view/view"
|
47
|
+
require_relative "kaya/view/sections"
|
48
|
+
require_relative "kaya/view/parser"
|
49
|
+
require_relative "kaya/view/parser"
|
50
|
+
|
51
|
+
|
52
|
+
# API
|
53
|
+
require_relative "kaya/API/suite"
|
54
|
+
require_relative "kaya/API/suites"
|
55
|
+
require_relative "kaya/API/result"
|
56
|
+
require_relative "kaya/API/results"
|
57
|
+
require_relative "kaya/API/error"
|
58
|
+
require_relative "kaya/API/execution"
|
59
|
+
|
60
|
+
|
61
|
+
# Cucumber relate code
|
62
|
+
require_relative "kaya/cucumber/features"
|
63
|
+
require_relative "kaya/cucumber/task"
|
64
|
+
|
65
|
+
|
66
|
+
# Error
|
67
|
+
require_relative "kaya/error/errors"
|
68
|
+
|
69
|
+
|
70
|
+
# Support code
|
71
|
+
require_relative "kaya/support/logo"
|
72
|
+
require_relative "kaya/support/configuration"
|
73
|
+
require_relative "kaya/support/clean"
|
74
|
+
require_relative "kaya/support/documentation"
|
75
|
+
require_relative "kaya/support/console"
|
76
|
+
require_relative "kaya/support/notification"
|
77
|
+
require_relative "kaya/support/processes"
|
78
|
+
require_relative "kaya/support/error_handler_helper"
|
79
|
+
require_relative "kaya/support/update"
|
80
|
+
require_relative "kaya/support/risk"
|
81
|
+
require_relative "kaya/support/request"
|
82
|
+
require_relative "kaya/support/files_cleanner"
|
83
|
+
require_relative "kaya/support/git"
|
84
|
+
require_relative "kaya/support/query_string"
|
85
|
+
require_relative "kaya/support/if_config"
|
86
|
+
require_relative "kaya/support/time_helper"
|
87
|
+
require_relative "kaya/support/logs"
|
88
|
+
|
89
|
+
|
90
|
+
# Background jobs
|
91
|
+
require_relative "kaya/background_jobs/workers/execution_checker"
|
92
|
+
require_relative "kaya/background_jobs/workers/garbage_cleaner"
|
93
|
+
require_relative "kaya/background_jobs/sidekiq"
|
94
|
+
|
95
|
+
|
96
|
+
# Main
|
97
|
+
require_relative "kaya/execution"
|
98
|
+
require_relative "kaya/cuba"
|
99
|
+
|
100
|
+
|
101
|
+
|
102
|
+
|
103
|
+
module Kaya
|
104
|
+
|
105
|
+
|
106
|
+
if Dir.exist? "#{Dir.pwd}/kaya"
|
107
|
+
|
108
|
+
# Creates kaya_log if it does not exist
|
109
|
+
File.open("#{Dir.pwd}/kaya/kaya_log","a+"){} unless File.exist? "#{Dir.pwd}/kaya/kaya_log"
|
110
|
+
|
111
|
+
# Set global conf
|
112
|
+
$K_LOG ||= Logger.new("#{Dir.pwd}/kaya/kaya_log",1,1024*1024)
|
113
|
+
Kaya::Support::Configuration.get
|
114
|
+
$NOTIF ||= Support::Notification.new("#{Dir.pwd.split("/").last}", "#{Kaya::Support::IfConfig.ip}:#{Kaya::Support::Configuration.port}")
|
115
|
+
|
116
|
+
end
|
117
|
+
|
118
|
+
|
119
|
+
class Base < Thor
|
120
|
+
|
121
|
+
desc "help","If you cannot start kaya"
|
122
|
+
def help
|
123
|
+
Kaya::Commands.help
|
124
|
+
end
|
125
|
+
|
126
|
+
desc "install","Install Kaya on your project"
|
127
|
+
def install
|
128
|
+
Kaya::Commands.install
|
129
|
+
end
|
130
|
+
|
131
|
+
desc "start", "Starts a service waiting for get requests to run tasks you've defined"
|
132
|
+
option :nodemon, :required =>false, :type => :boolean, :desc => "Add this flag to no demon use."
|
133
|
+
def start
|
134
|
+
if Dir.exist? "#{Dir.pwd}/kaya"
|
135
|
+
$K_LOG = Logger.new("#{Dir.pwd}/kaya/kaya_log",1,1024*1024)
|
136
|
+
Kaya::Commands.start(options["nodemon"])
|
137
|
+
else
|
138
|
+
puts "
|
139
|
+
|
140
|
+
Could not find kaya folder on root project folder. You can use `kaya install`
|
141
|
+
|
142
|
+
".red
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
desc "stop", "Stop kaya service"
|
147
|
+
def stop
|
148
|
+
Kaya::Commands.stop
|
149
|
+
end
|
150
|
+
|
151
|
+
desc "restart", "Restart Kaya"
|
152
|
+
def restart
|
153
|
+
Kaya::Commands.restart
|
154
|
+
end
|
155
|
+
|
156
|
+
desc "reset","Purges all db registers"
|
157
|
+
def reset
|
158
|
+
if yes? "Are you sure to reset all register? (yes/no)"
|
159
|
+
Kaya::Commands.reset
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
desc "reset_suites","Reset all suites registers. This command is to purge all suites from db"
|
164
|
+
def reset_suites
|
165
|
+
Kaya::Commands.reset_suites
|
166
|
+
end
|
167
|
+
|
168
|
+
desc "Say bye to kaya", ""
|
169
|
+
def bye
|
170
|
+
if yes? "Are you sure to say bye to Kaya? (yes/no)"
|
171
|
+
Kaya::Commands.bye
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
Feature: Installing Kaya on a Cucumber project
|
2
|
+
As a Cucumber user
|
3
|
+
When I install kaya on the project
|
4
|
+
I have to see a folder inside the root project folder
|
5
|
+
|
6
|
+
# ASSUME THAT REQUIREMENTS ARE INSTALLED ON THE SYSTEM
|
7
|
+
|
8
|
+
Background: A cucumber project must exist on a folder
|
9
|
+
Given ensure that a cucumber project exist
|
10
|
+
|
11
|
+
Scenario: Installing Kaya on a project without requirements on the system
|
12
|
+
Given kaya gem is installed on the system
|
13
|
+
When I run 'install' kaya command
|
14
|
+
Then a folder called kaya should be added to the project
|
15
|
+
And kaya folder must have the following files
|
16
|
+
|kaya_conf|kaya_log|unicorn.rb|sidekiq_log|config.ru|
|
17
|
+
And kaya folder must have the following folders
|
18
|
+
|temp|
|