Switched from JSCS to ESLint

This patch switches horizon from using JSCS to using ESlint. It
adds the john papa style guides as an eslint plugin, and deactivates
additional linting rules so current cleanup efforts can focus on the
issues remaining from JSCS. Once that cleanup effort is complete,
we can switch our linting job to voting and move forward from there.

YAML for .eslintrc was chosen because the JSON specification does
not allow comments, and having comments (including rule links) will
make it easier to discuss linting changes.

Deactivated eslint rules have each been annotated with a # TODO
statement, so we can address them in the future. Links in the
documentation have been updated to new contributor guidelines, which
will be updated after this patch lands.

Linting may be executed by first installing npm dependencies using
`npm install`, and then executing `npm run lint` at any time in the
future. No python venv is required.

For clarification: We are switching to ESLint because JSCS explicitly
focuses on code-style, not on language use errors. For that purpose,
JSCS explicitly defers to JSHint, which due to the 'do no evil' license is
not usable. Since ESLint provides both the codestyle functionality, and
the language use checks, of both JSCS and JSHint, it was deemed the
only viable tool,

http://lists.openstack.org/pipermail/openstack-dev/2015-June/067030.html

Change-Id: Ib4c3f77f8cc3cdaa3c7558b7bc3a6d1299b6dcbe
Partially-Implements: blueprint jscs-cleanup
This commit is contained in:
Michael Krotscheck 2015-06-16 10:27:59 -07:00 committed by Shaoquan Chen
parent e217e041d4
commit c6c0352982
19 changed files with 976 additions and 144 deletions

833
.eslintrc Normal file
View File

@ -0,0 +1,833 @@
# For a detailed list of all options please see here:
# http://eslint.org/docs/configuring/
# By default, ESLint uses Espree as its parser.
parser: espree
# Enable eslint-plugin-angular
plugins:
- angular
# Set up globals
globals:
angular: false
# Most environment options are not explicitly enabled or disabled, only
# included here for completeness' sake. They are commented out, because the
# global updates.py script would otherwise override them during a global
# requirements synchronization.
#
# Individual projects should choose which platforms they deploy to.
env:
# browser global variables.
browser: true
# Node.js global variables and Node.js-specific rules.
# node: true
# web workers global variables.
# worker: true
# defines require() and define() as global variables as per the amd spec.
# amd: true
# Adds all of the Jasmine testing global variables for version 1.3 and 2.0.
jasmine: true
# phantomjs global variables.
# phantomjs: true
# jquery global variables.
# jquery: true
# prototypejs global variables.
# prototypejs: true
# shelljs global variables.
# shelljs: true
# meteor global variables.
# meteor: true
# OpenStack uses Jasmine, not Mocha.
mocha: false
# Openstack does not support ES6 at its present level of adoption.
es6: false
# Below we activate and configure the linting rules for all javascript in
# OpenStack. These will be synchronized across all projects that make use of
# them.
rules:
#############################################################################
# Possible Errors
#############################################################################
# Disallow trailing commas, as those break some browsers.
# http://eslint.org/docs/rules/comma-dangle
comma-dangle:
- 2
- "never"
# Prevent the assignment of a variable in a conditional.
# http://eslint.org/docs/rules/no-cond-assign
no-cond-assign: 2
# Do not permit the use of console logging statements.
# http://eslint.org/docs/rules/no-console
no-console: 2
# Do not permit if (true) or if(false)
# http://eslint.org/docs/rules/no-constant-condition
no-constant-condition: 2
# Do not permit ASCII 0-31 (control characters) in regular expressions.
# http://eslint.org/docs/rules/no-control-regex
no-control-regex: 2
# Do not permit debugger; statements.
# http://eslint.org/docs/rules/no-debugger
no-debugger: 2
# Do not permit duplicate argument names in function declaration.
# http://eslint.org/docs/rules/no-dupe-args
no-dupe-args: 2
# Do not permit duplicate keys in object declarations.
# http://eslint.org/docs/rules/no-dupe-keys
no-dupe-keys: 2
# Do not permit duplicate cases in switch statements.
# http://eslint.org/docs/rules/no-duplicate-case
no-duplicate-case: 2
# Disallow empty regex character classes. (/[]/)
# http://eslint.org/docs/rules/no-empty-character-class
no-empty-character-class: 2
# Disallow empty block statements.
# http://eslint.org/docs/rules/no-empty
no-empty: 0 # TODO(krotscheck): Activate & Fix
# Disallow assigning of the exception parameter in a catch block.
# http://eslint.org/docs/rules/no-ex-assign
no-ex-assign: 2
# Disallow the use of double negation (!!foo) if already in a boolean context
# http://eslint.org/docs/rules/no-extra-boolean-cast
no-extra-boolean-cast: 2
# Disallow extraneous parentheses around functions.
# http://eslint.org/docs/rules/no-extra-parens
no-extra-parens:
- 0 # TODO(krotscheck): Activate & Fix
- "functions"
# Disallow extraneous semicolons.
# http://eslint.org/docs/rules/no-extra-semi
no-extra-semi: 2
# Disallow overwriting functions written as function declarations
# http://eslint.org/docs/rules/no-func-assign
no-func-assign: 2
# Disallow function or variable declarations in nested blocks
# http://eslint.org/docs/rules/no-inner-declarations
no-inner-declarations: 2
# Disallow invalid regular expression strings in the RegExp constructor
# http://eslint.org/docs/rules/no-invalid-regexp
no-invalid-regexp: 2
# Disallow irregular whitespace outside of strings and comments
# http://eslint.org/docs/rules/no-irregular-whitespace
no-irregular-whitespace: 2
# Disallow negation of the left operand of an in expression
# http://eslint.org/docs/rules/no-negated-in-lhs
no-negated-in-lhs: 2
# Disallow the use of object properties of the global object (Math and JSON) as functions
# http://eslint.org/docs/rules/no-obj-calls
no-obj-calls: 2
# Disallow multiple spaces in a regular expression literal
# http://eslint.org/docs/rules/no-regex-spaces
no-regex-spaces: 2
# Disallow reserved words being used as object literal keys
# Disabled- this is for ECMA3 backwards compatibility only.
# http://eslint.org/docs/rules/no-reserved-keys
no-reserved-keys: 0
# Disallow sparse arrays
# http://eslint.org/docs/rules/no-sparse-arrays
no-sparse-arrays: 2
# Disallow unreachable statements
# http://eslint.org/docs/rules/no-unreachable
no-unreachable: 2
# Disallow comparisons with the value NaN
# http://eslint.org/docs/rules/use-isnan
use-isnan: 2
# Ensure JSDoc comments are valid
# http://eslint.org/docs/rules/valid-jsdoc
valid-jsdoc: 0 # TODO(krotscheck): Activate & Fix
# Ensure that the results of typeof are compared against a valid string
# http://eslint.org/docs/rules/valid-typeof
valid-typeof: 2
#############################################################################
# Best Practices
#############################################################################
# Enforces getter/setter pairs in objects
# http://eslint.org/docs/rules/accessor-pairs
accessor-pairs: 2
# Treat var statements as if they were block scoped
# http://eslint.org/docs/rules/block-scoped-var
block-scoped-var: 0 # TODO(krotscheck): Activate & Fix
# Specify the maximum cyclomatic complexity allowed in a program
# http://eslint.org/docs/rules/complexity
complexity:
- 1
- 10
# Require return statements to either always or never specify values
# http://eslint.org/docs/rules/consistent-return
consistent-return: 0 # TODO(krotscheck): Activate & Fix
# Specify curly brace conventions for all control statements
# http://eslint.org/docs/rules/curly
curly: 2
# Require default case in switch statements
# http://eslint.org/docs/rules/default-case
default-case: 0 # TODO(krotscheck): Activate & Fix
# encourages use of dot notation whenever possible
# http://eslint.org/docs/rules/dot-notation
dot-notation: 2
# Enforces consistent newlines before or after dots
# http://eslint.org/docs/rules/dot-location
dot-location: 0
# Require the use of === and !==
# http://eslint.org/docs/rules/eqeqeq
eqeqeq: 0 # TODO(krotscheck): Activate & Fix
# Make sure for-in loops have an if statement
# http://eslint.org/docs/rules/guard-for-in
guard-for-in: 1
# Disallow the use of alert, confirm, and prompt
# http://eslint.org/docs/rules/no-alert
no-alert: 2
# Disallow use of arguments.caller or arguments.callee
# http://eslint.org/docs/rules/no-caller
no-caller: 2
# Disallow division operators explicitly at beginning of regular expression
# http://eslint.org/docs/rules/no-div-regex
no-div-regex: 2
# Disallow else after a return in an if
# http://eslint.org/docs/rules/no-else-return
no-else-return: 0 # TODO(krotscheck): Activate & Fix
# Disallow use of labels for anything other then loops and switches
# http://eslint.org/docs/rules/no-empty-label
no-empty-label: 2
# Disallow comparisons to null without a type-checking operator
# http://eslint.org/docs/rules/no-eq-null
no-eq-null: 2
# Disallow use of eval()
# http://eslint.org/docs/rules/no-eval
no-eval: 2
# Disallow adding to native types
# http://eslint.org/docs/rules/no-extend-native
no-extend-native: 2
# Disallow unnecessary function binding
# http://eslint.org/docs/rules/no-extra-bind
no-extra-bind: 2
# Disallow fallthrough of case statements
# http://eslint.org/docs/rules/no-fallthrough
no-fallthrough: 2
# Disallow the use of leading or trailing decimal points in numeric literals
# http://eslint.org/docs/rules/no-floating-decimal
no-floating-decimal: 2
# Disallow use of eval()-like methods
# http://eslint.org/docs/rules/no-implied-eval
no-implied-eval: 2
# Disallow usage of __iterator__ property
# http://eslint.org/docs/rules/no-iterator
no-iterator: 2
# Disallow use of labeled statements
# http://eslint.org/docs/rules/no-labels
no-labels: 2
# Disallow unnecessary nested blocks
# http://eslint.org/docs/rules/no-lone-blocks
no-lone-blocks: 2
# Disallow creation of functions within loops
# http://eslint.org/docs/rules/no-loop-func
no-loop-func: 2
# Disallow use of multiple spaces
# http://eslint.org/docs/rules/no-multi-spaces
no-multi-spaces: 0 # TODO(krotscheck): Activate & Fix
# Disallow use of multiline strings
# http://eslint.org/docs/rules/no-multi-str
no-multi-str: 2
# Disallow reassignments of native objects
# http://eslint.org/docs/rules/no-native-reassign
no-native-reassign: 2
# Disallow use of new operator for Function object
# http://eslint.org/docs/rules/no-new-func
no-new-func: 2
# Disallows creating new instances of String,Number, and Boolean
# http://eslint.org/docs/rules/no-new-wrappers
no-new-wrappers: 2
# Disallow use of new operator when not part of the assignment or comparison
# http://eslint.org/docs/rules/no-new
no-new: 0 # TODO(krotscheck): Activate & Fix
# Disallow use of octal escape sequences in string literals, such as var foo = "Copyright \251";
# http://eslint.org/docs/rules/no-octal-escape
no-octal-escape: 2
# Disallow use of octal literals
# http://eslint.org/docs/rules/no-octal
no-octal: 2
# Disallow reassignment of function parameters
# http://eslint.org/docs/rules/no-param-reassign
no-param-reassign: 0 # TODO(krotscheck): Activate & Fix
# Disallow use of process.env
#
# Please consolidate all your env access to one single file, and apply
# by-line exceptions there.
#
# http://eslint.org/docs/rules/no-process-env
no-process-env: 2
# Disallow usage of __proto__ property
# http://eslint.org/docs/rules/no-proto
no-proto: 2
# Disallow declaring the same variable more than once
# http://eslint.org/docs/rules/no-redeclare
no-redeclare: 0 # TODO(krotscheck): Activate & Fix
# Disallow use of assignment in return statement
# http://eslint.org/docs/rules/no-return-assign
no-return-assign: 2
# Disallow use of javascript: urls.
# http://eslint.org/docs/rules/no-script-url
no-script-url: 2
# Disallow comparisons where both sides are exactly the same
# http://eslint.org/docs/rules/no-self-compare
no-self-compare: 2
# Disallow use of comma operator
# http://eslint.org/docs/rules/no-sequences
no-sequences: 2
# Restrict what can be thrown as an exception
# http://eslint.org/docs/rules/no-throw-literal
no-throw-literal: 2
# Disallow usage of expressions in statement position
# http://eslint.org/docs/rules/no-unused-expressions
no-unused-expressions: 2
# Disallow use of void operator
# http://eslint.org/docs/rules/no-void
no-void: 2
# Disallow usage of configurable warning terms in comments - e.g. TODO
# http://eslint.org/docs/rules/no-warning-comments
no-warning-comments:
- 1
- terms:
- "todo"
- "xxx"
- "fixme"
# Disallow use of the with statement
# http://eslint.org/docs/rules/no-with
no-with: 2
# Require use of the second argument for parseInt()
# http://eslint.org/docs/rules/radix
radix: 0 # TODO(krotscheck): Activate & Fix
# Requires to declare all vars on top of their containing scope
#
# http://eslint.org/docs/rules/vars-on-top
vars-on-top: 0
# Require immediate function invocation to be wrapped in parentheses
# http://eslint.org/docs/rules/wrap-iife
wrap-iife:
- 2
- "any"
# Require or disallow Yoda conditions.
# http://eslint.org/docs/rules/yoda
yoda:
- 0 # TODO(krotscheck): Activate & Fix
- "never"
#############################################################################
# Strict Mode
#############################################################################
# (Deprecated) require or disallow the "use strict" pragma in global scope
# http://eslint.org/docs/rules/global-strict
global-strict: 0
# (Deprecated) disallow unnecessary use of "use strict";
# http://eslint.org/docs/rules/no-extra-strict
no-extra-strict: 0
# controls location of Use Strict Directives
# http://eslint.org/docs/rules/strict
strict:
- 0 # TODO(krotscheck): Activate & Fix
- "function"
#############################################################################
# Variable declaration rules
#############################################################################
# Disallow the catch clause parameter name being the same as a variable in
# the outer scope
# http://eslint.org/docs/rules/no-catch-shadow
no-catch-shadow: 2
# Disallow deletion of variables
# http://eslint.org/docs/rules/no-delete-var
no-delete-var: 2
# Disallow labels that share a name with a variable
# http://eslint.org/docs/rules/no-label-var
no-label-var: 2
# Disallow shadowing of names such as arguments
# http://eslint.org/docs/rules/no-shadow-restricted-names
no-shadow-restricted-names: 2
# Disallow declaration of variables already declared in the outer scope
# http://eslint.org/docs/rules/no-shadow
no-shadow: 0 # TODO(krotscheck): Activate & Fix
# Disallow use of undefined when initializing variables
# http://eslint.org/docs/rules/no-undef-init
no-undef-init: 2
# Disallow use of undeclared variables unless mentioned in a /*global */ block
# http://eslint.org/docs/rules/no-undef
no-undef: 0 # TODO(krotscheck): Activate & Fix
# Disallow use of undefined variable
# http://eslint.org/docs/rules/no-undefined
no-undefined: 0 # TODO(krotscheck): Activate & Fix
# Disallow declaration of variables that are not used in the code
# http://eslint.org/docs/rules/no-unused-vars
no-unused-vars: 0 # TODO(krotscheck): Activate & Fix
# Disallow use of variables before they are defined
# http://eslint.org/docs/rules/no-use-before-define
no-use-before-define: 0 # TODO(krotscheck): Activate & Fix
#############################################################################
# Node.js rules
#############################################################################
# Enforces error handling in callbacks
# http://eslint.org/docs/rules/handle-callback-err
handle-callback-err: 2
# Disallow mixing regular variable and require declarations
# http://eslint.org/docs/rules/no-mixed-requires
no-mixed-requires: 2
# Disallow use of new operator with the require function
# http://eslint.org/docs/rules/no-new-require
no-new-require: 2
# Disallow string concatenation with __dirname and __filename
# http://eslint.org/docs/rules/no-path-concat
no-path-concat: 2
# Disallow process.exit()
# http://eslint.org/docs/rules/no-process-exit
no-process-exit: 2
# Restrict usage of specified node modules
# http://eslint.org/docs/rules/no-restricted-modules
no-restricted-modules: 0
# Disallow use of synchronous methods
# http://eslint.org/docs/rules/no-sync
no-sync: 2
#############################################################################
# Stylistic Changes
#############################################################################
# Enforce one true brace style
# http://eslint.org/docs/rules/brace-style
brace-style: 0 # TODO(krotscheck): Activate & Fix
# Require camel case names
# http://eslint.org/docs/rules/camelcase
camelcase:
- 2
- properties: "never"
# Enforce spacing before and after comma
# http://eslint.org/docs/rules/comma-spacing
comma-spacing: 0 # TODO(krotscheck): Activate & Fix
# Enforce one true comma style
# http://eslint.org/docs/rules/comma-style
comma-style: 2
# Enforces consistent naming when capturing the current execution context
# http://eslint.org/docs/rules/consistent-this
consistent-this:
- 0 # TODO(krotscheck): Activate & Fix
- "self"
# Enforce newline at the end of file, with no multiple empty lines
# http://eslint.org/docs/rules/eol-last
eol-last: 2
# Require function expressions to have a name
# http://eslint.org/docs/rules/func-names
func-names: 0 # TODO(krotscheck): Activate & Fix
# Enforces use of function declarations or expressions
# http://eslint.org/docs/rules/func-style
func-style: 0
# This option sets a specific tab width for your code
# http://eslint.org/docs/rules/indent
indent:
- 2 # TODO(krotscheck): Activate & Fix
- 2
# Enforces spacing between keys and values in object literal properties
# http://eslint.org/docs/rules/key-spacing
key-spacing: 0 # TODO(krotscheck): Activate & Fix
# Enforces empty lines around comments
# http://eslint.org/docs/rules/lines-around-comment
lines-around-comment: 0 # TODO(krotscheck): Activate & Fix
# Disallow mixed 'LF' and 'CRLF' as linebreaks
# http://eslint.org/docs/rules/linebreak-style
linebreak-style:
- 2
- "unix"
# Specify the maximum depth callbacks can be nested
# http://eslint.org/docs/rules/max-nested-callbacks
max-nested-callbacks:
- 0 # TODO(krotscheck): Activate & Fix
- 3
# Require a capital letter for constructors
# http://eslint.org/docs/rules/new-cap
new-cap: 0 # TODO(krotscheck): Activate & Fix
# Disallow the omission of parentheses when invoking a constructor
# http://eslint.org/docs/rules/new-parens
new-parens: 2
# allow/disallow an empty newline after var statement
# http://eslint.org/docs/rules/newline-after-var
newline-after-var: 0
# Disallow use of the Array constructor
# http://eslint.org/docs/rules/no-array-constructor
no-array-constructor: 0 # TODO(krotscheck): Activate & Fix
# Disallow use of the continue statement
# http://eslint.org/docs/rules/no-continue
no-continue: 0
# Disallow comments inline after code
# http://eslint.org/docs/rules/no-inline-comments
no-inline-comments: 0
# disallow if as the only statement in an else block
# http://eslint.org/docs/rules/no-lonely-if
no-lonely-if: 0
# Disallow mixed spaces and tabs for indentation
# http://eslint.org/docs/rules/no-mixed-spaces-and-tabs
no-mixed-spaces-and-tabs: 2
# Disallow multiple empty lines
# http://eslint.org/docs/rules/no-multiple-empty-lines
no-multiple-empty-lines:
- 2
- max: 1
# Disallow nested ternary expressions
# http://eslint.org/docs/rules/no-nested-ternary
no-nested-ternary: 0
# Disallow use of the Object constructor
# http://eslint.org/docs/rules/no-new-object
no-new-object: 1
# (Deprecated) Disallow space before semicolon
# http://eslint.org/docs/rules/no-space-before-semi
no-space-before-semi: 0
# Disallow space between function identifier and application
# http://eslint.org/docs/rules/no-spaced-func
no-spaced-func: 0 # TODO(krotscheck): Activate & Fix
# Disallow the use of ternary operators
# http://eslint.org/docs/rules/no-ternary
no-ternary: 0
# Disallow trailing whitespace at the end of lines
# http://eslint.org/docs/rules/no-trailing-spaces
no-trailing-spaces: 2
# Disallow dangling underscores in identifiers
# http://eslint.org/docs/rules/no-underscore-dangle
no-underscore-dangle: 0 # TODO(krotscheck): Activate & Fix
# Disallow the use of Boolean literals in conditional expressions
# http://eslint.org/docs/rules/no-unneeded-ternary
no-unneeded-ternary: 0 # TODO(krotscheck): Activate & Fix
# Disallow wrapping of non-IIFE statements in parens
# http://eslint.org/docs/rules/no-wrap-func
no-wrap-func: 0 # TODO(krotscheck): Activate & Fix
# Require or disallow padding inside curly braces
# http://eslint.org/docs/rules/object-curly-spacing
object-curly-spacing: 0 # TODO(krotscheck): Activate & Fix
# Allow or disallow one variable declaration per function
# http://eslint.org/docs/rules/one-var
one-var:
- 2
- uninitialized: "always"
initialized: "never"
# Prevent assignment operator shorthand where possible
# http://eslint.org/docs/rules/operator-assignment
operator-assignment:
- 0 # TODO(krotscheck): Activate & Fix
- "never"
# Enforce operators to be placed before or after line breaks
# http://eslint.org/docs/rules/operator-linebreak
operator-linebreak: 2
# Enforce padding within blocks
# http://eslint.org/docs/rules/padded-blocks
padded-blocks: 0
# Require quotes around object literal property names
# http://eslint.org/docs/rules/quote-props
quote-props: 0 # TODO(krotscheck): Activate & Fix
# Specify whether backticks, double or single quotes should be used
# http://eslint.org/docs/rules/quotes
quotes:
- 0 # TODO(krotscheck): Activate & Fix
- 'single'
# Enforce spacing before and after semicolons
# http://eslint.org/docs/rules/semi-spacing
semi-spacing: 0 # TODO(krotscheck): Activate & Fix
# Require or disallow use of semicolons instead of ASI
# http://eslint.org/docs/rules/semi
semi:
- 2
- 'always'
# Sort variables within the same declaration block
# http://eslint.org/docs/rules/sort-vars
sort-vars: 0
# (Deprecated) Require a space after function names
# http://eslint.org/docs/rules/space-after-function-name
space-after-function-name: 0
# Require a space after certain keywords
# http://eslint.org/docs/rules/space-after-keywords
space-after-keywords: 2
# require or disallow space before blocks
# http://eslint.org/docs/rules/space-before-blocks
space-before-blocks:
- 2
- "always"
# Require or disallow space before function opening parenthesis
# http://eslint.org/docs/rules/space-before-function-paren
space-before-function-paren:
- 0 # TODO(krotscheck): Activate & Fix
- "always"
# (Deprecated) Require or disallow space before function parentheses
# http://eslint.org/docs/rules/space-before-function-parentheses
space-before-function-parentheses: 0
# Require or disallow spaces inside brackets
# http://eslint.org/docs/rules/space-in-brackets
space-in-brackets: 0 # TODO(krotscheck): Activate & Fix
# require or disallow spaces inside parentheses
# http://eslint.org/docs/rules/space-in-parens
space-in-parens: 0 # TODO(krotscheck): Activate & Fix
# Require spaces around operators
# http://eslint.org/docs/rules/space-infix-ops
space-infix-ops: 2
# Require a space after return, throw, and case
# http://eslint.org/docs/rules/space-return-throw-case
space-return-throw-case: 2
# Require or disallow spaces before/after unary operators (words on by default, nonwords)
# http://eslint.org/docs/rules/space-unary-ops
space-unary-ops:
- 2
- words: true
nonwords: false
# (deprecated) Require or disallow spaces before/after unary operators (words on by default, nonwords)
# http://eslint.org/docs/rules/space-unary-word-ops
space-unary-word-ops: 0
# Require or disallow a space immediately following the // in a line comment
# http://eslint.org/docs/rules/spaced-line-comment
spaced-line-comment: 0 # TODO(krotscheck): Activate & Fix
# require regex literals to be wrapped in parentheses
# http://eslint.org/docs/rules/wrap-regex
wrap-regex: 0
#############################################################################
# ECMAScript 6 (All Off)
#############################################################################
# enforce the spacing around the * in generator functions
# http://eslint.org/docs/rules/generator-star-spacing
generator-star-spacing: 0
# (deprecated) enforce the position of the * in generator functions
# http://eslint.org/docs/rules/generator-star
generator-star: 0
# require let or const instead of var
# http://eslint.org/docs/rules/no-var
no-var: 0
# require method and property shorthand syntax for object literals
# http://eslint.org/docs/rules/object-shorthand
object-shorthand: 0
# suggest using of const declaration for variables that are never modified after declared
# http://eslint.org/docs/rules/prefer-const
prefer-const: 0
#############################################################################
# Legacy
#############################################################################
# specify the maximum depth that blocks can be nested
# http://eslint.org/docs/rules/max-depth
max-depth: 0
# specify the maximum length of a line in your program
# http://eslint.org/docs/rules/max-len
max-len:
- 2 # TODO(krotscheck): Activate & Fix
- 100
# Limits the number of parameters that can be used in function declaration.
# http://eslint.org/docs/rules/max-params
max-params: 0
# Specify the maximum number of statements allowed in a function
# http://eslint.org/docs/rules/max-statements
max-statements: 0
# Disallow use of bitwise operators
# http://eslint.org/docs/rules/no-bitwise
no-bitwise: 0
# Disallow use of unary operators, ++ and --
# http://eslint.org/docs/rules/no-plusplus
no-plusplus: 0
# We only support ECMA5, disable everything else.
ecmaFeatures:
arrowFunctions: false
binaryLiterals: false
blockBindings: false
classes: false
defaultParams: false
destructuring: false
forOf: false
generators: false
modules: false
objectLiteralComputedProperties: false
objectLiteralDuplicateProperties: false
objectLiteralShorthandMethods: false
objectLiteralShorthandProperties: false
octalLiterals: false
regexUFlag: false
regexYFlag: false
restParams: false
spread: false
superInFunctions: false
templateStrings: false
unicodeCodePointEscapes: false
globalReturn: false
jsx: false

58
.jscsrc
View File

@ -1,58 +0,0 @@
{
"excludeFiles": [
".venv/**",
"bower_components/**",
"horizon/.coverage-karma/**",
"lib/**",
"node_modules/**",
"openstack_dashboard/.coverage-karma/**"
],
"requireCurlyBraces": [
"if",
"else",
"for",
"while",
"do",
"try",
"catch"
],
"requireOperatorBeforeLineBreak": true,
"requireCamelCaseOrUpperCaseIdentifiers": "ignoreProperties",
"maximumLineLength": {
"value": 100,
"allowComments": true,
"allowRegex": true
},
"validateIndentation": 2,
"disallowMultipleLineStrings": true,
"disallowMixedSpacesAndTabs": true,
"disallowTrailingWhitespace": true,
"disallowSpaceAfterPrefixUnaryOperators": true,
"disallowMultipleVarDecl": "exceptUndefined",
"requireSpaceAfterKeywords": [
"if",
"else",
"for",
"while",
"do",
"switch",
"return",
"try",
"catch"
],
"requireSpaceBeforeBinaryOperators": [
"=", "+=", "-=", "*=", "/=", "%=", "<<=", ">>=", ">>>=",
"&=", "|=", "^=", "+=",
"+", "-", "*", "/", "%", "<<", ">>", ">>>", "&",
"|", "^", "&&", "||", "===", "==", ">=",
"<=", "<", ">", "!=", "!=="
],
"requireSpaceAfterBinaryOperators": true,
"requireSpacesInConditionalExpression": true,
"requireSpaceBeforeBlockStatements": true,
"requireLineFeedAtFileEnd": true,
"disallowMultipleLineBreaks": true,
"disallowTrailingComma": true,
"requireParenthesesAroundIIFE": true
}

View File

@ -349,7 +349,7 @@ Recommended
code review. It is best to use a formatter when you are working on a new file
by yourself, or with others who are using the same formatter. You can also
choose to format a selected portion of a file only. Instructions for setting
up JSHint for Eclipse, Sublime Text, Notepad++ and WebStorm/PyCharm are
up ESLint for Eclipse, Sublime Text, Notepad++ and WebStorm/PyCharm are
provided_.
* Use 2 spaces for code indentation.
* Use ``{ }`` for ``if``, ``for``, ``while`` statements, and don't combine them
@ -361,7 +361,7 @@ Recommended
if(x) { if(x) if(x) y =x;
y=x; y=x;
}
* Use JSHint in your development environment.
* Use ESLint in your development environment.
AngularJS
@ -434,6 +434,32 @@ Required
$window.gettext('translatable text');
ESLint
------
ESLint is a great tool to be used during your code editing to improve
JavaScript quality by checking your code against a configurable list of checks.
Therefore, JavaScript developers should configure their editors to use ESLint
to warn them of any such errors so they can be addressed. Since ESLint has a
ton of configuration options to choose from, links are provided below to the
options Horizon wants enforced along with the instructions for setting up
ESLint for Eclipse, Sublime Text, Notepad++ and WebStorm/PyCharm.
ESLint configuration file: `.eslintrc`_
Instructions for setting up ESLint: `ESLint setup instructions`_
.. Note ::
ESLint is part of the automated unit tests performed by Jenkins. The
automated test use the default configurations, which are less strict than
the configurations we recommended to run in your local development
environment.
.. _.eslintrc: https://wiki.openstack.org/wiki/Horizon/Javascript/EditorConfig/Settings#.eslintrc
.. _ESLint setup instructions: https://wiki.openstack.org/wiki/Horizon/Javascript/EditorConfig
.. _provided: https://wiki.openstack.org/wiki/Horizon/Javascript/EditorConfig
CSS
---

View File

@ -134,20 +134,51 @@ Available options:
the dashboard module's directory structure. Default: A new directory within
the current directory.
JavaScript
----------
JavaScript Tests
----------------
You can also run JavaScript unit tests using Karma. Karma is a test
environment that allows for multiple test runners and reporters, including
such features as code coverage. Karma allows developer to run tests live,
as it can watch source and test files for changes.
To run the Karma tests for Horizon and Dashboard::
The default configuration also performs coverage reports, which are saved
to ``horizon/.coverage-karma/`` and ``openstack_dashboard/.coverage-karma/``.
To run the Karma tests for Horizon and Dashboard using the `run_tests.sh`
script::
./run_tests.sh --karma
The default configuration also performs coverage reports, which are saved
to ``horizon/.coverage-karma/`` and ``openstack_dashboard/.coverage-karma/``.
To run the Karma tests for Horizon and Dashboard using `npm`::
npm install # You only need to execute this once.
npm test
.. note:: These two methods are equivalent. The former merely executes
the latter.
JavaScript Code Style Checks
----------------------------
You can run the JavaScript code style checks, or linting, using eslint.
ESLint is a permissively licensed, sophisticated language parser and
linter that confirms both our style guidelines, and checks the code for
common errors that may create unexpected behavior.
To run eslint for Horizon and Dashboard using the `run_tests.sh`
script::
./run_tests.sh --karma
To run eslint for Horizon and Dashboard using `npm`::
npm install # You only need to execute this once.
npm run lint
.. note:: These two methods are equivalent. The former merely executes
the latter.
Give me metrics!
================
@ -155,12 +186,12 @@ Give me metrics!
You can generate various reports and metrics using command line arguments
to ``run_tests.sh``.
JSCS
ESLint
----
To run JSCS, a JavaScript code style checker::
To run ESLint, a JavaScript code style checker::
./run_tests.sh --jscs
./run_tests.sh --eslint
Coverage
--------

View File

@ -45,9 +45,9 @@
.constant('horizon.framework.widgets.action-list.tooltipConfig', {
defaultTemplate: '<div>{$ ::message $}</div>',
defaultMessage: {
// jscs:disable maximumLineLength
/*eslint-disable max-len */
message: gettext('The action cannot be performed. The contents of this row have errors or are missing information.')
// jscs:enable maximumLineLength
/*eslint-enable max-len */
}
});
})();

View File

@ -214,9 +214,9 @@
expect($magicScope.strings.prompt).toBe('');
});
// jscs:disable maximumLineLength
/*eslint-disable max-len */
it('should call resetState, initFacets and emit checkFacets on removeFacet when facet selected',
// jscs:enable maximumLineLength
/*eslint-enable max-len */
function () {
var initialSearch = {
name: 'name=myname',

View File

@ -32,9 +32,9 @@
*/
.constant('horizon.framework.widgets.metadata-tree.defaults', {
text: {
// jscs:disable maximumLineLength
/*eslint-disable max-len */
help: gettext('You can specify resource metadata by moving items from the left column to the right column. In the left columns there are metadata definitions from the Glance Metadata Catalog. Use the "Other" option to add metadata with the key of your choice.'),
// jscs:enable maximumLineLength
/*eslint-enable max-len */
min: gettext('Min'),
max: gettext('Max'),
minLength: gettext('Min length'),

View File

@ -54,7 +54,7 @@
displayedAllocated: []
};
// jscs:disable maximumLineLength
/*eslint-disable max-len */
var markup = '<transfer-table tr-model="tableData">' +
'<allocated>' +
'<table st-table="tableData.displayedAllocated" st-safe-src="tableData.allocated" hz-table>' +
@ -81,7 +81,7 @@
'</table>' +
'</available>' +
'</transfer-table>';
// jscs:enable maximumLineLength
/*eslint-enable max-len */
$element = angular.element(markup);
$compile($element)($scope);
@ -153,7 +153,7 @@
maxAllocation: 2
};
// jscs:disable maximumLineLength
/*eslint-disable max-len */
var markup = '<transfer-table tr-model="tableData" limits="limits">' +
'<available>' +
'<table st-table="tableData.available" hz-table>' +
@ -180,7 +180,7 @@
'</table>' +
'</allocated>' +
'</transfer-table>';
// jscs:enable maximumLineLength
/*eslint-enable max-len */
$element = angular.element(markup);
$compile($element)($scope);

View File

@ -32,7 +32,7 @@
ctrl.title = gettext('Configuration Help');
// jscs:disable maximumLineLength
/*eslint-disable max-len */
var customScriptMap = { cloutInit: 'cloud-init' };
var customScriptText = gettext('Custom scripts are attached to instances to perform specific actions when the instance is launched. For example, if you are unable to install <samp>%(cloutInit)s</samp> inside a guest operating system, you can use a custom script to get a public key and add it to the user account.');
@ -42,6 +42,6 @@
gettext('An advanced option available when launching an instance is disk partitioning. There are two disk partition options. Selecting <b>Automatic</b> resizes the disk and sets it to a single partition. Selecting <b>Manual</b> allows you to create multiple partitions on the disk.'),
gettext('Check the <b>Configuration Drive</b> box if you want to write metadata to a special configuration drive. When the instance boots, it attaches to the <b>Configuration Drive</b> and accesses the metadata.')
];
// jscs:enable maximumLineLength
/*eslint-enable max-len */
}
})();

View File

@ -26,11 +26,11 @@
ctrl.title = gettext('Flavor Help');
ctrl.paragraphs = [
// jscs:disable maximumLineLength
/*eslint-disable max-len */
gettext('The flavor you select for an instance determines the amount of compute, storage and memory resources that will be carved out for the instance.'),
gettext('The flavor you select must have enough resources allocated to support the type of instance you are trying to create. Flavors that don\'t provide enough resources for your instance are identified on the <b>Available</b> table with a yellow warning icon.'),
gettext('Administrators are responsible for creating and managing flavors. A custom flavor can be created for you or for a specific project where it is shared with the users assigned to that project. If you need a custom flavor, contact your administrator.')
// jscs:enable maximumLineLength
/*eslint-enable max-len */
];
}

View File

@ -271,9 +271,9 @@
var availableRam = maxTotalRam - totalRamUsed;
var ramRequired = instanceCount * flavor.ram;
if (ramRequired > availableRam) {
// jscs:disable maximumLineLength
/*eslint-disable max-len */
messages.ram = gettext('This flavor requires more RAM than your quota allows. Please select a smaller flavor or decrease the instance count.');
// jscs:enable maximumLineLength
/*eslint-enable max-len */
}
// Check VCPU resources
@ -284,18 +284,18 @@
var availableCores = maxTotalCores - totalCoresUsed;
var coresRequired = instanceCount * flavor.vcpus;
if (coresRequired > availableCores) {
// jscs:disable maximumLineLength
/*eslint-disable max-len */
messages.vcpus = gettext('This flavor requires more VCPUs than your quota allows. Please select a smaller flavor or decrease the instance count.');
// jscs:enable maximumLineLength
/*eslint-enable max-len */
}
// Check source minimum requirements against this flavor
var sourceType = launchInstanceModel.newInstanceSpec.source_type;
if (source && sourceType && sourceType.type === 'image') {
if (source.min_disk > 0 && source.min_disk > flavor.disk) {
// jscs:disable maximumLineLength
/*eslint-disable max-len */
var srcMinDiskMsg = gettext('The selected image source requires a flavor with at least %(minDisk)s GB of root disk. Select a flavor with a larger root disk or use a different image source.');
// jscs:enable maximumLineLength
/*eslint-enable max-len */
messages.disk = interpolate(
srcMinDiskMsg,
{ minDisk: source.min_disk },
@ -303,9 +303,9 @@
);
}
if (source.min_ram > 0 && source.min_ram > flavor.ram) {
// jscs:disable maximumLineLength
/*eslint-disable max-len */
var srcMinRamMsg = gettext('The selected image source requires a flavor with at least %(minRam)s MB of RAM. Select a flavor with more RAM or use a different image source.');
// jscs:enable maximumLineLength
/*eslint-enable max-len */
messages.ram = interpolate(
srcMinRamMsg,
{ minRam: source.min_ram },

View File

@ -23,9 +23,9 @@
ctrl.label = {
title: gettext('Key Pair'),
// jscs:disable maximumLineLength
/*eslint-disable max-len */
subtitle: gettext('A key pair allows you to SSH into your newly created instance. You may select an existing key pair, import a key pair, or generate a new key pair.'),
// jscs:enable maximumLineLength
/*eslint-enable max-len */
name: gettext('Name'),
description: gettext('Description'),
createKeyPair: gettext('Create Key Pair'),
@ -124,23 +124,23 @@
ctrl.title = gettext('Key Pair Help');
var genKeyPairsMap = {genKeyPairCmd: 'ssh-keygen'};
// jscs:disable maximumLineLength
/*eslint-disable max-len */
var genKeyPairsText = gettext('There are two ways to generate a key pair. From a Linux system, generate the key pair with the <samp>%(genKeyPairCmd)s</samp> command:');
// jscs:enable maximumLineLength
/*eslint-enable max-len */
var keyPathsMap = {
privateKeyPath: 'cloud.key',
publicKeyPath: 'cloud.key.pub'
};
// jscs:disable maximumLineLength
/*eslint-disable max-len */
var keyPathText = gettext('This command generates a pair of keys: a private key (%(privateKeyPath)s) and a public key (%(publicKeyPath)s).');
// jscs:enable maximumLineLength
/*eslint-enable max-len */
var windowsCmdMap = {authorizeKeysFile: '.ssh/authorized_keys'};
// jscs:disable maximumLineLength
/*eslint-disable max-len */
var windowsCmd = gettext('From a Windows system, you can use PuTTYGen to create private/public keys. Use the PuTTY Key Generator to create and save the keys, then copy the public key in the red highlighted box to your <samp>%(authorizeKeysFile)s</samp> file.');
// jscs:enable maximumLineLength
/*eslint-enable max-len */
ctrl.paragraphs = [
gettext('The key pair allows you to SSH into the instance.'),
@ -170,9 +170,9 @@
ctrl.labels = {
wizardTitle: gettext('Launch Instance'),
title: gettext('Create Key Pair'),
// jscs:disable maximumLineLength
/*eslint-disable max-len */
help: gettext('Key Pairs are how you login to your instance after it is launched. Choose a key pair name you will recognize.'),
// jscs:enable maximumLineLength
/*eslint-enable max-len */
keyPairName: gettext('Key Pair Name'),
cancel: gettext('Cancel'),
ok: gettext('Create Key Pair'),
@ -246,9 +246,9 @@
ctrl.labels = {
wizardTitle: gettext('Launch Instance'),
title: gettext('Import Key Pair'),
// jscs:disable maximumLineLength
/*eslint-disable max-len */
help: gettext('Key Pairs are how you login to your instance after it is launched. Choose a key pair name you will recognize and paste your SSH public key into the space provided.'),
// jscs:enable maximumLineLength
/*eslint-enable max-len */
keyPairName: gettext('Key Pair Name'),
publicKey: gettext('Public Key'),
cancel: gettext('Cancel'),
@ -289,19 +289,19 @@
ctrl.title = gettext('Import Key Pair Help');
var genKeyPairsMap = { genKeyPairCmd: 'ssh-keygen' };
// jscs:disable maximumLineLength
/*eslint-disable max-len */
var genKeyPairsText = gettext('There are two ways to generate a key pair. From a Linux system, generate the key pair with the <samp>%(genKeyPairCmd)s</samp> command:');
// jscs:enable maximumLineLength
/*eslint-enable max-len */
var keyPathsMap = { privateKeyPath: 'cloud.key', publicKeyPath: 'cloud.key.pub' };
// jscs:disable maximumLineLength
/*eslint-disable max-len */
var keyPathText = gettext('This command generates a pair of keys: a private key (%(privateKeyPath)s) and a public key (%(publicKeyPath)s).');
// jscs:enable maximumLineLength
/*eslint-enable max-len */
var windowsCmdMap = { authorizeKeysFile: '.ssh/authorized_keys' };
// jscs:disable maximumLineLength
/*eslint-disable max-len */
var windowsCmd = gettext('From a Windows system, you can use PuTTYGen to create private/public keys. Use the PuTTY Key Generator to create and save the keys, then copy the public key in the red highlighted box to your <samp>%(authorizeKeysFile)s</samp> file.');
// jscs:enable maximumLineLength
/*eslint-enable max-len */
ctrl.paragraphs = [
interpolate(genKeyPairsText, genKeyPairsMap, true),

View File

@ -32,22 +32,22 @@
ctrl.title = gettext('Network Help');
ctrl.paragraphs = [
// jscs:disable maximumLineLength
/*eslint-disable max-len */
gettext('Provider networks are created by administrators. These networks map to an existing physical network in the data center.'),
gettext('Project networks are created by users. These networks are fully isolated and are project-specific.'),
gettext('An <b>External</b> network is set up by an administrator. If you want an instance to communicate outside of the data center, then attach a router between your <b>Project</b> network and the <b>External</b> network. You can use the <b>Network Topology</b> view to connect the router to the two networks.'),
gettext('A floating IP allows instances to be addressable from an external network. Floating IPs are not allocated to instances at creation time and may be assigned after the instance is created. To attach a floating IP, go to the <b>Instances</b> view and click the <b>Actions</b> menu to the right of an instance. Then, select the <b>Associate Floating IP</b> option and enter the necessary details.'),
gettext('Administrators set up the pool of floating IPs that are available to attach to instances.')
// jscs:enable maximumLineLength
/*eslint-enable max-len */
];
ctrl.networkCharTitle = gettext('Network characteristics');
ctrl.networkCharParagraphs = [
// jscs:disable maximumLineLength
/*eslint-disable max-len */
gettext('The subnet identifies a sub-section of a network. A subnet is specified in CIDR format. A typical CIDR format looks like <samp>192.xxx.x.x/24</samp>.'),
gettext('If a network is shared, then all users in the project can access the network.'),
gettext('When the <b>Admin State</b> for a network is set to <b>Up</b>, then the network is available for use. You can set the <b>Admin State</b> to <b>Down</b> if you are not ready for other users to access the network.'),
// jscs:enable maximumLineLength
/*eslint-enable max-len */
gettext('The status indicates whether the network has an active connection.')
];
}

View File

@ -65,13 +65,11 @@
ctrl.title = gettext('Security Groups Help');
ctrl.paragraphs = [
// jscs:disable maximumLineLength
/*eslint-disable max-len */
gettext('Security groups define a set of IP filter rules that determine how network traffic flows to and from an instance. Users can add additional rules to an existing security group to further define the access options for an instance. To create additional rules, go to the <b>Compute | Access & Security</b> view, then find the security group and click <b>Manage Rules</b>.'),
// jscs:enable maximumLineLength
gettext('Security groups are project-specific and cannot be shared across projects.'),
// jscs:disable maximumLineLength
gettext('If a security group is not associated with an instance before it is launched, then you will have very limited access to the instance after it is deployed. You will only be able to access the instance from a VNC console.')
// jscs:enable maximumLineLength
/*eslint-enable max-len */
];
}
]);

View File

@ -33,15 +33,15 @@
ctrl.instanceDetailsTitle = gettext('Instance Details');
ctrl.instanceDetailsParagraphs = [
// jscs:disable maximumLineLength
/*eslint-disable max-len */
gettext('An instance name is required and used to help you uniquely identify your instance in the dashboard.'),
gettext('If you select an availability zone and plan to use the boot from volume option, make sure that the availability zone you select for the instance is the same availability zone where your bootable volume resides.')
// jscs:enable maximumLineLength
/*eslint-enable max-len */
];
ctrl.instanceSourceTitle = gettext('Instance Source');
ctrl.instanceSourceParagraphs = [
// jscs:disable maximumLineLength
/*eslint-disable max-len */
gettext('If you want to create an instance that uses ephemeral storage, meaning the instance data is lost when the instance is deleted, then choose one of the following boot sources:'),
gettext('<li><b>Image</b>: This option uses an image to boot the instance.</li>'),
gettext('<li><b>Instance Snapshot</b>: This option uses an instance snapshot to boot the instance.</li>'),
@ -49,7 +49,7 @@
gettext('<li><b>Image (with Create New Volume checked)</b>: This options uses an image to boot the instance, and creates a new volume to persist instance data. You can specify volume size and whether to delete the volume on termination of the instance.</li>'),
gettext('<li><b>Volume</b>: This option uses a volume that already exists. It does not create a new volume. You can choose to delete the volume on termination of the instance. <em>Note: when selecting Volume, you can only launch one instance.</em></li>'),
gettext('<li><b>Volume Snapshot</b>: This option uses a volume snapshot to boot the instance, and creates a new volume to persist instance data. You can choose to delete the volume on termination of the instance.</li>')
// jscs:enable maximumLineLength
/*eslint-enable max-len */
];
}
})();

View File

@ -55,15 +55,16 @@
var ctrl = this;
ctrl.label = {
title: gettext('Instance Details'),
// jscs:disable maximumLineLength
/*eslint-disable max-len */
subtitle: gettext('Please provide the initial host name for the instance, the availability zone where it will be deployed, and the instance count. Increase the Count to create multiple instances with the same settings.'),
// jscs:enable maximumLineLength
/*eslint-enable max-len */
instanceName: gettext('Instance Name'),
availabilityZone: gettext('Availability Zone'),
instance_count: gettext('Count'),
instanceSourceTitle: gettext('Instance Source'),
// jscs:disable maximumLineLength
/*eslint-disable max-len */
instanceSourceSubTitle: gettext('Instance source is the template used to create an instance. You can use a snapshot of an existing instance, an image, or a volume (if enabled). You can also choose to use persistent storage by creating a new volume.'),
/*eslint-enable max-len */
bootSource: gettext('Select Boot Source'),
volumeSize: gettext('Size (GB)'),
volumeCreate: gettext('Create New Volume'),
@ -75,9 +76,9 @@
};
// Error text for invalid fields
// jscs:disable maximumLineLength
/*eslint-disable max-len */
ctrl.bootSourceTypeError = gettext('Volumes can only be attached to 1 active instance at a time. Please either set your instance count to 1 or select a different source type.');
// jscs:enable maximumLineLength
/*eslint-enable max-len */
ctrl.instanceNameError = gettext('A name is required for your instance.');
ctrl.instanceCountError = gettext(
'Instance count is required and must be an integer of at least 1'
@ -355,9 +356,9 @@
angular.extend(ctrl.helpText, {
noneAllocText: gettext('Select a source from those listed below.'),
availHelpText: gettext('Select one'),
// jscs:disable maximumLineLength
/*eslint-disable max-len */
volumeAZHelpText: gettext('When selecting volume as boot source, please ensure the instance\'s availability zone is compatible with your volume\'s availability zone.')
// jscs:enable maximumLineLength
/*eslint-enable max-len */
});
}

View File

@ -6,8 +6,9 @@
"repository": "none",
"license": "Apache 2.0",
"devDependencies": {
"eslint": "^0.23.0",
"eslint-plugin-angular": "0.0.10",
"jasmine-core": "2.2.0",
"jscs": "1.13.1",
"karma": "0.12.31",
"karma-chrome-launcher": "0.1.8",
"karma-cli": "0.0.4",
@ -20,7 +21,7 @@
"scripts": {
"postinstall": "if [ ! -d .venv ]; then tox -epy27 --notest; fi",
"test": "karma start horizon/karma.conf.js --single-run && karma start openstack_dashboard/karma.conf.js --single-run",
"lint": "jscs --no-colors horizon/static/horizon/js horizon/static/horizon/tests horizon/static/framework/ openstack_dashboard/static/dashboard/"
"lint": "eslint --no-color horizon/static openstack_dashboard/static"
},
"dependencies": {}
}

View File

@ -27,7 +27,7 @@ function usage {
echo " -t, --tabs Check for tab characters in files."
echo " -y, --pylint Just run pylint"
echo " -j, --jshint Just run jshint"
echo " -s, --jscs Just run jscs"
echo " -e, --eslint Just run eslint"
echo " -k, --karma Just run karma"
echo " -q, --quiet Run non-interactively. (Relatively) quiet."
echo " Implies -V if -N is not set."
@ -71,7 +71,7 @@ no_pep8=0
just_pylint=0
just_docs=0
just_tabs=0
just_jscs=0
just_eslint=0
just_jshint=0
just_karma=0
never_venv=0
@ -110,7 +110,7 @@ function process_option {
-P|--no-pep8) no_pep8=1;;
-y|--pylint) just_pylint=1;;
-j|--jshint) just_jshint=1;;
-s|--jscs) just_jscs=1;;
-e|--eslint) just_eslint=1;;
-k|--karma) just_karma=1;;
-f|--force) force=1;;
-t|--tabs) just_tabs=1;;
@ -167,13 +167,13 @@ function run_jshint {
jshint openstack_dashboard/static/dashboard/
}
function run_jscs {
echo "Running jscs ..."
if [ "`which jscs`" == '' ] ; then
echo "jscs is not present; please install, e.g. sudo npm install jscs -g"
function run_eslint {
echo "Running eslint ..."
if [ "`which npm`" == '' ] ; then
echo "npm is not present; please install, e.g. sudo apt-get install npm"
else
jscs horizon/static/horizon/js horizon/static/horizon/tests \
horizon/static/framework/ openstack_dashboard/static/dashboard/
npm install
npm run lint
fi
}
@ -589,9 +589,9 @@ if [ $just_jshint -eq 1 ]; then
exit $?
fi
# Jscs
if [ $just_jscs -eq 1 ]; then
run_jscs
# ESLint
if [ $just_eslint -eq 1 ]; then
run_eslint
exit $?
fi

View File

@ -50,11 +50,11 @@ commands = nodeenv -p
npm install jshint -g
/bin/bash run_tests.sh -N --jshint
[testenv:jscs]
[testenv:eslint]
passenv = *
commands = nodeenv -p
npm install jscs -g
/bin/bash run_tests.sh -N --jscs
npm install
/bin/bash run_tests.sh -N --eslint
[testenv:docs]
setenv = DJANGO_SETTINGS_MODULE=openstack_dashboard.test.settings