Skip to content
This repository has been archived by the owner on Aug 7, 2023. It is now read-only.

Commit

Permalink
Ignore home config from disableWhenNoEslintConfig
Browse files Browse the repository at this point in the history
  • Loading branch information
IanVS committed Jan 9, 2017
1 parent d7ef6d4 commit 291dc5c
Show file tree
Hide file tree
Showing 9 changed files with 141 additions and 8 deletions.
19 changes: 18 additions & 1 deletion lib/helpers.js
Original file line number Diff line number Diff line change
Expand Up @@ -159,9 +159,20 @@ let processESLintMessages = exports.processESLintMessages = (() => {
};
})();

/**
* Check if a config is directly inside a user's home directory.
* Such config files are used by ESLint as a fallback, only for situations
* when there is no other config file between a file being linted and root.
*
* @param {string} configPath - The path of the config file being checked
* @return {Boolean} [description]
*/


exports.spawnWorker = spawnWorker;
exports.showError = showError;
exports.idsToIgnoredRules = idsToIgnoredRules;
exports.isConfigAtHomeRoot = isConfigAtHomeRoot;

var _child_process = require('child_process');

Expand All @@ -181,6 +192,10 @@ var _eslintRuleDocumentation2 = _interopRequireDefault(_eslintRuleDocumentation)

var _atomLinter = require('atom-linter');

var _userHome = require('user-home');

var _userHome2 = _interopRequireDefault(_userHome);

var _atom = require('atom');

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
Expand Down Expand Up @@ -287,4 +302,6 @@ const generateInvalidTrace = (() => {
return function generateInvalidTrace(_x5, _x6, _x7, _x8, _x9, _x10, _x11, _x12, _x13, _x14) {
return _ref3.apply(this, arguments);
};
})();
})();function isConfigAtHomeRoot(configPath) {
return (0, _path.dirname)(configPath) === _userHome2.default;
}
3 changes: 2 additions & 1 deletion lib/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,8 @@ module.exports = {
// Do not try to fix if linting should be disabled
const fileDir = _path2.default.dirname(filePath);
const configPath = (0, _workerHelpers.getConfigPath)(fileDir);
if (configPath === null && disableWhenNoEslintConfig) return;
const noProjectConfig = configPath === null || (0, _helpers.isConfigAtHomeRoot)(configPath);
if (noProjectConfig && disableWhenNoEslintConfig) return;

this.worker.request('job', {
type: 'fix',
Expand Down
5 changes: 4 additions & 1 deletion lib/worker.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ var _workerHelpers = require('./worker-helpers');

var Helpers = _interopRequireWildcard(_workerHelpers);

var _helpers = require('./helpers');

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
Expand All @@ -32,7 +34,8 @@ const ignoredMessages = [
'File ignored by default. Use a negated ignore pattern (like "--ignore-pattern \'!<relative' + '/path/to/filename>\'") to override.', 'File ignored by default. Use "--ignore-pattern \'!node_modules/*\'" to override.', 'File ignored by default. Use "--ignore-pattern \'!bower_components/*\'" to override.'];

function lintJob(argv, contents, eslint, configPath, config) {
if (configPath === null && config.disableWhenNoEslintConfig) {
const noProjectConfig = configPath === null || (0, _helpers.isConfigAtHomeRoot)(configPath);
if (noProjectConfig && config.disableWhenNoEslintConfig) {
return [];
}
eslint.execute(argv, contents);
Expand Down
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,8 @@
"eslint": "^3.6.0",
"eslint-rule-documentation": "^1.0.0",
"process-communication": "^1.1.0",
"resolve-env": "^1.0.0"
"resolve-env": "^1.0.0",
"user-home": "^2.0.0"
},
"devDependencies": {
"babel-cli": "^6.18.0",
Expand Down
3 changes: 3 additions & 0 deletions spec/fixtures/files/badInline.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
/* eslint no-undef: error */

foo = 42;
91 changes: 91 additions & 0 deletions spec/linter-eslint-spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ const fixturesDir = path.join(__dirname, 'fixtures')

const goodPath = path.join(fixturesDir, 'files', 'good.js')
const badPath = path.join(fixturesDir, 'files', 'bad.js')
const badInlinePath = path.join(fixturesDir, 'files', 'badInline.js')
const emptyPath = path.join(fixturesDir, 'files', 'empty.js')
const fixPath = path.join(fixturesDir, 'files', 'fix.js')
const configPath = path.join(fixturesDir, 'configs', '.eslintrc.yml')
Expand Down Expand Up @@ -361,4 +362,94 @@ describe('The eslint provider for Linter', () => {
)
)
)

describe('when setting `disableWhenNoEslintConfig` is false', () => {
let editor
let didError
let gotLintingErrors
let tempFixtureDir
let tempFixturePath
beforeEach(() => {
atom.config.set('linter-eslint.disableWhenNoEslintConfig', false)

waitsForPromise(() =>
new Promise((resolve) => {
tempFixtureDir = fs.mkdtempSync(tmpdir() + path.sep)
tempFixturePath = path.join(tempFixtureDir, 'badInline.js')
const wr = fs.createWriteStream(tempFixturePath)
wr.on('close', () =>
atom.workspace.open(tempFixturePath).then((openEditor) => {
editor = openEditor
resolve()
})
)
fs.createReadStream(badInlinePath).pipe(wr)
})
)
})

afterEach(() => {
rimraf.sync(tempFixtureDir)
})

it('errors when no config file is found', () => {
lint(editor)
.then((messages) => {
// Older versions of ESLint will report an error
// (or if current user running tests has a config in their home directory)
const expectedHtml = '<a href=http://eslint.org/docs/rules/no-undef ' +
'class="badge badge-flexible eslint">no-undef</a> &#39;foo&#39; is not defined.'
expect(messages.length).toBe(1)
expect(messages[0].html).toBe(expectedHtml)
gotLintingErrors = true
})
.catch((err) => {
// Newer versions of ESLint will throw an exception
expect(err.message).toBe('No ESLint configuration found.')
didError = true
})

waitsFor(
() => didError || gotLintingErrors,
'An error should have been thrown or linting performed'
)
})
})

describe('when `disableWhenNoEslintConfig` is true', () => {
let editor
let tempFixtureDir
let tempFixturePath
beforeEach(() => {
atom.config.set('linter-eslint.disableWhenNoEslintConfig', true)

waitsForPromise(() =>
new Promise((resolve) => {
tempFixtureDir = fs.mkdtempSync(tmpdir() + path.sep)
tempFixturePath = path.join(tempFixtureDir, 'badInline.js')
const wr = fs.createWriteStream(tempFixturePath)
wr.on('close', () =>
atom.workspace.open(tempFixturePath).then((openEditor) => {
editor = openEditor
resolve()
})
)
fs.createReadStream(badInlinePath).pipe(wr)
})
)
})

afterEach(() => {
rimraf.sync(tempFixtureDir)
})

it('does not report errors when no config file is found', () =>
waitsForPromise(() =>
lint(editor)
.then((messages) => {
expect(messages.length).toBe(0)
})
)
)
})
})
16 changes: 15 additions & 1 deletion src/helpers.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@

import ChildProcess from 'child_process'
import { createFromProcess } from 'process-communication'
import { join } from 'path'
import { join, dirname } from 'path'
import escapeHTML from 'escape-html'
import ruleURI from 'eslint-rule-documentation'
import { rangeFromLineNumber } from 'atom-linter'
import userHome from 'user-home'

// eslint-disable-next-line import/no-extraneous-dependencies, import/extensions
import { Disposable, Range } from 'atom'
Expand Down Expand Up @@ -255,3 +256,16 @@ export async function processESLintMessages(response, textEditor, showRule, work
return ret
}))
}

/**
* Check if a config is directly inside a user's home directory.
* Such config files are used by ESLint as a fallback, only for situations
* when there is no other config file between a file being linted and root.
*
* @param {string} configPath - The path of the config file being checked
* @return {Boolean} [description]
*/
export function isConfigAtHomeRoot(configPath) {
console.log(userHome, dirname(configPath);
return (dirname(configPath) === userHome)
}
5 changes: 3 additions & 2 deletions src/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { CompositeDisposable, } from 'atom'

import {
spawnWorker, showError, idsToIgnoredRules, processESLintMessages,
generateDebugString
generateDebugString, isConfigAtHomeRoot
} from './helpers'
import { getConfigPath } from './worker-helpers'

Expand Down Expand Up @@ -54,7 +54,8 @@ module.exports = {
// Do not try to fix if linting should be disabled
const fileDir = Path.dirname(filePath)
const configPath = getConfigPath(fileDir)
if (configPath === null && disableWhenNoEslintConfig) return
const noProjectConfig = (configPath === null || isConfigAtHomeRoot(configPath))
if (noProjectConfig && disableWhenNoEslintConfig) return

this.worker.request('job', {
type: 'fix',
Expand Down
4 changes: 3 additions & 1 deletion src/worker.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import Path from 'path'
import { create } from 'process-communication'
import { FindCache, findCached } from 'atom-linter'
import * as Helpers from './worker-helpers'
import { isConfigAtHomeRoot } from './helpers'

process.title = 'linter-eslint helper'

Expand All @@ -24,7 +25,8 @@ const ignoredMessages = [
]

function lintJob(argv, contents, eslint, configPath, config) {
if (configPath === null && config.disableWhenNoEslintConfig) {
const noProjectConfig = (configPath === null || isConfigAtHomeRoot(configPath))
if (noProjectConfig && config.disableWhenNoEslintConfig) {
return []
}
eslint.execute(argv, contents)
Expand Down

0 comments on commit 291dc5c

Please sign in to comment.