rocketjob_mission_control 5.0.1 → 6.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (91) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/app/assets/config/manifest.js +3 -0
  4. data/app/assets/fonts/glyphicons-halflings-regular.eot +0 -0
  5. data/app/assets/fonts/glyphicons-halflings-regular.svg +288 -0
  6. data/app/assets/fonts/glyphicons-halflings-regular.ttf +0 -0
  7. data/app/assets/fonts/glyphicons-halflings-regular.woff +0 -0
  8. data/app/assets/fonts/glyphicons-halflings-regular.woff2 +0 -0
  9. data/app/assets/javascripts/rocket_job_mission_control/application.js +10 -11
  10. data/app/assets/javascripts/rocket_job_mission_control/base.js +1 -1
  11. data/app/assets/javascripts/rocket_job_mission_control/bootstrap.min.js +6 -0
  12. data/app/assets/javascripts/rocket_job_mission_control/{datatable.js → datatable_init.js} +0 -0
  13. data/{vendor/assets/javascripts → app/assets/javascripts/rocket_job_mission_control}/datatables.min.js +0 -0
  14. data/app/assets/javascripts/rocket_job_mission_control/dirmon_entries.js +1 -1
  15. data/app/assets/javascripts/rocket_job_mission_control/jquery-3.5.1.min.js +2 -0
  16. data/app/assets/javascripts/rocket_job_mission_control/nested_fields.js +112 -0
  17. data/app/assets/javascripts/rocket_job_mission_control/selectize.min.js +3 -0
  18. data/app/assets/javascripts/rocket_job_mission_control/selectize_init.js +6 -0
  19. data/app/assets/stylesheets/rocket_job_mission_control/{application.scss → application.css} +9 -8
  20. data/app/assets/stylesheets/rocket_job_mission_control/base.css +420 -0
  21. data/app/assets/stylesheets/rocket_job_mission_control/bootstrap.min.css.erb +6 -0
  22. data/app/assets/stylesheets/rocket_job_mission_control/bootstrap.min.css.map +1 -0
  23. data/app/assets/stylesheets/rocket_job_mission_control/{callout.scss → callout.css} +50 -52
  24. data/{vendor/assets/stylesheets → app/assets/stylesheets/rocket_job_mission_control}/datatables.min.css +0 -0
  25. data/{vendor/assets/stylesheets → app/assets/stylesheets/rocket_job_mission_control}/fontawesome-all.min.css.erb +0 -0
  26. data/app/assets/stylesheets/rocket_job_mission_control/jobs.css +56 -0
  27. data/app/assets/stylesheets/rocket_job_mission_control/selectize.bootstrap3.css +1 -0
  28. data/app/assets/stylesheets/rocket_job_mission_control/selectize.css +19 -0
  29. data/app/assets/stylesheets/rocket_job_mission_control/worker_processes.css +7 -0
  30. data/app/controllers/rocket_job_mission_control/application_controller.rb +2 -0
  31. data/app/controllers/rocket_job_mission_control/dirmon_entries_controller.rb +23 -23
  32. data/app/controllers/rocket_job_mission_control/jobs_controller.rb +57 -7
  33. data/app/controllers/rocket_job_mission_control/servers_controller.rb +7 -7
  34. data/app/datatables/rocket_job_mission_control/dirmon_entries_datatable.rb +1 -1
  35. data/app/datatables/rocket_job_mission_control/jobs_datatable.rb +1 -1
  36. data/app/helpers/rocket_job_mission_control/application_helper.rb +52 -27
  37. data/app/helpers/rocket_job_mission_control/dirmon_entries_helper.rb +12 -0
  38. data/app/helpers/rocket_job_mission_control/jobs_helper.rb +76 -8
  39. data/app/helpers/rocket_job_mission_control/servers_helper.rb +4 -0
  40. data/app/models/rocket_job_mission_control/dirmon_sanitizer.rb +68 -0
  41. data/app/models/rocket_job_mission_control/job_sanitizer.rb +38 -0
  42. data/app/views/layouts/rocket_job_mission_control/application.html.erb +2 -2
  43. data/app/views/layouts/rocket_job_mission_control/partials/_flash.html.erb +4 -4
  44. data/app/views/rocket_job_mission_control/dirmon_entries/_form.html.erb +78 -42
  45. data/app/views/rocket_job_mission_control/dirmon_entries/_input_categories.html.erb +59 -0
  46. data/app/views/rocket_job_mission_control/dirmon_entries/_input_category_fields.html.erb +56 -0
  47. data/app/views/rocket_job_mission_control/dirmon_entries/_output_categories.html.erb +44 -0
  48. data/app/views/rocket_job_mission_control/dirmon_entries/_output_category_fields.html.erb +36 -0
  49. data/app/views/rocket_job_mission_control/dirmon_entries/_status.html.erb +22 -16
  50. data/app/views/rocket_job_mission_control/dirmon_entries/copy.html.erb +1 -1
  51. data/app/views/rocket_job_mission_control/dirmon_entries/edit.html.erb +7 -3
  52. data/app/views/rocket_job_mission_control/dirmon_entries/show.html.erb +2 -3
  53. data/app/views/rocket_job_mission_control/jobs/_attributes.html.erb +28 -0
  54. data/app/views/rocket_job_mission_control/jobs/_dates.html.erb +35 -0
  55. data/app/views/rocket_job_mission_control/jobs/_details.html.erb +125 -0
  56. data/app/views/rocket_job_mission_control/jobs/_exception.html.erb +22 -0
  57. data/app/views/rocket_job_mission_control/jobs/_input_categories.html.erb +76 -0
  58. data/app/views/rocket_job_mission_control/jobs/_input_category_fields.html.erb +56 -0
  59. data/app/views/rocket_job_mission_control/jobs/_output_categories.html.erb +49 -0
  60. data/app/views/rocket_job_mission_control/jobs/_output_category_fields.html.erb +36 -0
  61. data/app/views/rocket_job_mission_control/jobs/_retryable.html.erb +16 -0
  62. data/app/views/rocket_job_mission_control/jobs/_status.html.erb +20 -48
  63. data/app/views/rocket_job_mission_control/jobs/edit.html.erb +28 -0
  64. data/app/views/rocket_job_mission_control/jobs/edit_slice.html.erb +2 -2
  65. data/app/views/rocket_job_mission_control/jobs/exception.html.erb +1 -1
  66. data/app/views/rocket_job_mission_control/jobs/index.html.erb +24 -18
  67. data/app/views/rocket_job_mission_control/jobs/show.html.erb +32 -58
  68. data/app/views/rocket_job_mission_control/jobs/view_slice.html.erb +6 -4
  69. data/config/initializers/assets.rb +3 -4
  70. data/lib/rocket_job_mission_control/engine.rb +2 -2
  71. data/lib/rocket_job_mission_control/version.rb +1 -1
  72. data/test/controllers/rocket_job_mission_control/dirmon_entries_controller_test.rb +3 -3
  73. data/test/controllers/rocket_job_mission_control/jobs_controller_test.rb +7 -6
  74. data/test/controllers/rocket_job_mission_control/servers_controller_test.rb +3 -3
  75. data/test/models/rocket_job_mission_control/dirmon_sanitizer_test.rb +146 -0
  76. data/test/models/rocket_job_mission_control/job_sanitizer_test.rb +1 -1
  77. data/test/test_helper.rb +5 -11
  78. metadata +62 -41
  79. data/app/assets/javascripts/rocket_job_mission_control/selectize.js +0 -8
  80. data/app/assets/stylesheets/rocket_job_mission_control/base.scss +0 -436
  81. data/app/assets/stylesheets/rocket_job_mission_control/bootstrap_and_overrides.scss +0 -488
  82. data/app/assets/stylesheets/rocket_job_mission_control/jobs.scss +0 -72
  83. data/app/assets/stylesheets/rocket_job_mission_control/worker_processes.scss +0 -9
  84. data/vendor/assets/javascripts/bootstrap.min.js +0 -7
  85. data/vendor/assets/javascripts/microplugin.js +0 -135
  86. data/vendor/assets/javascripts/selectize.js +0 -3058
  87. data/vendor/assets/javascripts/sifter.js +0 -470
  88. data/vendor/assets/stylesheets/bootstrap.min.css +0 -6
  89. data/vendor/assets/stylesheets/bootstrap.min.css.map +0 -1
  90. data/vendor/assets/stylesheets/selectize.bootstrap3.css +0 -408
  91. data/vendor/assets/stylesheets/selectize.css +0 -317
@@ -1,470 +0,0 @@
1
- /**
2
- * sifter.js
3
- * Copyright (c) 2013 Brian Reavis & contributors
4
- *
5
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this
6
- * file except in compliance with the License. You may obtain a copy of the License at:
7
- * http://www.apache.org/licenses/LICENSE-2.0
8
- *
9
- * Unless required by applicable law or agreed to in writing, software distributed under
10
- * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
11
- * ANY KIND, either express or implied. See the License for the specific language
12
- * governing permissions and limitations under the License.
13
- *
14
- * @author Brian Reavis <brian@thirdroute.com>
15
- */
16
-
17
- (function(root, factory) {
18
- if (typeof define === 'function' && define.amd) {
19
- define(factory);
20
- } else if (typeof exports === 'object') {
21
- module.exports = factory();
22
- } else {
23
- root.Sifter = factory();
24
- }
25
- }(this, function() {
26
-
27
- /**
28
- * Textually searches arrays and hashes of objects
29
- * by property (or multiple properties). Designed
30
- * specifically for autocomplete.
31
- *
32
- * @constructor
33
- * @param {array|object} items
34
- * @param {object} items
35
- */
36
- var Sifter = function(items, settings) {
37
- this.items = items;
38
- this.settings = settings || {diacritics: true};
39
- };
40
-
41
- /**
42
- * Splits a search string into an array of individual
43
- * regexps to be used to match results.
44
- *
45
- * @param {string} query
46
- * @returns {array}
47
- */
48
- Sifter.prototype.tokenize = function(query) {
49
- query = trim(String(query || '').toLowerCase());
50
- if (!query || !query.length) return [];
51
-
52
- var i, n, regex, letter;
53
- var tokens = [];
54
- var words = query.split(/ +/);
55
-
56
- for (i = 0, n = words.length; i < n; i++) {
57
- regex = escape_regex(words[i]);
58
- if (this.settings.diacritics) {
59
- for (letter in DIACRITICS) {
60
- if (DIACRITICS.hasOwnProperty(letter)) {
61
- regex = regex.replace(new RegExp(letter, 'g'), DIACRITICS[letter]);
62
- }
63
- }
64
- }
65
- tokens.push({
66
- string : words[i],
67
- regex : new RegExp(regex, 'i')
68
- });
69
- }
70
-
71
- return tokens;
72
- };
73
-
74
- /**
75
- * Iterates over arrays and hashes.
76
- *
77
- * ```
78
- * this.iterator(this.items, function(item, id) {
79
- * // invoked for each item
80
- * });
81
- * ```
82
- *
83
- * @param {array|object} object
84
- */
85
- Sifter.prototype.iterator = function(object, callback) {
86
- var iterator;
87
- if (is_array(object)) {
88
- iterator = Array.prototype.forEach || function(callback) {
89
- for (var i = 0, n = this.length; i < n; i++) {
90
- callback(this[i], i, this);
91
- }
92
- };
93
- } else {
94
- iterator = function(callback) {
95
- for (var key in this) {
96
- if (this.hasOwnProperty(key)) {
97
- callback(this[key], key, this);
98
- }
99
- }
100
- };
101
- }
102
-
103
- iterator.apply(object, [callback]);
104
- };
105
-
106
- /**
107
- * Returns a function to be used to score individual results.
108
- *
109
- * Good matches will have a higher score than poor matches.
110
- * If an item is not a match, 0 will be returned by the function.
111
- *
112
- * @param {object|string} search
113
- * @param {object} options (optional)
114
- * @returns {function}
115
- */
116
- Sifter.prototype.getScoreFunction = function(search, options) {
117
- var self, fields, tokens, token_count;
118
-
119
- self = this;
120
- search = self.prepareSearch(search, options);
121
- tokens = search.tokens;
122
- fields = search.options.fields;
123
- token_count = tokens.length;
124
-
125
- /**
126
- * Calculates how close of a match the
127
- * given value is against a search token.
128
- *
129
- * @param {mixed} value
130
- * @param {object} token
131
- * @return {number}
132
- */
133
- var scoreValue = function(value, token) {
134
- var score, pos;
135
-
136
- if (!value) return 0;
137
- value = String(value || '');
138
- pos = value.search(token.regex);
139
- if (pos === -1) return 0;
140
- score = token.string.length / value.length;
141
- if (pos === 0) score += 0.5;
142
- return score;
143
- };
144
-
145
- /**
146
- * Calculates the score of an object
147
- * against the search query.
148
- *
149
- * @param {object} token
150
- * @param {object} data
151
- * @return {number}
152
- */
153
- var scoreObject = (function() {
154
- var field_count = fields.length;
155
- if (!field_count) {
156
- return function() { return 0; };
157
- }
158
- if (field_count === 1) {
159
- return function(token, data) {
160
- return scoreValue(data[fields[0]], token);
161
- };
162
- }
163
- return function(token, data) {
164
- for (var i = 0, sum = 0; i < field_count; i++) {
165
- sum += scoreValue(data[fields[i]], token);
166
- }
167
- return sum / field_count;
168
- };
169
- })();
170
-
171
- if (!token_count) {
172
- return function() { return 0; };
173
- }
174
- if (token_count === 1) {
175
- return function(data) {
176
- return scoreObject(tokens[0], data);
177
- };
178
- }
179
-
180
- if (search.options.conjunction === 'and') {
181
- return function(data) {
182
- var score;
183
- for (var i = 0, sum = 0; i < token_count; i++) {
184
- score = scoreObject(tokens[i], data);
185
- if (score <= 0) return 0;
186
- sum += score;
187
- }
188
- return sum / token_count;
189
- };
190
- } else {
191
- return function(data) {
192
- for (var i = 0, sum = 0; i < token_count; i++) {
193
- sum += scoreObject(tokens[i], data);
194
- }
195
- return sum / token_count;
196
- };
197
- }
198
- };
199
-
200
- /**
201
- * Returns a function that can be used to compare two
202
- * results, for sorting purposes. If no sorting should
203
- * be performed, `null` will be returned.
204
- *
205
- * @param {string|object} search
206
- * @param {object} options
207
- * @return function(a,b)
208
- */
209
- Sifter.prototype.getSortFunction = function(search, options) {
210
- var i, n, self, field, fields, fields_count, multiplier, multipliers, get_field, implicit_score, sort;
211
-
212
- self = this;
213
- search = self.prepareSearch(search, options);
214
- sort = (!search.query && options.sort_empty) || options.sort;
215
-
216
- /**
217
- * Fetches the specified sort field value
218
- * from a search result item.
219
- *
220
- * @param {string} name
221
- * @param {object} result
222
- * @return {mixed}
223
- */
224
- get_field = function(name, result) {
225
- if (name === '$score') return result.score;
226
- return self.items[result.id][name];
227
- };
228
-
229
- // parse options
230
- fields = [];
231
- if (sort) {
232
- for (i = 0, n = sort.length; i < n; i++) {
233
- if (search.query || sort[i].field !== '$score') {
234
- fields.push(sort[i]);
235
- }
236
- }
237
- }
238
-
239
- // the "$score" field is implied to be the primary
240
- // sort field, unless it's manually specified
241
- if (search.query) {
242
- implicit_score = true;
243
- for (i = 0, n = fields.length; i < n; i++) {
244
- if (fields[i].field === '$score') {
245
- implicit_score = false;
246
- break;
247
- }
248
- }
249
- if (implicit_score) {
250
- fields.unshift({field: '$score', direction: 'desc'});
251
- }
252
- } else {
253
- for (i = 0, n = fields.length; i < n; i++) {
254
- if (fields[i].field === '$score') {
255
- fields.splice(i, 1);
256
- break;
257
- }
258
- }
259
- }
260
-
261
- multipliers = [];
262
- for (i = 0, n = fields.length; i < n; i++) {
263
- multipliers.push(fields[i].direction === 'desc' ? -1 : 1);
264
- }
265
-
266
- // build function
267
- fields_count = fields.length;
268
- if (!fields_count) {
269
- return null;
270
- } else if (fields_count === 1) {
271
- field = fields[0].field;
272
- multiplier = multipliers[0];
273
- return function(a, b) {
274
- return multiplier * cmp(
275
- get_field(field, a),
276
- get_field(field, b)
277
- );
278
- };
279
- } else {
280
- return function(a, b) {
281
- var i, result, a_value, b_value, field;
282
- for (i = 0; i < fields_count; i++) {
283
- field = fields[i].field;
284
- result = multipliers[i] * cmp(
285
- get_field(field, a),
286
- get_field(field, b)
287
- );
288
- if (result) return result;
289
- }
290
- return 0;
291
- };
292
- }
293
- };
294
-
295
- /**
296
- * Parses a search query and returns an object
297
- * with tokens and fields ready to be populated
298
- * with results.
299
- *
300
- * @param {string} query
301
- * @param {object} options
302
- * @returns {object}
303
- */
304
- Sifter.prototype.prepareSearch = function(query, options) {
305
- if (typeof query === 'object') return query;
306
-
307
- options = extend({}, options);
308
-
309
- var option_fields = options.fields;
310
- var option_sort = options.sort;
311
- var option_sort_empty = options.sort_empty;
312
-
313
- if (option_fields && !is_array(option_fields)) options.fields = [option_fields];
314
- if (option_sort && !is_array(option_sort)) options.sort = [option_sort];
315
- if (option_sort_empty && !is_array(option_sort_empty)) options.sort_empty = [option_sort_empty];
316
-
317
- return {
318
- options : options,
319
- query : String(query || '').toLowerCase(),
320
- tokens : this.tokenize(query),
321
- total : 0,
322
- items : []
323
- };
324
- };
325
-
326
- /**
327
- * Searches through all items and returns a sorted array of matches.
328
- *
329
- * The `options` parameter can contain:
330
- *
331
- * - fields {string|array}
332
- * - sort {array}
333
- * - score {function}
334
- * - filter {bool}
335
- * - limit {integer}
336
- *
337
- * Returns an object containing:
338
- *
339
- * - options {object}
340
- * - query {string}
341
- * - tokens {array}
342
- * - total {int}
343
- * - items {array}
344
- *
345
- * @param {string} query
346
- * @param {object} options
347
- * @returns {object}
348
- */
349
- Sifter.prototype.search = function(query, options) {
350
- var self = this, value, score, search, calculateScore;
351
- var fn_sort;
352
- var fn_score;
353
-
354
- search = this.prepareSearch(query, options);
355
- options = search.options;
356
- query = search.query;
357
-
358
- // generate result scoring function
359
- fn_score = options.score || self.getScoreFunction(search);
360
-
361
- // perform search and sort
362
- if (query.length) {
363
- self.iterator(self.items, function(item, id) {
364
- score = fn_score(item);
365
- if (options.filter === false || score > 0) {
366
- search.items.push({'score': score, 'id': id});
367
- }
368
- });
369
- } else {
370
- self.iterator(self.items, function(item, id) {
371
- search.items.push({'score': 1, 'id': id});
372
- });
373
- }
374
-
375
- fn_sort = self.getSortFunction(search, options);
376
- if (fn_sort) search.items.sort(fn_sort);
377
-
378
- // apply limits
379
- search.total = search.items.length;
380
- if (typeof options.limit === 'number') {
381
- search.items = search.items.slice(0, options.limit);
382
- }
383
-
384
- return search;
385
- };
386
-
387
- // utilities
388
- // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
389
-
390
- var cmp = function(a, b) {
391
- if (typeof a === 'number' && typeof b === 'number') {
392
- return a > b ? 1 : (a < b ? -1 : 0);
393
- }
394
- a = asciifold(String(a || ''));
395
- b = asciifold(String(b || ''));
396
- if (a > b) return 1;
397
- if (b > a) return -1;
398
- return 0;
399
- };
400
-
401
- var extend = function(a, b) {
402
- var i, n, k, object;
403
- for (i = 1, n = arguments.length; i < n; i++) {
404
- object = arguments[i];
405
- if (!object) continue;
406
- for (k in object) {
407
- if (object.hasOwnProperty(k)) {
408
- a[k] = object[k];
409
- }
410
- }
411
- }
412
- return a;
413
- };
414
-
415
- var trim = function(str) {
416
- return (str + '').replace(/^\s+|\s+$|/g, '');
417
- };
418
-
419
- var escape_regex = function(str) {
420
- return (str + '').replace(/([.?*+^$[\]\\(){}|-])/g, '\\$1');
421
- };
422
-
423
- var is_array = Array.isArray || ($ && $.isArray) || function(object) {
424
- return Object.prototype.toString.call(object) === '[object Array]';
425
- };
426
-
427
- var DIACRITICS = {
428
- 'a': '[aÀÁÂÃÄÅàáâãäåĀāąĄ]',
429
- 'c': '[cÇçćĆčČ]',
430
- 'd': '[dđĐďĎð]',
431
- 'e': '[eÈÉÊËèéêëěĚĒēęĘ]',
432
- 'i': '[iÌÍÎÏìíîïĪī]',
433
- 'l': '[lłŁ]',
434
- 'n': '[nÑñňŇńŃ]',
435
- 'o': '[oÒÓÔÕÕÖØòóôõöøŌō]',
436
- 'r': '[rřŘ]',
437
- 's': '[sŠšśŚ]',
438
- 't': '[tťŤ]',
439
- 'u': '[uÙÚÛÜùúûüůŮŪū]',
440
- 'y': '[yŸÿýÝ]',
441
- 'z': '[zŽžżŻźŹ]'
442
- };
443
-
444
- var asciifold = (function() {
445
- var i, n, k, chunk;
446
- var foreignletters = '';
447
- var lookup = {};
448
- for (k in DIACRITICS) {
449
- if (DIACRITICS.hasOwnProperty(k)) {
450
- chunk = DIACRITICS[k].substring(2, DIACRITICS[k].length - 1);
451
- foreignletters += chunk;
452
- for (i = 0, n = chunk.length; i < n; i++) {
453
- lookup[chunk.charAt(i)] = k;
454
- }
455
- }
456
- }
457
- var regexp = new RegExp('[' + foreignletters + ']', 'g');
458
- return function(str) {
459
- return str.replace(regexp, function(foreignletter) {
460
- return lookup[foreignletter];
461
- }).toLowerCase();
462
- };
463
- })();
464
-
465
-
466
- // export
467
- // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
468
-
469
- return Sifter;
470
- }));