Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Linter #32

Merged
merged 13 commits into from
Aug 15, 2020
3 changes: 3 additions & 0 deletions .eslintignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Copied from Jasmine, use the original project's coding style
lib/jasmine.js
test/jasmineIntegrationTest.js
226 changes: 226 additions & 0 deletions .eslintrc.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,226 @@
---
env:
es6: true
extends: 'eslint:recommended'
rules:
array-bracket-newline:
- error
- consistent
array-bracket-spacing:
- error
- never
array-callback-return: error
arrow-parens:
- error
- as-needed
arrow-spacing: error
block-scoped-var: error
block-spacing: error
brace-style: error
camelcase:
- error
- properties: never
allow: [^vfunc_, ^on_, _instance_init]
comma-dangle:
- error
- arrays: always-multiline
objects: always-multiline
functions: never
comma-spacing:
- error
- before: false
after: true
comma-style:
- error
- last
computed-property-spacing: error
curly:
- error
- multi-or-nest
- consistent
dot-location:
- error
- property
eol-last: error
eqeqeq: error
func-call-spacing: error
func-name-matching: error
func-style:
- error
- declaration
- allowArrowFunctions: true
indent:
- error
- 4
- ignoredNodes:
# Allow not indenting the body of GObject.registerClass, since in the
# future it's intended to be a decorator
- 'CallExpression[callee.object.name=GObject][callee.property.name=registerClass] > ClassExpression:first-child'
# Allow dedenting chained member expressions
MemberExpression: 'off'
key-spacing:
- error
- beforeColon: false
afterColon: true
keyword-spacing:
- error
- before: true
after: true
linebreak-style:
- error
- unix
lines-between-class-members: error
max-nested-callbacks: error
max-statements-per-line: error
new-parens: error
no-array-constructor: error
no-await-in-loop: error
no-caller: error
no-constant-condition:
- error
- checkLoops: false
no-div-regex: error
no-empty:
- error
- allowEmptyCatch: true
no-extra-bind: error
no-extra-parens:
- error
- all
- conditionalAssign: false
nestedBinaryExpressions: false
returnAssign: false
no-implicit-coercion:
- error
- allow:
- '!!'
no-invalid-this: error
no-iterator: error
no-label-var: error
no-lonely-if: error
no-loop-func: error
no-nested-ternary: error
no-new-object: error
no-new-wrappers: error
no-octal-escape: error
no-proto: error
no-prototype-builtins: 'off'
no-restricted-properties:
- error
- object: Lang
property: bind
message: Use arrow notation or Function.prototype.bind()
- object: Lang
property: Class
message: Use ES6 classes
no-restricted-syntax:
- error
- selector: >-
MethodDefinition[key.name="_init"] >
FunctionExpression[params.length=1] >
BlockStatement[body.length=1]
CallExpression[arguments.length=1][callee.object.type="Super"][callee.property.name="_init"] >
Identifier:first-child
message: _init() that only calls super._init() is unnecessary
- selector: >-
MethodDefinition[key.name="_init"] >
FunctionExpression[params.length=0] >
BlockStatement[body.length=1]
CallExpression[arguments.length=0][callee.object.type="Super"][callee.property.name="_init"]
message: _init() that only calls super._init() is unnecessary
no-return-assign: error
no-return-await: error
no-self-compare: error
no-shadow: error
no-shadow-restricted-names: error
no-spaced-func: error
no-tabs: error
no-template-curly-in-string: error
no-throw-literal: error
no-trailing-spaces: error
no-undef-init: error
no-unneeded-ternary: error
no-unused-expressions: error
no-unused-vars:
- error
# Vars use a suffix _ instead of a prefix because of file-scope private vars
- varsIgnorePattern: (^unused|_$)
argsIgnorePattern: ^(unused|_)
no-useless-call: error
no-useless-computed-key: error
no-useless-concat: error
no-useless-constructor: error
no-useless-rename: error
no-useless-return: error
no-whitespace-before-property: error
no-with: error
nonblock-statement-body-position:
- error
- below
object-curly-newline:
- error
- consistent: true
object-curly-spacing: error
object-shorthand: error
operator-assignment: error
operator-linebreak: error
prefer-const: error
prefer-destructuring: error
prefer-numeric-literals: error
prefer-promise-reject-errors: error
prefer-rest-params: error
prefer-spread: error
prefer-template: error
quotes:
- error
- single
- avoidEscape: true
require-await: error
rest-spread-spacing: error
semi:
- error
- always
semi-spacing:
- error
- before: false
after: true
semi-style: error
space-before-blocks: error
space-before-function-paren:
- error
- named: never
# for `function ()` and `async () =>`, preserve space around keywords
anonymous: always
asyncArrow: always
space-in-parens: error
space-infix-ops:
- error
- int32Hint: false
space-unary-ops: error
spaced-comment: error
switch-colon-spacing: error
symbol-description: error
template-curly-spacing: error
template-tag-spacing: error
unicode-bom: error
valid-jsdoc:
- error
- requireReturn: false
wrap-iife:
- error
- inside
yield-star-spacing: error
yoda: error
globals:
ARGV: readonly
Debugger: readonly
GIRepositoryGType: readonly
globalThis: readonly
imports: readonly
Intl: readonly
log: readonly
logError: readonly
print: readonly
printerr: readonly
parserOptions:
ecmaVersion: 2020
13 changes: 12 additions & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,15 @@ addons:
packages:
- gjs
- meson
script: meson _build && ninja -C _build && RUN_THOROUGH_TESTS=yes meson test -C _build
- npm
matrix:
include:
- name: Linter
script: |
npm install -g eslint &&
eslint bin/* src test
- name: Unit tests
script: |
meson _build &&
ninja -C _build &&
RUN_THOROUGH_TESTS=yes meson test -C _build
16 changes: 8 additions & 8 deletions bin/jasmine-runner.in
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

/* global jasmineImporter */

const GLib = imports.gi.GLib;
const {GLib} = imports.gi;

// Create a separate GJS importer object for Jasmine modules, so that Jasmine's
// modules are not exposed to test code (e.g. client code might have its own
Expand All @@ -15,28 +15,28 @@ const GLib = imports.gi.GLib;

if (GLib.getenv('JASMINE_UNINSTALLED')) {
// Trick to use the uninstalled copy of Jasmine when running "make check".
let srcdir = GLib.getenv('SRCDIR');
window.jasmineImporter = imports['.'];
const srcdir = GLib.getenv('SRCDIR');
globalThis.jasmineImporter = imports['.'];
jasmineImporter.searchPath = [
GLib.build_filenamev([srcdir, 'src']),
GLib.build_filenamev([srcdir, 'lib']),
];
} else {
let oldSearchPath = imports.searchPath.slice(); // make a copy
const oldSearchPath = imports.searchPath.slice(); // make a copy
imports.searchPath.unshift('@datadir@');
window.jasmineImporter = imports['jasmine-gjs'];
globalThis.jasmineImporter = imports['jasmine-gjs'];
imports.searchPath = oldSearchPath;
}

const Command = jasmineImporter.command;
const Timer = jasmineImporter.timer;
const JasmineBoot = jasmineImporter.jasmineBoot;

Timer.installAPI(window);
Timer.installAPI(globalThis);

// Do not conflict with global "jasmine" object
let _jasmine = new JasmineBoot.Jasmine();
_jasmine.installAPI(window);
const _jasmine = new JasmineBoot.Jasmine();
_jasmine.installAPI(globalThis);

// Don't put any code after this; the return value is used as the exit code.
Command.run(_jasmine, ARGV, 10);
21 changes: 10 additions & 11 deletions bin/jasmine.in
Original file line number Diff line number Diff line change
@@ -1,38 +1,37 @@
#!/usr/bin/env gjs

const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib;
const {Gio, GLib} = imports.gi;
const System = imports.system;

let runner_path = '@pkglibexecdir@/jasmine-runner';
let runnerPath = '@pkglibexecdir@/jasmine-runner';
if (GLib.getenv('JASMINE_UNINSTALLED')) {
// Trick to use the uninstalled copy of Jasmine when running "make check".
let srcdir = GLib.getenv('SRCDIR');
const srcdir = GLib.getenv('SRCDIR');
imports.searchPath.unshift(GLib.build_filenamev([srcdir, 'src']));
const builddir = GLib.getenv('BUILDDIR');
runner_path = GLib.build_filenamev([builddir, 'jasmine-runner']);
runnerPath = GLib.build_filenamev([builddir, 'jasmine-runner']);
} else {
imports.searchPath.unshift('@datadir@/jasmine-gjs');
}

const Config = imports.config;
const Options = imports.options;

let [files, options] = Options.parseOptions(ARGV);
const [files, options] = Options.parseOptions(ARGV);

if (options.version) {
print('Jasmine @PACKAGE_VERSION@');
System.exit(0);
}

let config = Config.loadConfig(options);
const config = Config.loadConfig(options);

// Launch Jasmine in a subprocess so we can control the environment
let launcher = new Gio.SubprocessLauncher();
const launcher = new Gio.SubprocessLauncher();
Config.prepareLauncher(launcher, config);
let args = Config.configToArgs(config, files, options);
args.unshift(runner_path); // argv[0]
let process = launcher.spawnv(args);
const args = Config.configToArgs(config, files, options);
args.unshift(runnerPath); // argv[0]
const process = launcher.spawnv(args);
process.wait(null);

// Don't put any code after this; the return value is used as the exit code.
Expand Down
Loading