kaya 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (112) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +26 -0
  3. data/CHANGELOG +52 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE.txt +22 -0
  6. data/NOTAS +19 -0
  7. data/README.md +279 -0
  8. data/Rakefile +1 -0
  9. data/bin/kaya +4 -0
  10. data/documentation/api.md +47 -0
  11. data/documentation/api_execution_data.md +47 -0
  12. data/documentation/configuration.md +13 -0
  13. data/documentation/custom_parameters.md +117 -0
  14. data/documentation/document_kaya.md +122 -0
  15. data/documentation/link.md +12 -0
  16. data/documentation/results.md +119 -0
  17. data/documentation/start.md +19 -0
  18. data/documentation/suites.md +60 -0
  19. data/documentation/test_suite_information.md +9 -0
  20. data/kaya.gemspec +42 -0
  21. data/lib/generators/task_rack.rb +160 -0
  22. data/lib/generators/templates/Gemfile.tt +2 -0
  23. data/lib/generators/templates/config.ru.tt +2 -0
  24. data/lib/generators/templates/kaya_conf.tt +49 -0
  25. data/lib/generators/templates/kaya_log.tt +0 -0
  26. data/lib/generators/templates/sidekiq_log.tt +0 -0
  27. data/lib/generators/templates/tasks.kaya.tt +10 -0
  28. data/lib/generators/templates/unicorn.rb.tt +21 -0
  29. data/lib/kaya/API/error.rb +17 -0
  30. data/lib/kaya/API/execution.rb +141 -0
  31. data/lib/kaya/API/result.rb +49 -0
  32. data/lib/kaya/API/results.rb +31 -0
  33. data/lib/kaya/API/suite.rb +42 -0
  34. data/lib/kaya/API/suites.rb +36 -0
  35. data/lib/kaya/background_jobs/sidekiq.rb +35 -0
  36. data/lib/kaya/background_jobs/workers/execution_checker.rb +20 -0
  37. data/lib/kaya/background_jobs/workers/garbage_cleaner.rb +31 -0
  38. data/lib/kaya/commands/bye.rb +12 -0
  39. data/lib/kaya/commands/help.rb +13 -0
  40. data/lib/kaya/commands/install.rb +27 -0
  41. data/lib/kaya/commands/reset.rb +39 -0
  42. data/lib/kaya/commands/reset_suites.rb +40 -0
  43. data/lib/kaya/commands/restart.rb +9 -0
  44. data/lib/kaya/commands/start.rb +104 -0
  45. data/lib/kaya/commands/stop.rb +53 -0
  46. data/lib/kaya/cuba.rb +287 -0
  47. data/lib/kaya/cucumber/features.rb +15 -0
  48. data/lib/kaya/cucumber/task.rb +64 -0
  49. data/lib/kaya/custom/execution_data.rb +50 -0
  50. data/lib/kaya/custom/params.rb +34 -0
  51. data/lib/kaya/database/mongo_connector.rb +285 -0
  52. data/lib/kaya/error/errors.rb +55 -0
  53. data/lib/kaya/execution.rb +57 -0
  54. data/lib/kaya/results/result.rb +493 -0
  55. data/lib/kaya/results/results.rb +47 -0
  56. data/lib/kaya/suites/custom/params.rb +151 -0
  57. data/lib/kaya/suites/suite.rb +177 -0
  58. data/lib/kaya/suites/suites.rb +130 -0
  59. data/lib/kaya/support/clean.rb +12 -0
  60. data/lib/kaya/support/configuration.rb +254 -0
  61. data/lib/kaya/support/console.rb +11 -0
  62. data/lib/kaya/support/documentation.rb +34 -0
  63. data/lib/kaya/support/error_handler_helper.rb +24 -0
  64. data/lib/kaya/support/files_cleanner.rb +136 -0
  65. data/lib/kaya/support/git.rb +161 -0
  66. data/lib/kaya/support/if_config.rb +14 -0
  67. data/lib/kaya/support/logo.rb +23 -0
  68. data/lib/kaya/support/logs.rb +37 -0
  69. data/lib/kaya/support/notification.rb +127 -0
  70. data/lib/kaya/support/processes.rb +96 -0
  71. data/lib/kaya/support/query_string.rb +22 -0
  72. data/lib/kaya/support/request.rb +32 -0
  73. data/lib/kaya/support/risk.rb +9 -0
  74. data/lib/kaya/support/time_helper.rb +11 -0
  75. data/lib/kaya/support/update.rb +65 -0
  76. data/lib/kaya/version.rb +3 -0
  77. data/lib/kaya/view/body.mote +60 -0
  78. data/lib/kaya/view/custom/params/select_list.mote +14 -0
  79. data/lib/kaya/view/custom/params/text.mote +9 -0
  80. data/lib/kaya/view/custom/params.mote +9 -0
  81. data/lib/kaya/view/error_handler.mote +40 -0
  82. data/lib/kaya/view/features/feature.mote +14 -0
  83. data/lib/kaya/view/features/features_list.mote +10 -0
  84. data/lib/kaya/view/features.mote +57 -0
  85. data/lib/kaya/view/footer.mote +10 -0
  86. data/lib/kaya/view/git_information.mote +21 -0
  87. data/lib/kaya/view/help/main.mote +21 -0
  88. data/lib/kaya/view/help/page.mote +2 -0
  89. data/lib/kaya/view/help/search_result.mote +29 -0
  90. data/lib/kaya/view/help.mote +72 -0
  91. data/lib/kaya/view/javascript.mote +96 -0
  92. data/lib/kaya/view/logs/log.mote +3 -0
  93. data/lib/kaya/view/modals.mote +31 -0
  94. data/lib/kaya/view/navigation_bar.mote +48 -0
  95. data/lib/kaya/view/not_found.mote +40 -0
  96. data/lib/kaya/view/parser.rb +79 -0
  97. data/lib/kaya/view/results/all.mote +59 -0
  98. data/lib/kaya/view/results/console.mote +106 -0
  99. data/lib/kaya/view/results/detailed_info.mote +112 -0
  100. data/lib/kaya/view/results/report.mote +1 -0
  101. data/lib/kaya/view/results/result.mote +23 -0
  102. data/lib/kaya/view/results/results.mote +52 -0
  103. data/lib/kaya/view/screenshot.mote +42 -0
  104. data/lib/kaya/view/sections.rb +25 -0
  105. data/lib/kaya/view/styles.mote +58 -0
  106. data/lib/kaya/view/suites/suite.mote +73 -0
  107. data/lib/kaya/view/suites/suites.mote +9 -0
  108. data/lib/kaya/view/view.rb +72 -0
  109. data/lib/kaya.rb +175 -0
  110. data/test/features/install.feature +18 -0
  111. data/test/features/support/env.rb +3 -0
  112. 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:&nbsp;{{Kaya::View.label_color_for_result_id suite["last_result"]}}
23
+ </li>
24
+ <li class='list-group-item'>
25
+ Started on:&nbsp;{{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'>&nbsp;
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>&nbsp;&nbsp;
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
+ &nbsp;
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|
@@ -0,0 +1,3 @@
1
+ require 'cucumber'
2
+ require 'debugger'
3
+ require 'kaya'