banter 1.4.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/.travis.yml +1 -1
  4. data/Gemfile +1 -4
  5. data/README.md +0 -33
  6. data/Rakefile +0 -28
  7. data/banter.gemspec +2 -5
  8. data/lib/banter.rb +1 -1
  9. data/lib/banter/configuration.rb +2 -4
  10. data/lib/banter/notifier.rb +16 -0
  11. data/lib/banter/publisher.rb +1 -1
  12. data/lib/banter/railtie.rb +0 -4
  13. data/lib/banter/server/client_queue_listener.rb +4 -37
  14. data/lib/banter/server/rabbit_mq_subscriber.rb +6 -6
  15. data/lib/banter/server/subscriber_server.rb +0 -13
  16. data/lib/banter/version.rb +1 -1
  17. data/spec/banter/notifier_spec.rb +40 -0
  18. data/spec/banter/server/client_queue_listener_spec.rb +36 -84
  19. data/spec/banter/server/rabbitmq_subscriber_spec.rb +14 -10
  20. data/spec/banter/server/subscriber_server_spec.rb +0 -60
  21. data/spec/banter/subscriber_spec.rb +0 -81
  22. data/spec/spec_helper.rb +1 -8
  23. data/spec/support/test_notifier.rb +17 -0
  24. metadata +33 -100
  25. data/.ruby-version +0 -1
  26. data/lib/banter/web.rb +0 -34
  27. data/lib/banter/web/application.rb +0 -85
  28. data/lib/banter/web/helpers.rb +0 -13
  29. data/lib/banter/web/models/banter_message.rb +0 -124
  30. data/lib/banter/web/models/banter_worker.rb +0 -72
  31. data/lib/banter/web/serializers/banter_message_serializer.rb +0 -35
  32. data/lib/banter/web/serializers/banter_worker_serializer.rb +0 -40
  33. data/lib/banter/web/serializers/subscriber_serializer.rb +0 -26
  34. data/spec/banter/web/application_spec.rb +0 -181
  35. data/spec/banter/web/serializers/banter_message_serializer_spec.rb +0 -42
  36. data/spec/banter/web/serializers/banter_worker_serializer_spec.rb +0 -44
  37. data/spec/factories/banter_messages.rb +0 -28
  38. data/spec/factories/banter_workers.rb +0 -17
  39. data/spec/mongoid.yml +0 -7
  40. data/web/assets/javascripts/banter.js +0 -449
  41. data/web/assets/javascripts/dashboard_app/app.coffee +0 -4
  42. data/web/assets/javascripts/dashboard_app/controllers/message_controller.coffee +0 -28
  43. data/web/assets/javascripts/dashboard_app/controllers/messages_controller.coffee +0 -58
  44. data/web/assets/javascripts/dashboard_app/controllers/subscribers_controller.coffee +0 -25
  45. data/web/assets/javascripts/dashboard_app/controllers/worker_controller.coffee +0 -30
  46. data/web/assets/javascripts/dashboard_app/controllers/workers_list_controller.coffee +0 -28
  47. data/web/assets/javascripts/dashboard_app/routes.coffee +0 -82
  48. data/web/assets/javascripts/dashboard_app/services/common_methods_service.coffee +0 -6
  49. data/web/assets/javascripts/dashboard_app/services/message_methods_service.coffee +0 -18
  50. data/web/assets/javascripts/dashboard_app/services/messages_service.coffee +0 -17
  51. data/web/assets/javascripts/dashboard_app/services/subscribers_service.coffee +0 -8
  52. data/web/assets/javascripts/dashboard_app/services/worker_methods_service.coffee +0 -11
  53. data/web/assets/javascripts/dashboard_app/services/worker_service.coffee +0 -15
  54. data/web/assets/javascripts/ng-prettyjson.js +0 -15
  55. data/web/assets/stylesheets/banter.css +0 -78
  56. data/web/views/_message.haml +0 -74
  57. data/web/views/_messages.haml +0 -77
  58. data/web/views/_subscribers.haml +0 -22
  59. data/web/views/_worker.haml +0 -52
  60. data/web/views/_workers_list.haml +0 -35
  61. data/web/views/index.haml +0 -19
  62. data/web/views/layout.haml +0 -51
@@ -1,4 +0,0 @@
1
- window.Banter ||= {}
2
-
3
- angular.module('dashboardApp', [ 'angularMoment', 'ngRoute', 'ngPrettyJson' ])
4
- angular.module('dashboardApp').constant('rootPath', Banter.rootPath)
@@ -1,28 +0,0 @@
1
- angular.module('dashboardApp').controller 'messageController', ($scope, $rootScope, $http, $routeParams, $timeout, message, messagesService, commonMethodsService, messageMethodsService) ->
2
- commonMethodsService.setup($scope)
3
- messageMethodsService.setup($scope)
4
- $scope.showBacktrace = false
5
- $scope.message = message
6
-
7
- $rootScope.$on 'start-messageController', ->
8
- $scope.resumeUpdating() if autoUpdate
9
- $rootScope.$on 'stop-messageController', ->
10
- $scope.pauseUpdating()
11
-
12
- $scope.updateMessage = ->
13
- if autoUpdate
14
- messagesService.getMessage($scope.message.id).success (response) ->
15
- $scope.message = response.message
16
- $scope.resumeUpdating()
17
-
18
- $scope.pauseUpdating = ->
19
- autoUpdate = false
20
-
21
- $scope.resumeUpdating = ->
22
- autoUpdate = true
23
- $timeout($scope.updateMessage, 5000)
24
-
25
- autoUpdate = $scope.isMessageExecuting()
26
- $scope.resumeUpdating() if $scope.isMessageExecuting()
27
-
28
- return
@@ -1,58 +0,0 @@
1
- angular.module('dashboardApp').controller 'messagesController',
2
- ($scope, $rootScope, $http, $routeParams, $timeout, messages, messagesService, workersService, commonMethodsService, messageMethodsService, workerMethodsService) ->
3
- commonMethodsService.setup($scope)
4
- messageMethodsService.setup($scope)
5
- workerMethodsService.setup($scope)
6
-
7
- $scope.messages = messages
8
- $scope.page = 1
9
- $scope.worker = null
10
-
11
- workerId = $routeParams.worker_id
12
- $scope.subscriber = $routeParams.subscriber
13
- autoUpdate = true
14
-
15
- if workerId
16
- workersService.getWorker(workerId).success (response) ->
17
- $scope.worker = response.worker
18
-
19
- fetchMessages = ->
20
- messagesService.getMessages($scope.page, workerId, $scope.subscriber).success (response) ->
21
- $scope.messages = response.messages
22
- $scope.worker = response.worker
23
-
24
- $rootScope.$on 'start-messagesController', ->
25
- $scope.resumeUpdating()
26
- $rootScope.$on 'stop-messagesController', ->
27
- $scope.pauseUpdating()
28
-
29
- $scope.updateMessages = (resumeUpdate = true) ->
30
- if autoUpdate
31
- fetchMessages()
32
- $scope.resumeUpdating()
33
-
34
- $scope.pauseUpdating = ->
35
- autoUpdate = false
36
-
37
- $scope.resumeUpdating = ->
38
- autoUpdate = true
39
- $timeout($scope.updateMessages, 5000)
40
-
41
- $scope.resumeUpdating() if autoUpdate
42
- $scope.isAutoUpdating = ->
43
- autoUpdate
44
-
45
- $scope.getNextPage = ->
46
- $scope.page += 1
47
- fetchMessages()
48
-
49
- $scope.getPreviousPage = ->
50
- $scope.page -= 1
51
- $scope.page = 1 if $scope.page < 1
52
- fetchMessages()
53
-
54
- $scope.getFirstPage = ->
55
- $scope.page = 1
56
- fetchMessages()
57
-
58
- return
@@ -1,25 +0,0 @@
1
- angular.module('dashboardApp').controller 'subscribersController', ($scope, $rootScope, subscribers, $timeout, subscribersService) ->
2
- $scope.subscribers = subscribers
3
-
4
- $rootScope.$on 'start-subscribersController', ->
5
- $scope.resumeUpdating() if autoUpdate
6
- $rootScope.$on 'stop-subscribersController', ->
7
- $scope.pauseUpdating()
8
-
9
- $scope.updateSubscribers = ->
10
- if autoUpdate
11
- subscribersService.getIndex().success (response) ->
12
- $scope.subscribers = response.subscribers
13
- $scope.resumeUpdating()
14
-
15
- $scope.pauseUpdating = ->
16
- autoUpdate = false
17
-
18
- $scope.resumeUpdating = ->
19
- autoUpdate = true
20
- $timeout($scope.updateSubscribers, 10000)
21
-
22
- autoUpdate = true
23
- $scope.resumeUpdating()
24
-
25
- return
@@ -1,30 +0,0 @@
1
- angular.module('dashboardApp').controller 'workerController', ($scope, $rootScope, $http, $routeParams, $timeout, worker, workersService, commonMethodsService, workerMethodsService) ->
2
- commonMethodsService.setup($scope)
3
- workerMethodsService.setup($scope)
4
-
5
- $scope.worker = worker
6
- autoUpdate = false
7
-
8
- $rootScope.$on 'start-workerController', ->
9
- $scope.resumeUpdating() if autoUpdate
10
- $rootScope.$on 'stop-workerController', ->
11
- $scope.pauseUpdating()
12
-
13
-
14
- $scope.updateWorker = ->
15
- if autoUpdate
16
- workersService.getWorker(worker.id).success (response) ->
17
- $scope.worker = response.worker
18
- $scope.resumeUpdating()
19
-
20
- $scope.pauseUpdating = ->
21
- autoUpdate = false
22
-
23
- $scope.resumeUpdating = ->
24
- autoUpdate = true
25
- $timeout($scope.updateWorker, 5000)
26
-
27
- autoUpdate = $scope.isWorkerAlive($scope.worker)
28
- $scope.resumeUpdating() if $scope.isWorkerAlive($scope.worker)
29
-
30
- return
@@ -1,28 +0,0 @@
1
- angular.module('dashboardApp').controller 'workersListController', ($scope, $rootScope, $timeout, $http, workers, rootPath, workersService, commonMethodsService) ->
2
- commonMethodsService.setup($scope)
3
-
4
- $scope.workers = workers
5
- autoUpdate = true
6
-
7
- $rootScope.$on 'start-workersListController', ->
8
- $scope.resumeUpdating()
9
- $rootScope.$on 'stop-workersListController', ->
10
- $scope.pauseUpdating()
11
-
12
- $scope.updateWorkers = ->
13
- if autoUpdate
14
- workersService.getCurrentList().success (response) ->
15
- $scope.workers = response.workers
16
- $scope.resumeUpdating()
17
-
18
- $scope.pauseUpdating = ->
19
- autoUpdate = false
20
-
21
- $scope.resumeUpdating = ->
22
- autoUpdate = true
23
- $timeout($scope.updateWorkers, 5000)
24
-
25
- $scope.resumeUpdating()
26
- return
27
-
28
-
@@ -1,82 +0,0 @@
1
- angular.module('dashboardApp').config([ '$routeProvider', '$locationProvider', ($routeProvider, $locationProvider, workersService, messagesService) ->
2
- messagesResolver = ($q, messagesService, $route) ->
3
- deferred = $q.defer()
4
- workerId = $route.current.params.worker_id
5
- subscriber = $route.current.params.subscriber
6
- messagesService.getMessages(1, workerId, subscriber).success (response) ->
7
- deferred.resolve(response.messages)
8
- deferred.promise
9
-
10
- messageResolver = ($q, messagesService, $route) ->
11
- deferred = $q.defer()
12
- messagesService.getMessage($route.current.params.message_id).success (response) ->
13
- deferred.resolve(response.message)
14
- deferred.promise
15
-
16
- workerResolver = ($q, $route, workersService) ->
17
- deferred = $q.defer()
18
- workersService.getWorker($route.current.params.worker_id).success (response) ->
19
- deferred.resolve(response.worker)
20
- deferred.promise
21
-
22
- workersResolver = ($q, workersService) ->
23
- deferred = $q.defer()
24
- workersService.getCurrentList().success (response) ->
25
- deferred.resolve(response.workers)
26
- deferred.promise
27
-
28
- subscribersResolver = ($q, subscribersService) ->
29
- deferred = $q.defer()
30
- subscribersService.getIndex().success (response) ->
31
- deferred.resolve(response.subscribers)
32
- deferred.promise
33
-
34
- $routeProvider.when("/",
35
- templateUrl: 'banter/workers-list.html'
36
- controller: 'workersListController'
37
- resolve:
38
- workers: workersResolver
39
-
40
- ).when("/workers/:worker_id",
41
- templateUrl: 'banter/worker.html'
42
- controller: 'workerController'
43
- resolve:
44
- worker: workerResolver
45
- ).when("/workers/:worker_id/messages",
46
- templateUrl: 'banter/messages.html'
47
- controller: 'messagesController'
48
- resolve:
49
- messages: messagesResolver
50
- ).when("/subscribers/:subscriber/messages",
51
- templateUrl: 'banter/messages.html'
52
- controller: 'messagesController'
53
- resolve:
54
- messages: messagesResolver
55
- ).when("/messages/:message_id",
56
- templateUrl: 'banter/message.html'
57
- controller: 'messageController'
58
- resolve:
59
- message: messageResolver
60
- ).when("/messages",
61
- templateUrl: 'banter/messages.html'
62
- controller: 'messagesController'
63
- resolve:
64
- messages: messagesResolver
65
- ).when("/subscribers",
66
- templateUrl: 'banter/subscribers.html'
67
- controller: 'subscribersController'
68
- resolve:
69
- subscribers: subscribersResolver
70
- ).otherwise(
71
- redirectTo: "/"
72
- )
73
- $locationProvider.html5Mode(true)
74
- ])
75
-
76
- angular.module('dashboardApp').run(['$rootScope', '$route', '$location', ($rootScope, $route, $location) ->
77
- $rootScope.$on '$routeChangeStart', (event, next, current) ->
78
- if next.$$route?.controller
79
- $rootScope.$broadcast("start-" + next.$$route.controller)
80
- if current?.$$route?.controller
81
- $rootScope.$broadcast("stop-" + current.$$route.controller)
82
- ])
@@ -1,6 +0,0 @@
1
- angular.module('dashboardApp').service 'commonMethodsService', [ () ->
2
- @setup = (scope) ->
3
- scope.asTime = (time) ->
4
- new Date(time)
5
- return
6
- ]
@@ -1,18 +0,0 @@
1
- angular.module('dashboardApp').service 'messageMethodsService', [ () ->
2
- @setup = (scope) ->
3
- scope.isMessageFailed = (message) ->
4
- message.status is 'failed' || message.status is 'validation_failed'
5
-
6
- scope.timeElapsed = (message) ->
7
- return 0 unless message.done_at
8
- scope.asTime(message.done_at) - scope.asTime(message.started_at)
9
-
10
- scope.isMessageExecuting = (message) ->
11
- scope.message.status is 'started'
12
-
13
- scope.isMessageSuccessful = (message) ->
14
- scope.message.status is 'success'
15
-
16
- return
17
-
18
- ]
@@ -1,17 +0,0 @@
1
- angular.module('dashboardApp').service 'messagesService', [ '$http', ($http) ->
2
- @getMessages = (page, workerId, subscriber) ->
3
- $http(
4
- method: 'get'
5
- url: Banter.rootPath + "messages.json"
6
- params:
7
- page: page
8
- worker_id: workerId
9
- subscriber: subscriber
10
- )
11
- @getMessage = (messageId) ->
12
- $http(
13
- method: 'get'
14
- url: Banter.rootPath + "messages/#{messageId}.json",
15
- )
16
- return
17
- ]
@@ -1,8 +0,0 @@
1
- angular.module('dashboardApp').service 'subscribersService', [ '$http', ($http) ->
2
- @getIndex = () ->
3
- $http(
4
- method: 'get'
5
- url: Banter.rootPath + "subscribers.json"
6
- )
7
- return
8
- ]
@@ -1,11 +0,0 @@
1
- angular.module('dashboardApp').service 'workerMethodsService', [ () ->
2
- @setup = (scope) ->
3
- scope.isWorkerExecuting = (worker)->
4
- worker?.current_message
5
-
6
- scope.isWorkerAlive = (worker) ->
7
- !worker?.stopped_at
8
-
9
- return
10
- ]
11
-
@@ -1,15 +0,0 @@
1
- angular.module('dashboardApp').service 'workersService', [ '$http', ($http) ->
2
- @getCurrentList = () ->
3
- $http(
4
- method: 'get'
5
- url: Banter.rootPath + "workers.json",
6
- )
7
-
8
- @getWorker = (workerId) ->
9
- $http(
10
- method: 'get'
11
- url: "#{Banter.rootPath}workers/#{workerId}.json",
12
- )
13
-
14
- return
15
- ]
@@ -1,15 +0,0 @@
1
- /**
2
- * @license ng-prettyjson - v0.1.2
3
- * (c) 2013 Julien VALERY https://github.com/darul75/ng-prettyjson
4
- * License: MIT
5
- **/
6
- angular.module("ngPrettyJson",[]).directive("prettyJson",["ngPrettyJsonFunctions",function(a){"use strict";var b=angular.isDefined;return{restrict:"AE",scope:{json:"=",prettyJson:"="},replace:!0,template:'<div><button ng-click="edit()" ng-show="edition && !editActivated">Edit</button><button ng-click="edit()" ng-show="edition && editActivated">Cancel</button><button ng-click="update()" ng-show="editActivated && parsable">Update</button><pre id="prettyjson"></pre></div>',link:function(c,d,e){var f={},g="prettyjson",h=null;c.editActivated=!1,c.edition=e.edition;// prefer the "json" attribute over the "prettyJson" one.
7
- // the value on the scope might not be defined yet, so look at the markup.
8
- var i,j=b(e.json)?"json":"prettyJson",k=function(c){return b(c)?d.find("pre").html(a.syntaxHighlight(c)):d.empty()};i=c.$watch(j,function(a){// BACKWARDS COMPATIBILITY:
9
- // if newValue is an object, and we find a `json` property,
10
- // then stop watching on `exp`.
11
- angular.isObject(a)&&b(a.json)?(i(),c.$watch(j+".json",function(a){k(a),f=a},!0)):(k(a),f=a)},!0);var l=function(){try{c.currentValue=JSON.parse(h.getValue()),c.parsable=!0}catch(a){c.parsable=!1}// trigger update
12
- c.$apply(function(){})};c.edit=function(){c.editActivated?(h&&(document.getElementById(g).env=null),k(f)):(h=ace.edit(g),h.on("change",l),h.getSession().setMode("ace/mode/json")),c.editActivated=!c.editActivated},c.update=function(){c.$emit("json-updated",c.newValue)}}}}]).factory("ngPrettyJsonFunctions",function(){// cache some regular expressions
13
- var a={entities:/((&)|(<)|(>))/g,json:/"(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(true|false|(null))\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g},b=["&amp;","&lt;","&gt;"],c=["number","string","key","boolean","null"],d=function(){var a=arguments.length-2;do a--;while(!arguments[a]);return a},e=function(a){var b;// the final two arguments are the length, and the entire string itself;
14
- // we don't care about those.
15
- if(arguments.length<7)throw new Error("markup() must be called from String.prototype.replace()");return b=d.apply(null,arguments),'<span class="'+c[b]+'">'+a+"</span>"},f=function(){var a;if(arguments.length<5)throw new Error("makeEntities() must be called from String.prototype.replace()");return a=d.apply(null,arguments),b[a-2]},g=function(b){return angular.isString(b)||(b=JSON.stringify(b,null,2)),angular.isDefined(b)?b.replace(a.entities,f).replace(a.json,e):void 0};return{syntaxHighlight:g,makeEntities:f,markup:e,rx:a}});
@@ -1,78 +0,0 @@
1
- body {
2
- font-family: 'Open Sans', sans-serif;
3
- }
4
-
5
- .bold {
6
- font-weight: 700;
7
- }
8
-
9
- .extra-bold {
10
- font-weight: 800;
11
- }
12
-
13
- .padding-large {
14
- padding: 15px;
15
- }
16
-
17
- .font-size-md {
18
- font-size: 20px;
19
- }
20
-
21
- .rounded-corners-md {
22
- border-radius: 4px;
23
- }
24
-
25
- .margin-top-md {
26
- margin-top: 10px;
27
- }
28
-
29
- .spin{
30
- -webkit-transform-origin: 50% 58%;
31
- transform-origin:50% 58%;
32
- -ms-transform-origin:50% 58%; /* IE 9 */
33
- -webkit-animation: spin 2s infinite linear;
34
- -moz-animation: spin 2s infinite linear;
35
- -o-animation: spin 2s infinite linear;
36
- animation: spin 2s infinite linear;
37
- }
38
-
39
-
40
- @-moz-keyframes spin {
41
- from {
42
- -moz-transform: rotate(0deg);
43
- }
44
- to {
45
- -moz-transform: rotate(360deg);
46
- }
47
- }
48
-
49
- @-webkit-keyframes spin {
50
- from {
51
- -webkit-transform: rotate(0deg);
52
- }
53
- to {
54
- -webkit-transform: rotate(360deg);
55
- }
56
- }
57
-
58
- @keyframes spin {
59
- from {
60
- transform: rotate(0deg);
61
- }
62
- to {
63
- transform: rotate(360deg);
64
- }
65
- }
66
-
67
- pre > kbd {
68
- background-color: transparent;
69
- box-shadow: none;
70
- }
71
-
72
- /**
73
- * @license ng-prettyjson - v0.1.2
74
- * (c) 2013 Julien VALERY https://github.com/darul75/ng-prettyjson
75
- * License: MIT
76
- **/
77
-
78
- pre{outline:1px solid #e9e9e9;padding:5px;margin:5px;width:100%;height:100%}.string{color:green}.number{color:#ff8c00}.boolean{color:#00f}.null{color:#ff00ff}.key{color:red}
@@ -1,74 +0,0 @@
1
- .clearfix
2
- %div.extra-bold.pull-right.padding-large.font-size-lg.rounded-corners-md{data: { 'ng-class' => "{'bg-danger' : isMessageFailed(message), 'bg-success': isMessageSuccessful(message), 'bg-info': isMessageExecuting(message)}"}}
3
- %span{data: { 'ng-if' => 'isMessageExecuting(message)'}}
4
- %span.glyphicon.glyphicon-refresh.spin
5
- WORKING
6
- %span{data: { 'ng-if' => 'isMessageSuccessful(message)'}}
7
- %span.glyphicon.glyphicon-ok
8
- SUCCESSFUL
9
- %span{data: { 'ng-if' => "message.status == 'error' || message.status == 'failed'"}}
10
- %span.glyphicon.glyphicon-remove
11
- FAILED
12
- %span{data: { 'ng-if' => "message.status == 'validation_failed'"}}
13
- %span.glyphicon.glyphicon-remove
14
- VALIDATION FAILED
15
- %h2
16
- Message
17
-
18
- %ul.list-group.margin-top-md
19
- %li.list-group-item.row
20
- .col-sm-3.bold Subscriber
21
- .col-sm-9 {{ message.subscriber_class }}
22
-
23
- %li.list-group-item.row{data: {'ng-if' => 'message.worker'}}
24
- .col-sm-3.bold Worker
25
- .col-sm-9
26
- %a{data: { 'ng-href' => dashboard_path("workers/{{message.worker.id}}")}} {{ message.worker.process_name }} (PID: {{ message.worker.pid }})
27
- %li.list-group-item.row
28
- .col-sm-3.bold Subscriber Key
29
- .col-sm-9 {{ message.subscribed_key }}
30
-
31
- %li.list-group-item.row
32
- .col-sm-3.bold Payload Key
33
- .col-sm-9 {{ message.payload_key }}
34
-
35
- %li.list-group-item.row
36
- .col-sm-3.bold Payload
37
- .col-sm-9
38
- %pre{data: { 'pretty-json' => 'message.payload'}}
39
-
40
- %li.list-group-item.row{data: { 'ng-if' => 'message.error_message'}}
41
- .col-sm-3.bold Error Message
42
- .col-sm-9 {{ message.error_message }}
43
-
44
- %li.list-group-item.row{data: { 'ng-if' => 'message.error_backtrace'}}
45
- .col-sm-3.bold Error Backtrace
46
- .col-sm-9
47
- %a{data: { 'ng-click' => "showBacktrace = !showBacktrace"}}
48
- %span{data: { 'ng-show' => 'showBacktrace' }} Hide Backtrace
49
- %span{data: { 'ng-show' => '!showBacktrace' }} Show Backtrace
50
- %div{data: { 'ng-if' => 'showBacktrace'}}
51
- %p{data: { 'ng-repeat' => "bt in message.error_backtrace track by $index"}}
52
- {{ bt }}
53
-
54
- %li.list-group-item.row{data: {'ng-show' => 'message.progress || message.progress_at || message.progress_total'}}
55
- .col-sm-3.bold Progress
56
- .col-sm-9
57
- %div
58
- %span{data: {'ng-show' => 'message.progress_at'}} Current: {{message.progress_at }}
59
- %span{data: { 'ng-show' => 'message.progress_total'}} Total: {{ message.progress_total }}
60
- %pre{data: { 'pretty-json' => 'message.progress'}}
61
- %li.list-group-item.row
62
- .col-sm-3.bold Context
63
- .col-sm-9
64
- %pre{data: { 'pretty-json' => 'message.context'}}
65
- %li.list-group-item.row
66
- .col-sm-3.bold Started Time
67
- .col-sm-9 {{ asTime(message.started_at)| amDateFormat:'MM/DD/YYYY, h:mm:ss a' }}
68
- %li.list-group-item.row{data: { "ng-if" => 'message.done_at'}}
69
- .col-sm-3.bold Finished Time
70
- .col-sm-9 {{ asTime(message.started_at)| amDateFormat:'MM/DD/YYYY, h:mm:ss a' }}. Took {{ timeElapsed(message) }}ms
71
- %li.list-group-item.row
72
- .col-sm-3.bold Queue
73
- .col-sm-9 {{ message.queue_name }}
74
- -#