This repository has been archived by the owner on Aug 7, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 23
Run linting in a Task #88
Merged
Merged
Changes from 8 commits
Commits
Show all changes
11 commits
Select commit
Hold shift + click to select a range
8774162
run core.coffee as a Task and update to linter v2
UziTech ab611f1
fix tests
UziTech 98be790
clean up code
UziTech 8b54bfb
add config file test
UziTech ef79f6b
add tests
UziTech 2392dda
fix linting
UziTech 773b709
start a task for every linting process
UziTech 8ebc97f
fix things
UziTech 0cdf3b7
use included coffeelint when project needs upgrade
UziTech d6cf249
fix last commit
UziTech 07523a7
Update package-lock.json
Arcanemagus File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,2 @@ | ||
node_modules | ||
.github_changelog_generator | ||
/node_modules | ||
.github_changelog_generator |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
{Task} = require('atom') | ||
{generateRange} = require('atom-linter') | ||
|
||
workers = new Set | ||
workerFile = require.resolve('./core.coffee') | ||
|
||
module.exports = | ||
class Linter | ||
|
||
name: 'CoffeeLint' | ||
grammarScopes: [ | ||
'source.coffee' | ||
'source.litcoffee' | ||
'source.coffee.jsx' | ||
'source.coffee.angular' | ||
] | ||
scope: 'file' | ||
lintsOnChange: true | ||
|
||
destroy: -> | ||
worker?.terminate() for worker in workers | ||
|
||
lint: (textEditor) -> | ||
filePath = textEditor.getPath() | ||
return [] unless filePath | ||
|
||
source = textEditor.getText() | ||
|
||
isLiterate = textEditor.getGrammar().scopeName is 'source.litcoffee' | ||
|
||
|
||
transform = ({level, message, rule, lineNumber, context}) -> | ||
message = "#{message}. #{context}" if context | ||
message = "#{message}. (#{rule})" | ||
|
||
return { | ||
severity: if level is 'error' then 'error' else 'warning' | ||
excerpt: message | ||
location: | ||
file: filePath | ||
position: generateRange(textEditor, lineNumber - 1) | ||
} | ||
|
||
return new Promise (resolve, reject) -> | ||
task = Task.once workerFile, filePath, source, isLiterate, (results) -> | ||
workers.delete(task) | ||
try | ||
resolve(results.map(transform)) | ||
catch e | ||
reject(e) | ||
workers.add(task) | ||
task.on 'task:error', (e) -> reject(e) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,102 +1,66 @@ | ||
# I can't just map over parseInt because it needs the 2nd parameter and map | ||
# passes the current index as the 2nd parameter | ||
toInt = (str) -> parseInt(str, 10) | ||
# This file is a Task file that will run in a separate process | ||
# https://atom.io/docs/api/v1.19.0/Task | ||
|
||
resolve = require 'resolve' | ||
path = require 'path' | ||
semver = require 'semver' | ||
|
||
module.exports = | ||
|
||
# The syntax that the linter handles. May be a string or | ||
# list/tuple of strings. Names should be all lowercase. | ||
# | ||
# If you have the react plugin it switches source.coffee to source.coffee.jsx | ||
# even if you aren't actually using jsx in that file. | ||
scopes: [ | ||
'source.coffee' | ||
'source.litcoffee' | ||
'source.coffee.jsx' | ||
'source.coffee.angular' | ||
] | ||
|
||
_resolveCoffeeLint: (filePath) -> | ||
try | ||
return path.dirname(resolve.sync('coffeelint/package.json', { | ||
basedir: path.dirname(filePath) | ||
})) | ||
catch e | ||
expected = "Cannot find module 'coffeelint/package.json'" | ||
if e.message[...expected.length] is expected | ||
return 'coffeelint' | ||
throw e | ||
|
||
configImportsModules: (config) -> | ||
return true for ruleName, rconfig of config when rconfig.module? | ||
return userConfig?.coffeelint?.transforms? | ||
|
||
canImportModules: (coffeelint) -> | ||
[major, minor, patch] = coffeelint.VERSION.split('.').map(toInt) | ||
_resolveCoffeeLint = (filePath) -> | ||
try | ||
return path.dirname(resolve.sync('coffeelint/package.json', { | ||
basedir: path.dirname(filePath) | ||
})) | ||
catch e | ||
expected = "Cannot find module 'coffeelint/package.json'" | ||
if e.message[...expected.length] is expected | ||
return 'coffeelint' | ||
throw e | ||
|
||
if major > 1 | ||
return true | ||
if major is 1 and minor > 9 | ||
return true | ||
if major is 1 and minor is 9 and patch >= 5 | ||
return true | ||
false | ||
configImportsModules = (config) -> | ||
return true for ruleName, rconfig of config when rconfig.module? | ||
return userConfig?.coffeelint?.transforms? | ||
|
||
isCompatibleWithAtom: (coffeelint) -> | ||
[major, minor, patch] = coffeelint.VERSION.split('.').map(toInt) | ||
module.exports = (filePath, source, isLiterate) -> | ||
showUpgradeError = false | ||
|
||
if major > 1 | ||
return true | ||
if major is 1 and minor > 9 | ||
return true | ||
if major is 1 and minor is 9 and patch >= 1 | ||
return true | ||
false | ||
coffeeLintPath = _resolveCoffeeLint(filePath) | ||
coffeelint = require(coffeeLintPath) | ||
|
||
lint: (filePath, source, scopeName) -> | ||
isLiterate = scopeName is 'source.litcoffee' | ||
showUpgradeError = false | ||
|
||
coffeeLintPath = @_resolveCoffeeLint(filePath) | ||
# Versions before 1.9.1 don't work with Atom because of an assumption that | ||
# if window is defined, then it must be running in a browser. Atom breaks | ||
# this assumption, so CoffeeLint < 1.9.1 will fail to find CoffeeScript. | ||
# See https://github.com/clutchski/coffeelint/pull/383 | ||
if semver.lt(coffeelint.VERSION, '1.9.1') | ||
coffeeLintPath = 'coffeelint' | ||
coffeelint = require(coffeeLintPath) | ||
showUpgradeError = true | ||
|
||
# Versions before 1.9.1 don't work with atom because of an assumption that | ||
# if window is defined, then it must be running in a browser. Atom breaks | ||
# this assumption, so CoffeeLint < 1.9.1 will fail to find CoffeeScript. | ||
# See https://github.com/clutchski/coffeelint/pull/383 | ||
[major, minor, patch] = coffeelint.VERSION.split('.').map(toInt) | ||
if not @isCompatibleWithAtom(coffeelint) | ||
coffeeLintPath = 'coffeelint' | ||
coffeelint = require(coffeeLintPath) | ||
showUpgradeError = true | ||
|
||
configFinder = require("#{coffeeLintPath}/lib/configfinder") | ||
configFinder = require("#{coffeeLintPath}/lib/configfinder") | ||
|
||
result = [] | ||
try | ||
config = configFinder.getConfig(filePath) | ||
if @configImportsModules(config) and not @canImportModules(coffeelint) | ||
showUpgradeError = true | ||
else | ||
result = coffeelint.lint(source, config, isLiterate) | ||
catch e | ||
console.log(e.message) | ||
console.log(e.stack) | ||
result.push({ | ||
lineNumber: 1 | ||
level: 'error' | ||
message: "CoffeeLint crashed, see console for error details." | ||
rule: 'none' | ||
}) | ||
result = [] | ||
try | ||
config = configFinder.getConfig(filePath) | ||
if configImportsModules(config) and semver.lt(coffeelint.VERSION, '1.9.5') | ||
showUpgradeError = true | ||
else | ||
result = coffeelint.lint(source, config, isLiterate) | ||
catch e | ||
console.log(e.message) | ||
console.log(e.stack) | ||
result.push({ | ||
lineNumber: 1 | ||
level: 'error' | ||
message: 'CoffeeLint crashed, see console for error details.' | ||
rule: 'none' | ||
}) | ||
|
||
if showUpgradeError | ||
result = [{ | ||
lineNumber: 1 | ||
level: 'error' | ||
message: "http://git.io/local_upgrade upgrade your project's CoffeeLint" | ||
rule: 'none' | ||
}] | ||
if showUpgradeError | ||
result = [{ | ||
lineNumber: 1 | ||
level: 'error' | ||
message: "http://git.io/local_upgrade upgrade your project's CoffeeLint" | ||
rule: 'none' | ||
}] | ||
|
||
return result | ||
return result |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm wondering if we should just let this throw a error instead of showing this on line 1