Skip to content

Commit e62d16f

Browse files
committed
ESLintBear.py: Add settings from eslint
Add settings to support javascript variant typescript. Settings to check javascript code in markdown and html files and settings to support global variables. Closes coala#2635
1 parent 3208610 commit e62d16f

File tree

4 files changed

+163
-4
lines changed

4 files changed

+163
-4
lines changed

bear-requirements.yaml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,14 @@ npm_requirements:
4545
version: ~0.18
4646
eslint:
4747
version: ~3
48+
eslint-plugin-html:
49+
version: ~3.2.2
4850
eslint-plugin-import:
4951
version: ~2
52+
eslint-plugin-markdown:
53+
version: ~1.0.0-beta.6
54+
eslint-plugin-typescript:
55+
version: ~0.8.1
5056
gherkin-lint:
5157
version: ~2
5258
happiness:
@@ -121,6 +127,8 @@ npm_requirements:
121127
version: ~3
122128
typescript:
123129
version: '>=1.7.3'
130+
typescript-eslint-parser:
131+
version: ~12.0.0
124132
write-good:
125133
version: ~0.9.1
126134
pip_requirements:

bears/js/ESLintBear.py

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
from coalib.results.Diff import Diff
66
from coalib.results.RESULT_SEVERITY import RESULT_SEVERITY
77
from coalib.results.Result import Result
8+
from coalib.settings.Setting import typed_list
9+
from coalib.settings.Setting import language
810

911

1012
@linter(executable='eslint',
@@ -17,10 +19,14 @@ class ESLintBear:
1719
Find out more at <http://eslint.org/docs/rules/>.
1820
"""
1921

20-
LANGUAGES = {'JavaScript', 'JSX'}
22+
LANGUAGES = {'JavaScript', 'JSX', 'Markdown', 'Typescript', 'HTML'}
2123
REQUIREMENTS = {NpmRequirement('eslint', '3'),
2224
NpmRequirement('babel-eslint', '8.0'),
23-
NpmRequirement('eslint-plugin-import', '2')}
25+
NpmRequirement('eslint-plugin-import', '2'),
26+
NpmRequirement('typescript-eslint-parser', '12.0.0'),
27+
NpmRequirement('eslint-plugin-typescript', '0.8.1'),
28+
NpmRequirement('eslint-plugin-markdown', '1.0.0-beta.6'),
29+
NpmRequirement('eslint-plugin-html', '3.2.2')}
2430
AUTHORS = {'The coala developers'}
2531
AUTHORS_EMAILS = {'[email protected]'}
2632
LICENSE = 'AGPL-3.0'
@@ -32,9 +38,11 @@ class ESLintBear:
3238
1: RESULT_SEVERITY.NORMAL,
3339
0: RESULT_SEVERITY.INFO}
3440

35-
@staticmethod
36-
def create_arguments(filename, file, config_file,
41+
def create_arguments(self, filename, file, config_file,
3742
eslint_config: str = '',
43+
language: language = language('JavaScript'),
44+
global_vars: typed_list(str) = (),
45+
eslint_env: typed_list(str) = (),
3846
):
3947
"""
4048
:param eslint_config: The location of the .eslintrc config file.
@@ -47,6 +55,25 @@ def create_arguments(filename, file, config_file,
4755
'--stdin-filename=' + filename,
4856
)
4957

58+
if 'Markdown' in language:
59+
args += ('--plugin', 'markdown',)
60+
elif 'Typescript' in language:
61+
args += ('--parser', 'typescript-eslint-parser',
62+
'--plugin', 'typescript')
63+
elif 'HTML' in language:
64+
args += ('--plugin', 'html')
65+
elif 'Javascript' not in language:
66+
self.err(
67+
'Language needs to be either Markdown, HTML, TypeScript '
68+
'or JavaScript. Assuming JavaScript.')
69+
70+
if eslint_env:
71+
for env in eslint_env:
72+
args += ('--env', env)
73+
if global_vars:
74+
for var in global_vars:
75+
args += ('--global', var)
76+
5077
if eslint_config:
5178
args += ('--config', eslint_config)
5279
else:

package.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,10 @@
1313
"dockerfile_lint": "~0.3.2",
1414
"elm": "~0.18",
1515
"eslint": "~3",
16+
"eslint-plugin-html": "~3.2.2",
1617
"eslint-plugin-import": "~2",
18+
"eslint-plugin-markdown": "~1.0.0-beta.6",
19+
"eslint-plugin-typescript": "~0.8.1",
1720
"gherkin-lint": "~2",
1821
"happiness": "~10",
1922
"htmlhint": "~0.9.13",
@@ -51,6 +54,7 @@
5154
"textlint-rule-write-good": "~1.6.0",
5255
"tslint": "~3",
5356
"typescript": ">=1.7.3",
57+
"typescript-eslint-parser": "~12.0.0",
5458
"write-good": "~0.9.1"
5559
}
5660
}

tests/js/ESLintBearTest.py

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from coalib.results.Result import RESULT_SEVERITY, Result
88
from coalib.settings.Section import Section
99
from coalib.settings.Setting import Setting
10+
from coalib.bearlib.languages import Language
1011
from coalib.testing.BearTestHelper import generate_skip_decorator
1112
from coalib.testing.LocalBearTestHelper import (
1213
verify_local_bear,
@@ -46,6 +47,67 @@
4647
test();
4748
"""
4849

50+
test_file_global_vars = """
51+
(function(a,b,c) {
52+
return [a, b, c];
53+
})(x,y,z)
54+
"""
55+
56+
test_file_eslint_env = """
57+
(function(a) {
58+
return a;
59+
})(suiteSetup)
60+
61+
"""
62+
63+
test_file_markdown = """
64+
# H1
65+
## H2
66+
```js
67+
// This gets linted
68+
var answer = 6 * 7;
69+
(function(a) {
70+
return a;
71+
})(answer)
72+
```
73+
"""
74+
75+
test_file_markdown_bad = """
76+
# H1
77+
## H2
78+
```js
79+
var answer = 6 * 7;
80+
```
81+
"""
82+
83+
test_file_HTML = """
84+
<head></head>
85+
<body>
86+
<script>
87+
var foo = 1;
88+
(function(a) {
89+
return a;
90+
})(foo)
91+
</script>
92+
</body>
93+
"""
94+
95+
test_file_HTML_bad = """
96+
<head></head>
97+
<body>
98+
<script>
99+
var foo = 1
100+
</script>
101+
</body>
102+
"""
103+
104+
test_file_typescript = """
105+
function greeter (person: string) {
106+
return 'Hello, ' + person
107+
}
108+
greeter('Bob')
109+
"""
110+
49111
test_syntax_error = '{<!@3@^ yeah!/\n'
50112

51113
test_dir = os.path.join(os.path.dirname(__file__), 'test_files')
@@ -78,6 +140,18 @@
78140
settings={'eslint_config': os.path.join(test_dir,
79141
'eslintconfig_import.json')})
80142

143+
ESLintBearGlobalVarsTest = verify_local_bear(
144+
ESLintBear,
145+
invalid_files=(),
146+
valid_files=(test_file_global_vars,),
147+
settings={'global_vars': 'x,y,z'})
148+
149+
ESLintBearEslintEnvTest = verify_local_bear(
150+
ESLintBear,
151+
invalid_files=(),
152+
valid_files=(test_file_eslint_env,),
153+
settings={'eslint_env': 'mocha'})
154+
81155

82156
@generate_skip_decorator(ESLintBear)
83157
class ESLintBearIgnoredFileTest(LocalBearTestHelper):
@@ -110,3 +184,49 @@ def test_lint_config_file(self):
110184
create_tempfile=False,
111185
filename=config_filename,
112186
)
187+
188+
189+
@generate_skip_decorator(ESLintBear)
190+
class ESLintBearLanguageTest(LocalBearTestHelper):
191+
192+
def setUp(self):
193+
self.section = Section('name')
194+
self.queue = Queue()
195+
self.uut = ESLintBear(self.section, self.queue)
196+
197+
def test_markdown(self):
198+
good_file = [line + '\n' for line in test_file_markdown.splitlines()]
199+
bad_file = [line + '\n' for line in
200+
test_file_markdown_bad.splitlines()]
201+
self.section.language = Language['Markdown']
202+
self.check_validity(self.uut, good_file,
203+
tempfile_kwargs={'suffix': '.md'})
204+
self.check_invalidity(self.uut, bad_file,
205+
tempfile_kwargs={'suffix': '.md'})
206+
207+
def test_HTML(self):
208+
good_file = [line + '\n' for line in test_file_HTML.splitlines()]
209+
bad_file = [line + '\n' for line in test_file_HTML_bad.splitlines()]
210+
self.section.language = Language['html']
211+
self.check_validity(self.uut, good_file,
212+
tempfile_kwargs={'suffix': '.html'})
213+
self.check_invalidity(self.uut, bad_file,
214+
tempfile_kwargs={'suffix': '.html'})
215+
216+
def test_typscript(self):
217+
good_file = [line + '\n' for line in test_file_typescript.splitlines()]
218+
self.section.language = Language['Typescript']
219+
self.check_validity(self.uut, good_file)
220+
221+
def test_bad_language(self):
222+
test_file = [line + '\n' for line in test_good.splitlines()]
223+
self.section.language = Language['Python']
224+
self.check_validity(self.uut, test_file)
225+
while not self.queue.empty():
226+
message = self.queue.get()
227+
msg = ('Language needs to be either Markdown, HTML, TypeScript'
228+
' or JavaScript. Assuming JavaScript.')
229+
if message.message == msg:
230+
break
231+
else:
232+
assert False, 'Message not found'

0 commit comments

Comments
 (0)