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,285 @@
1
+ require 'mongo'
2
+
3
+ module Kaya
4
+ module Database
5
+ class MongoConnector
6
+
7
+ include Mongo
8
+
9
+ def initialize(opts={host: "localhost", port: 27017, username: nil, pass: nil})
10
+
11
+ project_name = Dir.pwd.split("/").last
12
+ @@db_name = "#{project_name}_kaya"
13
+
14
+ @@client = MongoClient.new(opts[:host], opts[:port])
15
+
16
+
17
+ @@db = @@client.db(@@db_name)
18
+ @@auth = @@db.authenticate(opts[:username], opts[:pass]) if opts[:username] and opts[:pass]
19
+
20
+ @@suites = @@db.collection("suites")
21
+ @@suites.ensure_index({"last_result" => 1})
22
+
23
+ @@results = @@db.collection("results")
24
+ @@results.ensure_index({"_id" => 1})
25
+ @@results.ensure_index({"started_at" => 1, "_id" => 1})
26
+
27
+ @@documentation = @@db.collection("documentation")
28
+ end
29
+
30
+ def self.connected?
31
+ begin
32
+ @@db and true
33
+ rescue
34
+ false
35
+ end
36
+ end
37
+
38
+ # Removes all documents of documentation from the DB
39
+ def self.clean_documentation
40
+ @@db.drop_collection("documentation")
41
+ end
42
+
43
+ # Inserts a document of documentation in the DB
44
+ def self.insert_documentation document
45
+ @@documentation.insert(document)
46
+ end
47
+
48
+ # Return an array with all documents of documentation
49
+ def self.get_all_documentation
50
+ @@documentation.find().to_a
51
+ end
52
+
53
+ # Returns the body html of a page
54
+ def self.help_body page
55
+ result = @@documentation.find({"title" => page}).to_a.first
56
+ result["body"].to_s if result != nil
57
+ end
58
+
59
+ # Returns the title of a page
60
+ def self.help_title page
61
+ result = @@documentation.find({"title" => page}).to_a.first
62
+ result["title"].to_s.gsub('_', ' ').capitalize if result != nil
63
+ end
64
+
65
+ # Returns a document from the DB for a certain title
66
+ def self.help_search title
67
+ @@documentation.find({:$or => [{ "title" => /#{title}/ },{ "title" => /#{title.upcase}/ },{ "body" => /#{title}/ }]}).to_a
68
+ end
69
+
70
+ def self.generate_id
71
+ Time.now.to_f.to_s.gsub( ".","")[0..12].to_i
72
+ end
73
+
74
+ # Returns a list of collections
75
+ def self.collections
76
+ ["suites","results"]
77
+ end
78
+
79
+ # Drops all kaya collections
80
+ def self.drop_collections
81
+ db = self.kaya_db
82
+ collections.each do |collection|
83
+ db.drop_collection(collection) if collection != "documentation"
84
+ end
85
+ end
86
+
87
+ def self.kaya_db
88
+ MongoClient.new().db(@@db_name)
89
+ end
90
+
91
+ # Update suites collection with suites that comes from cucumber.yml file
92
+ # All given suites will be active. Others will be deactivated
93
+ # @param [Hash] cucumber_yml_suites
94
+ def self.update_suites cucumber_yml_suites
95
+
96
+ existing_suites = self.suites
97
+
98
+ existing_suites_name_list = existing_suites.map{|suite| suite["name"]}
99
+
100
+ cucumber_yml_suites.each_with_index do |cucumber_suite, index|
101
+
102
+ suite_data = existing_suites.select{|suite| suite["name"]==cucumber_suite["name"]}.first
103
+
104
+ # if exist, so update it, else creates a new one
105
+ if suite_data
106
+ #Delete it from list and update it
107
+ existing_suites.delete(suite_data)
108
+ suite_data["command"] = cucumber_suite["command"]
109
+ suite_data["custom"] = cucumber_suite["custom"]
110
+ suite_data["active"] = true
111
+ suite_data["index"] = index
112
+
113
+ # Updates register with new data
114
+ self.update_suite(suite_data)
115
+ print "UPDATED: #{suite_data['_id']}\n\n"
116
+ else
117
+ # Creates a new one
118
+ suite_data = self.suite_data_structure
119
+ suite_data["name"] = cucumber_suite["name"]
120
+ suite_data["command"] = cucumber_suite["command"]
121
+ suite_data["custom"] = cucumber_suite["custom"]
122
+ suite_data["branch"] = Kaya::Support::Git.actual_branch
123
+
124
+ # Saves register with new data
125
+ id = self.insert_suite(suite_data)
126
+
127
+ print "INSERTED: #{id}\n\n"
128
+
129
+ end
130
+
131
+
132
+ end
133
+
134
+ # If at least one existing suite isn't con cucumber yml file, so deactivate them
135
+ unless existing_suites.empty?
136
+ existing_suites.each do |suite|
137
+
138
+ print "DEACTIVATED: #{suite['_id']}\n\n"
139
+ deactivate_suite(suite["_id"])
140
+ end
141
+ end
142
+ end
143
+
144
+
145
+ # Inserts a suite in suites collection
146
+ # @param [Hash] suite_data (see suite_data_structure method)
147
+ def self.insert_suite suite_data
148
+ @@suites.insert(suite_data)
149
+ end
150
+
151
+
152
+ # Update record for a given suite
153
+ # @param [Hash] suite_data
154
+ def self.update_suite suite_data
155
+ @@suites.update( {"_id" => suite_data["_id"]}, suite_data)
156
+ end
157
+
158
+ # Returns the entire record for a given suite name
159
+ # @param [String] suite_name
160
+ # @return [Hash] all suite data
161
+ def self.suite_data_for suite_id
162
+ suite_id = suite_id.to_i if suite_id.respond_to? :to_i
163
+ @@suites.find({"_id" => suite_id}).to_a.first
164
+ end
165
+
166
+ def self.suite_data_for_name(suite_name)
167
+ id = self.suite_id_for(suite_name)
168
+ @@suites.find({"_id" => id}).to_a.first
169
+ end
170
+
171
+ # Returns the _id for a given suite name
172
+ # @param [String] suite_name
173
+ # @return [String] _id
174
+ def self.suite_id_for suite_name, active=nil
175
+ criteria = {"name" => suite_name}
176
+ criteria.store("active",true) if active
177
+ result = @@suites.find(criteria).to_a.first
178
+ result.nil? ? nil : result["_id"]
179
+ end
180
+
181
+ def self.suites active=true
182
+ criteria ={}
183
+ criteria["active"]=active if active
184
+ @@suites.ensure_index({"last_result" => 1})
185
+ @@suites.find(criteria, :sort => ["last_result", -1]).to_a || []
186
+ end
187
+
188
+ # Returns all active suites
189
+ def self.all_suites
190
+ @@suites.find({"active" => true}).to_a
191
+ end
192
+
193
+
194
+
195
+
196
+ # RESULTS COLLECTION METHODS
197
+
198
+ # Creates a result data andc
199
+ # returns de id for that register
200
+ # @param [Hash] execution_data
201
+ # @return [String] id for created result
202
+ def self.insert_result(result_data)
203
+ begin
204
+ @@results.insert(result_data)
205
+ true
206
+ rescue
207
+ false
208
+ end
209
+ end
210
+
211
+ # Returns all results for a given suite_id
212
+ def self.results_for suite_id
213
+ @@results.ensure_index({"started_at" => 1, "_id" => 1})
214
+ res = @@results.find({}, :sort => ["started_at", -1]).to_a
215
+ unless res.empty?
216
+ res.select{|result| result["suite"]["id"]==ensure_int(suite_id)}
217
+ else
218
+ []
219
+ end
220
+ end
221
+
222
+ # Updates result register with the given data
223
+ #
224
+ def self.update_result result_data_structure
225
+ begin
226
+ @@results.update( {"_id" => result_data_structure["_id"]}, result_data_structure)
227
+ true
228
+ rescue
229
+ false
230
+ end
231
+ end
232
+
233
+ def self.result_data_for_id(result_id)
234
+ @@results.find({"_id" => ensure_int(result_id)}).to_a.first
235
+ end
236
+
237
+
238
+ # Returns value as Fixnum if it is not
239
+ # @param [Object] value
240
+ # @return [Fixnum]
241
+ def self.ensure_int(value)
242
+ value and value.to_i if value.respond_to? :to_i
243
+ end
244
+
245
+ # Returns all result
246
+ # @return [Array] results from results coll
247
+ def self.all_results
248
+ @@results.ensure_index({"started_at" => 1, "_id" => 1})
249
+ res = @@results.find({}, :sort => ['_id', -1])
250
+ if res
251
+ res.to_a
252
+ else
253
+ []
254
+ end
255
+ end
256
+
257
+ def self.all_results_ids
258
+ all_results.map{|res| res['_id']}
259
+ end
260
+
261
+ def self.find_results_for_key key
262
+ all_actual_results = self.all_results
263
+ if !all_actual_results.empty?
264
+ all_actual_results.select do |result|
265
+ result["suite"]["name"].include?(key) or result["execution_name"].include?(key) or result["summary"].include?(key) or result["command"].include?(key)
266
+ end
267
+ end
268
+ end
269
+
270
+ def self.find_results_for_status status
271
+ all_actual_results = self.all_results
272
+ if !all_actual_results.empty?
273
+ all_actual_results.select do |result|
274
+ result["summary"].include?(status) or result["status"].include?(status)
275
+ end.map{|result| result["_id"]}
276
+ end
277
+ end
278
+
279
+ def self.find_by criteria={}
280
+ search_criteria = {}
281
+ end
282
+
283
+ end
284
+ end
285
+ end
@@ -0,0 +1,55 @@
1
+ module Kaya
2
+ module Error
3
+ # Raised when there is an error related to Suites.
4
+ class Suite < StandardError
5
+ attr_reader :suite_name
6
+
7
+ def initialize(suite_name, message=nil)
8
+ @suite_name = suite_name
9
+ message = message
10
+ super(message)
11
+ end
12
+ end
13
+
14
+ # Raised when there is an error related to Results.
15
+ class Result < StandardError
16
+ attr_reader :id
17
+
18
+ def initialize(id, message=nil)
19
+ @id = id
20
+ message = message
21
+ super(message)
22
+ end
23
+
24
+ end
25
+
26
+ class KayaFile < StandardError
27
+ def initialize file_path
28
+ super("Could not find '#{file_path} file" )
29
+ end
30
+ end
31
+
32
+ class KayaDir < StandardError
33
+ def initialize file_path
34
+ super("Could not find '#{file_path}' dir")
35
+ end
36
+ end
37
+
38
+ # Raised when there is an error related to Results
39
+ class CucumberYML < StandardError
40
+
41
+ def initialize()
42
+ super("Could not find cucumber.yml file to get test suites from")
43
+ end
44
+
45
+ end
46
+
47
+ # Raised when there is an error related to Help.
48
+ class Help < StandardError
49
+ def initialize(message=nil)
50
+ message = message
51
+ super(message)
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,57 @@
1
+ module Kaya
2
+ class Execution
3
+
4
+
5
+ # Run/Execute the commmand
6
+ # @param [Hash] execution_data = { :suite_id, :label }
7
+ def self.run! execution_request_data
8
+
9
+ if Kaya::Support::Configuration.use_git?
10
+ Kaya::Support::Git.reset_hard and Kaya::Support::Git.pull
11
+ $K_LOG.debug "Git pulled" if $K_LOG
12
+ end
13
+
14
+
15
+ result = Kaya::Results::Result.new(execution_request_data)
16
+ $K_LOG.debug "Result created with id => #{result.id}" if $K_LOG
17
+
18
+ result_id = result.id
19
+
20
+ if execution_request_data["type"] == "cucumber"
21
+ $K_LOG.debug "Execution type: Cucumber" if $K_LOG
22
+ Kaya::Cucumber::Task.run(result)
23
+
24
+ $K_LOG.debug "Task started" if $K_LOG
25
+
26
+
27
+ if result = Results::Result.get(result_id)
28
+
29
+ result.append_result_to_console_output!
30
+
31
+ result.save_report!
32
+
33
+ result.get_summary!
34
+
35
+ result.get_status!
36
+
37
+ result = nil
38
+ end
39
+
40
+ result_id
41
+
42
+ else # ANOTHER TYPE OF EXECUTION
43
+ $K_LOG.debug "Execution type: #{execution_request_data[:type]}" if $K_LOG
44
+ puts "TODO: Another type of execution (no cucumber execution)"
45
+
46
+ Time.now.to_i # must return an id number
47
+
48
+ end
49
+ end
50
+
51
+
52
+
53
+
54
+
55
+
56
+ end
57
+ end