Fix lint errors and update eslint

Fixes a couple of lint errors caught by `npm run lint` in timeline-
overview.js and timeline-viewport.js. Also restructures the test-
details controller to use appropriate `this.` syntax instead of
`$scope.`

In addition, eslint and eslint-config-openstack have been updated,
and a new .eslintrc.json config file has been created to tweak some
specific rules for stackviz.

Change-Id: I9e1fe5121621730eb3efda4b99e9fe182f399aee
This commit is contained in:
Austin Clark 2016-01-26 11:54:17 -07:00
parent 6fab4c7e3f
commit 093c02d0b9
21 changed files with 82 additions and 93 deletions

View File

@ -1,14 +0,0 @@
# Use eslint-config-openstack
extends: openstack
# Set up globals
globals:
angular: false
module: false
env:
browser: true
jasmine: true
rules:
module-setter: 0

25
.eslintrc.json Normal file
View File

@ -0,0 +1,25 @@
{
"extends" : "openstack",
"globals" : {
"angular": false,
"module": false
},
"env" : {
"browser": true,
"jasmine": true
},
"rules" : {
"module-setter": 0,
"strict": [2,"global"],
"valid-jsdoc": 0,
"brace-style": [2, "1tbs", { "allowSingleLine": true }],
"no-extra-parens": [2, "functions"],
"complexity": 0,
"no-unused-vars": 0,
"guard-for-in": 0
}
}

View File

@ -10,7 +10,7 @@
<link rel="stylesheet" href="css/main.css">
</head>
<body class="ng-cloak" ng-controller="MainCtrl">
<body class="ng-cloak" ng-controller="MainController">
<header class="navbar navbar-default navbar-fixed-top navbar-inner">
<div class="container">
<div class="navbar-header">

View File

@ -26,4 +26,4 @@ function HomeCtrl($scope, $state, datasetService) {
}
controllersModule.controller('HomeCtrl', HomeCtrl);
controllersModule.controller('HomeController', HomeCtrl);

View File

@ -12,4 +12,4 @@ function MainCtrl($window, $scope) {
});
}
controllersModule.controller('MainCtrl', MainCtrl);
controllersModule.controller('MainController', MainCtrl);

View File

@ -5,19 +5,18 @@ var controllersModule = require('./_index');
/**
* @ngInject
*/
function TestDetailsCtrl($scope, $location, $stateParams, datasetService, progressService) {
// ViewModel
var TestDetailsCtrl = function($scope, $location, $stateParams, datasetService, progressService) {
var vm = this;
$scope.datasetId = $stateParams.datasetId;
vm.datasetId = $stateParams.datasetId;
var testName = $stateParams.test;
$scope.testName = testName;
vm.testName = testName;
progressService.start({ parent: 'div[role="main"] .panel-body' });
// load dataset, raw json, and details json
datasetService.get($stateParams.datasetId).then(function(response) {
$scope.dataset = response;
$scope.stats = response.stats;
vm.dataset = response;
vm.stats = response.stats;
datasetService.raw(response).then(function(raw) {
var item = null;
for (var t in raw.data) {
@ -25,7 +24,7 @@ function TestDetailsCtrl($scope, $location, $stateParams, datasetService, progre
item = raw.data[t];
}
}
$scope.item = item;
vm.item = item;
progressService.inc();
}).catch(function(ex) {
@ -33,9 +32,9 @@ function TestDetailsCtrl($scope, $location, $stateParams, datasetService, progre
progressService.done();
});
datasetService.details(response).then(function(deets) {
$scope.details = deets;
$scope.originalDetails = angular.copy(deets.data[testName]);
$scope.itemDetails = deets.data[testName];
vm.details = deets;
vm.originalDetails = angular.copy(deets.data[testName]);
vm.itemDetails = deets.data[testName];
progressService.done();
}).catch(function(ex) {
@ -47,9 +46,9 @@ function TestDetailsCtrl($scope, $location, $stateParams, datasetService, progre
progressService.done();
});
$scope.parsePythonLogging = function(showINFO, showDEBUG, showWARNING, showERROR) {
if ($scope.originalDetails && $scope.originalDetails.pythonlogging) {
var log = $scope.originalDetails.pythonlogging;
vm.parsePythonLogging = function(showINFO, showDEBUG, showWARNING, showERROR) {
if (vm.originalDetails && vm.originalDetails.pythonlogging) {
var log = vm.originalDetails.pythonlogging;
var ret = [];
var lines = log.split('\n');
for (var i in lines) {
@ -57,19 +56,19 @@ function TestDetailsCtrl($scope, $location, $stateParams, datasetService, progre
if (showINFO && line.includes("INFO")) {
ret.push(line);
}
else if (showDEBUG && line.includes("DEBUG")) {
if (showDEBUG && line.includes("DEBUG")) {
ret.push(line);
}
else if (showWARNING && line.includes("WARNING")) {
if (showWARNING && line.includes("WARNING")) {
ret.push(line);
}
else if (showERROR && line.includes("ERROR")) {
if (showERROR && line.includes("ERROR")) {
ret.push(line);
}
}
$scope.itemDetails.pythonlogging = ret.join('\n');
vm.itemDetails.pythonlogging = ret.join('\n');
}
};
}
controllersModule.controller('TestDetailsCtrl', TestDetailsCtrl);
};
controllersModule.controller('TestDetailsController', TestDetailsCtrl);

View File

@ -34,4 +34,4 @@ function TimelineCtrl($scope, $location, $stateParams, datasetService) {
}
controllersModule.controller('TimelineCtrl', TimelineCtrl);
controllersModule.controller('TimelineController', TimelineCtrl);

View File

@ -19,8 +19,7 @@ function testDetailsSearch() {
this.showERROR = true;
var update = function() {
$scope.$parent
.parsePythonLogging(self.showINFO, self.showDEBUG, self.showWARNING, self.showERROR);
$scope.filter(self.showINFO, self.showDEBUG, self.showWARNING, self.showERROR);
};
$scope.$watch(function() { return self.query; }, update);
@ -32,9 +31,9 @@ function testDetailsSearch() {
return {
restrict: 'EA',
require: ['^testDetailsSearch', '^testDetails'],
require: ['^testDetailsSearch','^testDetails'],
scope: {
'parsePythonLogging': '&'
'filter': '='
},
controller: controller,
controllerAs: 'search',

View File

@ -178,7 +178,6 @@ function timelineOverview() {
scope.$on('filter', function() {
if (loaded) {
console.log('filtering');
updateItems(timelineController.data);
}
});

View File

@ -102,8 +102,8 @@ function timelineViewport($document) {
timelineController.setHover(d);
scope.$apply();
if (!timelineController.selection
|| d !== timelineController.selection.item) {
if (!timelineController.selection ||
d !== timelineController.selection.item) {
color(d3.select(this), statusColorMap.hover);
}
};
@ -112,8 +112,8 @@ function timelineViewport($document) {
timelineController.clearHover();
scope.$apply();
if (!timelineController.selection
|| d !== timelineController.selection.item) {
if (!timelineController.selection ||
d !== timelineController.selection.item) {
var self = d3.select(this);
uncolor(d3.select(this));
}

View File

@ -20,7 +20,7 @@ var parseWorker = function(tags) {
continue;
}
return parseInt(tags[i].split('-')[1]);
return parseInt(tags[i].split('-')[1], 10);
}
return null;
@ -286,10 +286,10 @@ function timeline($log, datasetService, progressService) {
d3.select(window)
.on("keydown", function() {
var code = d3.event.keyCode;
if (code == 37) {
if (code === 37) {
ctrl.selectPreviousItem();
}
else if (code == 39) {
if (code === 39) {
ctrl.selectNextItem();
}
scope.$apply();

View File

@ -31,7 +31,7 @@ var onConfig = require('./on_config');
angular.module('app').config(onConfig);
var onRun = require('./on_run');
angular.module('app').run(require('./on_run'));
angular.module('app').run(onRun);
angular.bootstrap(document, ['app'], {
strictDi: true

View File

@ -8,14 +8,14 @@ function OnConfig($stateProvider, $locationProvider, $urlRouterProvider) {
$stateProvider.state('home', {
url: '/{datasetId:int}',
params: { datasetId: 0 },
controller: 'HomeCtrl as home',
controller: 'HomeController as home',
templateUrl: 'home.html',
title: 'Home'
});
$stateProvider.state('timeline', {
url: '/{datasetId:int}/timeline?test',
controller: 'TimelineCtrl as timeline',
controller: 'TimelineController as timeline',
templateUrl: 'timeline.html',
reloadOnSearch: false,
title: 'Timeline'
@ -23,7 +23,8 @@ function OnConfig($stateProvider, $locationProvider, $urlRouterProvider) {
$stateProvider.state('testDetails', {
url: '/{datasetId:int}/test-details/{test}',
controller: 'TestDetailsCtrl as testDetails',
controller: 'TestDetailsController',
controllerAs: 'testDetails',
templateUrl: 'test-details.html',
title: 'Test Details'
});
@ -32,4 +33,5 @@ function OnConfig($stateProvider, $locationProvider, $urlRouterProvider) {
}
OnConfig.$inject = ['$stateProvider','$locationProvider','$urlRouterProvider'];
module.exports = OnConfig;

View File

@ -21,4 +21,5 @@ function OnRun($rootScope, AppSettings) {
}
OnRun.$inject = ['$rootScope','AppSettings'];
module.exports = OnRun;

View File

@ -20,7 +20,8 @@ function DatasetService($q, $http) {
service.get = function(id) {
return $q(function(resolve, reject) {
service.list().then(function(response) {
for (let entry of response.data.tempest) {
for (var i in response.data.tempest) {
var entry = response.data.tempest[i];
if (entry.id === id) {
resolve(entry);
return;

View File

@ -1,5 +1,6 @@
"use strict";
var binaryMinIndex = function(min, array, func) {
"use strict";
var left = 0;
var right = array.length - 1;
@ -26,7 +27,6 @@ var binaryMinIndex = function(min, array, func) {
};
var binaryMaxIndex = function(max, array, func) {
"use strict";
var left = 0;
var right = array.length - 1;

View File

@ -1,7 +1,8 @@
'use strict';
var d3 = require("d3");
var fillArrayRight = function(array) {
"use strict";
// "fill" the array to the right, overwriting empty values with the next
// non-empty value to the left
@ -14,7 +15,6 @@ var fillArrayRight = function(array) {
};
var mergeNames = function(primary, secondary) {
"use strict";
// "zip" together strings in the same position in each array, and do some
// basic cleanup of results
@ -26,7 +26,6 @@ var mergeNames = function(primary, secondary) {
};
var parseDstat = function(data, year) {
"use strict";
var primaryNames = null;
var secondaryNames = null;

View File

@ -10,8 +10,8 @@
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">
{{testName | split:'.' | slice:-2 | join:'.'}}
<test-details-search class="pull-right"></test-details-search>
{{testDetails.testName | split:'.' | slice:-2 | join:'.'}}
<test-details-search class="pull-right" filter="testDetails.parsePythonLogging"></test-details-search>
</h3>
</div>
@ -21,26 +21,26 @@
<table class="table table-bordered table-hover table-striped">
<tr>
<td>Name</td>
<td>{{item.name | split:'.' | pickRight:1}}</td>
<td>{{testDetails.item.name | split:'.' | pickRight:1}}</td>
<tr>
<td>Full Name</td>
<td>{{item.name}}</td>
<td>{{testDetails.item.name}}</td>
</tr>
<tr>
<td>Status</td>
<td>{{item.status}}</td>
<td>{{testDetails.item.status}}</td>
</tr>
<tr>
<td>Tags</td>
<td>{{item.tags | join:', '}}</td>
<td>{{testDetails.item.tags | join:', '}}</td>
</tr>
<tr>
<td>Duration</td>
<td>{{item.duration | number:1}} seconds</td>
<td>{{testDetails.item.duration | number:1}} seconds</td>
</tr>
</table>
</uib-tab>
<uib-tab ng-repeat="(entry,log) in itemDetails" heading="{{entry}}">
<uib-tab ng-repeat="(entry,log) in testDetails.itemDetails" heading="{{entry}}">
<pre style="height: 400px; overflow-y: scroll;">{{log}}</pre>
</uib-tab>
</uib-tabset>
@ -48,7 +48,7 @@
<div class="panel-footer clearfix">
<a class="btn btn-default pull-right"
ui-sref="timeline({datasetId: dataset.id, test: item.name})">
ui-sref="timeline({datasetId: testDetails.dataset.id, test: testDetails.item.name})">
Timeline
</a>
</div>

View File

@ -22,8 +22,8 @@
"bulkify": "^1.1.1",
"d3": "^3.5.6",
"del": "^0.1.3",
"eslint": "1.5.1",
"eslint-config-openstack": "1.2.2",
"eslint": "^1.10.3",
"eslint-config-openstack": "^1.2.3",
"eslint-plugin-angular": "0.12.0",
"express": "^4.7.2",
"gulp": "^3.8.8",

View File

@ -1,7 +1,7 @@
'use strict';
var istanbul = require('browserify-istanbul');
var isparta = require('isparta');
var isparta = require('isparta');
module.exports = function(config) {

View File

@ -1,22 +0,0 @@
/*global angular */
'use strict';
describe('Unit: HomeCtrl', function() {
var ctrl;
beforeEach(function() {
// instantiate the app module
angular.mock.module('app');
angular.mock.inject(function($controller) {
ctrl = $controller('HomeCtrl');
});
});
it('should exist', function() {
expect(ctrl).toBeDefined();
});
});