kaya 0.0.1

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.
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'