1 App.AnalysisTask = App.NameLabelModel.extend({
2 author: DS.attr('string'),
3 createdAt: DS.attr('date'),
4 platform: DS.belongsTo('platform'),
5 metric: DS.belongsTo('metric'),
6 startRun: DS.attr('number'),
7 endRun: DS.attr('number'),
8 bugs: DS.hasMany('bugs'),
9 testGroups: function (key, value, oldValue) {
10 return this.store.find('testGroup', {task: this.get('id')});
12 triggerable: function () {
13 return this.store.find('triggerable', {task: this.get('id')}).then(function (triggerables) {
14 return triggerables.objectAt(0);
20 var label = this.get('name');
21 var bugs = this.get('bugs').map(function (bug) { return bug.get('label'); }).join(' / ');
22 return bugs ? label + ' (' + bugs + ')' : label;
23 }.property('name', 'bugs'),
26 App.Bug = App.Model.extend({
27 task: DS.belongsTo('AnalysisTask'),
28 bugTracker: DS.belongsTo('BugTracker'),
29 createdAt: DS.attr('date'),
30 number: DS.attr('number'),
32 return this.get('bugTracker').get('label') + ': ' + this.get('number');
33 }.property('name', 'bugTracker'),
36 // FIXME: Use DS.RESTAdapter instead.
37 App.AnalysisTask.create = function (name, startMeasurement, endMeasurement)
39 return PrivilegedAPI.sendRequest('create-analysis-task', {
41 startRun: startMeasurement.id(),
42 endRun: endMeasurement.id(),
46 App.AnalysisTaskAdapter = DS.RESTAdapter.extend({
47 buildURL: function (type, id)
49 return '../api/analysis-tasks/' + (id ? id : '');
53 App.BugAdapter = DS.RESTAdapter.extend({
54 createRecord: function (store, type, record)
57 task: record.get('task').get('id'),
58 bugTracker: record.get('bugTracker').get('id'),
59 number: record.get('number'),
61 return PrivilegedAPI.sendRequest('associate-bug', param).then(function (data) {
62 param['id'] = data['bugId'];
63 return {'bug': param};
68 App.Root = App.Model.extend({
69 repository: DS.belongsTo('repository'),
70 revision: DS.attr('string'),
73 App.RootSet = App.Model.extend({
74 roots: DS.hasMany('roots'),
75 revisionForRepository: function (repository)
77 var root = this.get('roots').findBy('repository', repository);
80 return root.get('revision');
84 App.TestGroup = App.NameLabelModel.extend({
85 task: DS.belongsTo('analysisTask'),
86 author: DS.attr('string'),
87 createdAt: DS.attr('date'),
88 buildRequests: DS.hasMany('buildRequests'),
89 rootSets: DS.hasMany('rootSets'),
90 _fetchTestResults: function ()
92 var task = this.get('task');
96 return App.Manifest.fetchRunsWithPlatformAndMetric(this.store,
97 task.get('platform').get('id'), task.get('metric').get('id'), this.get('id')).then(
98 function (result) { self.set('testResults', result.data); },
100 // FIXME: Somehow this never gets called.
101 alert('Failed to fetch the results:' + error);
104 }.observes('task', 'task.platform', 'task.metric').on('init'),
107 App.TestGroup.create = function (analysisTask, name, rootSets, repetitionCount)
110 task: analysisTask.get('id'),
113 repetitionCount: repetitionCount,
115 return PrivilegedAPI.sendRequest('create-test-group', param).then(function (data) {
116 analysisTask.set('testGroups'); // Refetch test groups.
117 return analysisTask.store.find('testGroup', data['testGroupId']);
121 App.TestGroupAdapter = DS.RESTAdapter.extend({
122 buildURL: function (type, id)
124 return '../api/test-groups/' + (id ? id : '');
128 App.Triggerable = App.NameLabelModel.extend({
129 acceptedRepositories: DS.hasMany('repositories'),
132 App.TriggerableAdapter = DS.RESTAdapter.extend({
133 buildURL: function (type, id)
135 return '../api/triggerables/' + (id ? id : '');
139 App.AnalysisTaskSerializer = App.TestGroupSerializer = App.TriggerableSerializer = DS.RESTSerializer.extend({
140 normalizePayload: function (payload)
142 delete payload['status'];
147 App.BuildRequest = App.Model.extend({
148 testGroup: DS.belongsTo('testGroup'),
149 order: DS.attr('number'),
150 orderLabel: function ()
152 return this.get('order') + 1;
154 rootSet: DS.belongsTo('rootSet'),
155 status: DS.attr('string'),
156 statusLabel: function ()
158 switch (this.get('status')) {
160 return 'Waiting to be scheduled';
170 }.property('status'),
171 url: DS.attr('string'),
172 build: DS.attr('number'),
175 App.BuildRequest.aggregateStatuses = function (requests)
177 var completeCount = 0;
178 var failureCount = 0;
179 requests.forEach(function (request) {
180 switch (request.get('status')) {
189 if (completeCount == requests.length)
191 if (failureCount == requests.length)
193 var status = completeCount + ' out of ' + requests.length + ' completed';
195 status += ', ' + failureCount + ' failed';