├── .gitignore
├── .gitattributes
├── .github_changelog_generator
├── spec
├── fixtures
│ ├── bad.html
│ ├── good.html
│ └── bad_tab.html
├── .eslintrc.js
└── linter-tidy-spec.js
├── .editorconfig
├── README.md
├── .travis.yml
├── lib
└── main.js
├── package.json
└── CHANGELOG.md
/.gitignore:
--------------------------------------------------------------------------------
1 | .idea
2 | node_modules
3 |
--------------------------------------------------------------------------------
/.gitattributes:
--------------------------------------------------------------------------------
1 | # Auto detect text files and perform LF normalization
2 | * text eol=lf
3 |
--------------------------------------------------------------------------------
/.github_changelog_generator:
--------------------------------------------------------------------------------
1 | unreleased=true
2 | future-release=v2.4.0
3 | exclude_labels=duplicate,question,invalid,wontfix,Duplicate,Question,Invalid,Wontfix,External,Unable to reproduce
4 |
--------------------------------------------------------------------------------
/spec/fixtures/bad.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
14 | foobar
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | # EditorConfig helps developers define and maintain consistent
2 | # coding styles between different editors and IDEs
3 | # editorconfig.org
4 |
5 | root = true
6 |
7 | [*]
8 |
9 | # Change these settings to your own preference
10 | indent_style = space
11 | indent_size = 2
12 |
13 | # We recommend you to keep these unchanged
14 | end_of_line = lf
15 | charset = utf-8
16 | trim_trailing_whitespace = true
17 | insert_final_newline = true
18 |
19 | [*.md]
20 | trim_trailing_whitespace = false
21 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # linter-tidy
2 |
3 | This package will lint your `.html` opened files in Atom through [tidy-html5][].
4 |
5 | ## Installation
6 |
7 | * Install [tidy-html5][]
8 | * `$ apm install linter-tidy`
9 |
10 | ## Settings
11 |
12 | You can configure linter-tidy by editing ~/.atom/config.cson (choose Open Your
13 | Config in Atom menu):
14 |
15 | ```coffeescript
16 | 'linter-tidy':
17 | 'tidyExecutablePath': null # tidy path. run 'which tidy' to find the path
18 | 'grammarScopes': [
19 | 'text.html.basic'
20 | ] # A list of grammar scopes to lint with Tidy.
21 | ```
22 |
23 | [tidy-html5]: http://www.html-tidy.org
24 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | ### Project specific config ###
2 | language: generic
3 |
4 | before_install:
5 | - brew update
6 |
7 | install:
8 | - brew install tidy-html5
9 |
10 | os:
11 | - osx
12 |
13 | ### Generic setup follows ###
14 | script:
15 | - curl -s -O https://raw.githubusercontent.com/atom/ci/master/build-package.sh
16 | - chmod u+x build-package.sh
17 | - ./build-package.sh
18 |
19 | notifications:
20 | email:
21 | on_success: never
22 | on_failure: change
23 |
24 | branches:
25 | only:
26 | - master
27 | - /^greenkeeper/.*$/
28 |
29 | git:
30 | depth: 10
31 |
32 | sudo: false
33 |
34 | addons:
35 | apt:
36 | packages:
37 | - build-essential
38 | - git
39 | - libgnome-keyring-dev
40 | - fakeroot
41 |
--------------------------------------------------------------------------------
/lib/main.js:
--------------------------------------------------------------------------------
1 | 'use babel';
2 |
3 | // eslint-disable-next-line import/no-extraneous-dependencies, import/extensions
4 | import { CompositeDisposable } from 'atom';
5 | import * as helpers from 'atom-linter';
6 | import { dirname } from 'path';
7 |
8 | // Local variables
9 | const VALID_SEVERITY = new Set(['error', 'warning', 'info']);
10 | const regex = /line (\d+) column (\d+) - (Warning|Error): (.+)/g;
11 | const defaultExecutableArguments = [
12 | '-language', 'en',
13 | '-quiet',
14 | '-errors',
15 | '--tab-size', '1',
16 | ];
17 | // Settings
18 | const grammarScopes = [];
19 | let executablePath;
20 | let configExecutableArguments;
21 |
22 | const getSeverity = (givenSeverity) => {
23 | const severity = givenSeverity.toLowerCase();
24 | return VALID_SEVERITY.has(severity) ? severity : 'warning';
25 | };
26 |
27 | export default {
28 | activate() {
29 | require('atom-package-deps').install('linter-tidy');
30 |
31 | this.subscriptions = new CompositeDisposable();
32 | this.subscriptions.add(
33 | atom.config.observe('linter-tidy.executablePath', (value) => {
34 | executablePath = value;
35 | }),
36 | atom.config.observe('linter-tidy.executableArguments', (value) => {
37 | configExecutableArguments = value;
38 | }),
39 | atom.config.observe('linter-tidy.grammarScopes', (configScopes) => {
40 | grammarScopes.splice(0, grammarScopes.length);
41 | grammarScopes.push(...configScopes);
42 | }),
43 | );
44 | },
45 |
46 | deactivate() {
47 | this.subscriptions.dispose();
48 | },
49 |
50 | provideLinter() {
51 | return {
52 | grammarScopes,
53 | name: 'tidy',
54 | scope: 'file',
55 | lintsOnChange: true,
56 | lint: async (textEditor) => {
57 | const filePath = textEditor.getPath();
58 | const fileText = textEditor.getText();
59 |
60 | const parameters = defaultExecutableArguments.concat(configExecutableArguments);
61 |
62 | const [projectPath] = atom.project.relativizePath(filePath);
63 | const execOptions = {
64 | stream: 'stderr',
65 | stdin: fileText,
66 | cwd: projectPath !== null ? projectPath : dirname(filePath),
67 | allowEmptyStderr: true,
68 | };
69 |
70 | const output = await helpers.exec(executablePath, parameters, execOptions);
71 |
72 | if (textEditor.getText() !== fileText) {
73 | // Editor contents have changed, don't update the messages
74 | return null;
75 | }
76 |
77 | const messages = [];
78 | let match = regex.exec(output);
79 | while (match !== null) {
80 | const line = Number.parseInt(match[1], 10) - 1;
81 | const col = Number.parseInt(match[2], 10) - 1;
82 | messages.push({
83 | severity: getSeverity(match[3]),
84 | excerpt: match[4],
85 | location: {
86 | file: filePath,
87 | position: helpers.generateRange(textEditor, line, col),
88 | },
89 | });
90 | match = regex.exec(output);
91 | }
92 | return messages;
93 | },
94 | };
95 | },
96 | };
97 |
--------------------------------------------------------------------------------
/spec/linter-tidy-spec.js:
--------------------------------------------------------------------------------
1 | 'use babel';
2 |
3 | import {
4 | // eslint-disable-next-line no-unused-vars
5 | it, fit, wait, beforeEach, afterEach,
6 | } from 'jasmine-fix';
7 | import * as path from 'path';
8 |
9 | const { lint } = require('../lib/main.js').provideLinter();
10 |
11 | const badFile = path.join(__dirname, 'fixtures', 'bad.html');
12 | const badTabFile = path.join(__dirname, 'fixtures', 'bad_tab.html');
13 | const goodFile = path.join(__dirname, 'fixtures', 'good.html');
14 |
15 | describe('The Tidy provider for Linter', () => {
16 | beforeEach(async () => {
17 | atom.workspace.destroyActivePaneItem();
18 | await atom.packages.activatePackage('linter-tidy');
19 | await atom.packages.activatePackage('language-html');
20 | await atom.workspace.open(goodFile);
21 | });
22 |
23 | it('checks a file with issues', async () => {
24 | const editor = await atom.workspace.open(badFile);
25 | const messages = await lint(editor);
26 | const messageText = '
![]()
lacks "alt" attribute';
27 |
28 | expect(messages.length).toBe(1);
29 | expect(messages[0].url).not.toBeDefined();
30 | expect(messages[0].severity).toBe('warning');
31 | expect(messages[0].excerpt).toBe(messageText);
32 | expect(messages[0].location.file).toBe(badFile);
33 | expect(messages[0].location.position).toEqual([[6, 0], [6, 4]]);
34 | });
35 |
36 | it('finds nothing wrong with a valid file', async () => {
37 | const editor = await atom.workspace.open(goodFile);
38 | const messages = await lint(editor);
39 |
40 | expect(messages.length).toBe(0);
41 | });
42 |
43 | it('handles files indented with tabs', async () => {
44 | const editor = await atom.workspace.open(badTabFile);
45 | const messages = await lint(editor);
46 |
47 | expect(messages.length).toBeGreaterThan(0);
48 | });
49 |
50 | it('finds errors on the fly', async () => {
51 | const editor = await atom.workspace.open(goodFile);
52 | editor.moveToBottom();
53 | editor.insertText('\n
This should not be outside the body!
\n');
54 | const messages = await lint(editor);
55 |
56 | expect(messages.length).toBeGreaterThan(0);
57 | });
58 |
59 | describe('allows for custom executable arguments and', () => {
60 | it('ignores errors that a user has chosen to ignore', async () => {
61 | expect(atom.config.set('linter-tidy.executableArguments', [
62 | '-utf8',
63 | '--show-warnings',
64 | 'false',
65 | ])).toBe(true);
66 | const editor = await atom.workspace.open(badFile);
67 | const messages = await lint(editor);
68 |
69 | expect(messages.length).toBe(0);
70 | });
71 |
72 | it('works as expected with an empty array of custom arguments', async () => {
73 | expect(atom.config.set('linter-tidy.executableArguments', [])).toBe(true);
74 | const goodEditor = await atom.workspace.open(goodFile);
75 | const goodMessages = await lint(goodEditor);
76 | expect(goodMessages.length).toBe(0);
77 |
78 | const badEditor = await atom.workspace.open(badFile);
79 | const badMessages = await lint(badEditor);
80 | expect(badMessages.length).toBeGreaterThan(0);
81 | });
82 | });
83 | });
84 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "linter-tidy",
3 | "main": "./lib/main.js",
4 | "version": "2.4.0",
5 | "description": "Linter plugin for HTML, using tidy",
6 | "repository": {
7 | "type": "git",
8 | "url": "https://github.com/AtomLinter/linter-tidy"
9 | },
10 | "keywords": [
11 | "linter",
12 | "lint",
13 | "tidy",
14 | "tidy-html5"
15 | ],
16 | "configSchema": {
17 | "executablePath": {
18 | "default": "tidy",
19 | "title": "Full path to the `tidy` executable",
20 | "order": 1,
21 | "type": "string"
22 | },
23 | "executableArguments": {
24 | "default": [
25 | "-utf8"
26 | ],
27 | "title": "Tidy Executable Arguments",
28 | "description": "A comma-separated list of additional arguments to pass to the Tidy executable when invoked.
The arguments specified here will be appended to arguments required for this linter to work.",
29 | "order": 2,
30 | "type": "array",
31 | "items": {
32 | "type": "string"
33 | }
34 | },
35 | "grammarScopes": {
36 | "default": [
37 | "text.html.basic"
38 | ],
39 | "title": "Grammar Scopes",
40 | "description": "A list of grammar scopes to lint with Tidy.
By default, this package only lints HTML scopes known to work cleanly with Tidy. If you know of any HTML variants that Tidy works with without producing spurious errors, please [let us know](https://github.com/AtomLinter/linter-tidy/issues) so that we may improve the default list.
To find the grammar scopes used by a file, use the `Editor: Log Cursor Scope` command.",
41 | "order": 3,
42 | "type": "array",
43 | "items": {
44 | "type": "string"
45 | }
46 | }
47 | },
48 | "license": "MIT",
49 | "private": true,
50 | "engines": {
51 | "atom": ">=1.4.0 <2.0.0"
52 | },
53 | "providedServices": {
54 | "linter": {
55 | "versions": {
56 | "2.0.0": "provideLinter"
57 | }
58 | }
59 | },
60 | "scripts": {
61 | "test": "apm test",
62 | "lint": "eslint ."
63 | },
64 | "dependencies": {
65 | "atom-linter": "10.0.0",
66 | "atom-package-deps": "5.1.0"
67 | },
68 | "devDependencies": {
69 | "eslint": "6.8.0",
70 | "eslint-config-airbnb-base": "14.0.0",
71 | "eslint-plugin-import": "2.20.1",
72 | "jasmine-fix": "1.3.1"
73 | },
74 | "eslintConfig": {
75 | "extends": "airbnb-base",
76 | "rules": {
77 | "global-require": "off",
78 | "import/no-unresolved": [
79 | "error",
80 | {
81 | "ignore": [
82 | "atom"
83 | ]
84 | }
85 | ]
86 | },
87 | "env": {
88 | "node": true
89 | },
90 | "globals": {
91 | "atom": true
92 | }
93 | },
94 | "renovate": {
95 | "extends": [
96 | "config:base"
97 | ],
98 | "semanticCommits": true,
99 | "rangeStrategy": "pin",
100 | "packageRules": [
101 | {
102 | "packagePatterns": [
103 | "^eslint"
104 | ],
105 | "groupName": "ESLint packages"
106 | }
107 | ]
108 | },
109 | "package-deps": [
110 | "linter:2.0.0"
111 | ]
112 | }
113 |
--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # Change Log
2 |
3 | ## [v2.4.0](https://github.com/AtomLinter/linter-tidy/tree/v2.4.0) (2019-01-28)
4 | [Full Changelog](https://github.com/AtomLinter/linter-tidy/compare/v2.3.1...v2.4.0)
5 |
6 | **Implemented enhancements:**
7 |
8 | - V2 linter API support [\#125](https://github.com/AtomLinter/linter-tidy/pull/125) ([vzamanillo](https://github.com/vzamanillo))
9 | - Update atom-package-deps to version 5.0.0 🚀 [\#123](https://github.com/AtomLinter/linter-tidy/pull/123) ([greenkeeper[bot]](https://github.com/apps/greenkeeper))
10 | - Asyncify the specs [\#114](https://github.com/AtomLinter/linter-tidy/pull/114) ([Arcanemagus](https://github.com/Arcanemagus))
11 | - Update eslint-config-airbnb-base to version 12.0.0 🚀 [\#112](https://github.com/AtomLinter/linter-tidy/pull/112) ([greenkeeper[bot]](https://github.com/apps/greenkeeper))
12 | - Update eslint to version 4.3.0 🚀 [\#109](https://github.com/AtomLinter/linter-tidy/pull/109) ([greenkeeper[bot]](https://github.com/apps/greenkeeper))
13 | - Update atom-linter to version 10.0.0 🚀 [\#106](https://github.com/AtomLinter/linter-tidy/pull/106) ([greenkeeper[bot]](https://github.com/apps/greenkeeper))
14 |
15 | **Fixed bugs:**
16 |
17 | - Support v2 Linter API [\#124](https://github.com/AtomLinter/linter-tidy/issues/124)
18 |
19 | ## [v2.3.1](https://github.com/AtomLinter/linter-tidy/tree/v2.3.1) (2017-03-19)
20 | [Full Changelog](https://github.com/AtomLinter/linter-tidy/compare/v2.3.0...v2.3.1)
21 |
22 | **Implemented enhancements:**
23 |
24 | - tidy5 and command line options [\#40](https://github.com/AtomLinter/linter-tidy/issues/40)
25 | - Update to eslint-config-airbnb-base v11.1.1 [\#104](https://github.com/AtomLinter/linter-tidy/pull/104) ([Arcanemagus](https://github.com/Arcanemagus))
26 | - Whitelist Greenkeeper branches [\#103](https://github.com/AtomLinter/linter-tidy/pull/103) ([Arcanemagus](https://github.com/Arcanemagus))
27 | - Update atom-linter to version 9.0.0 🚀 [\#99](https://github.com/AtomLinter/linter-tidy/pull/99) ([greenkeeper[bot]](https://github.com/apps/greenkeeper))
28 | - Update dependencies to enable Greenkeeper 🌴 [\#97](https://github.com/AtomLinter/linter-tidy/pull/97) ([greenkeeper[bot]](https://github.com/apps/greenkeeper))
29 |
30 | **Fixed bugs:**
31 |
32 | - Tidy and locale issue [\#101](https://github.com/AtomLinter/linter-tidy/issues/101)
33 | - Fixed package not working on non-English systems [\#102](https://github.com/AtomLinter/linter-tidy/pull/102) ([tyearke](https://github.com/tyearke))
34 |
35 | ## [v2.3.0](https://github.com/AtomLinter/linter-tidy/tree/v2.3.0) (2016-11-12)
36 | [Full Changelog](https://github.com/AtomLinter/linter-tidy/compare/v2.2.1...v2.3.0)
37 |
38 | **Implemented enhancements:**
39 |
40 | - Prepare v2.3.0 release [\#94](https://github.com/AtomLinter/linter-tidy/pull/94) ([tyearke](https://github.com/tyearke))
41 | - Added configurable Tidy executable arguments [\#90](https://github.com/AtomLinter/linter-tidy/pull/90) ([tyearke](https://github.com/tyearke))
42 |
43 | **Fixed bugs:**
44 |
45 | - Fixed mismatched columns between Atom and Tidy when file uses tabs [\#92](https://github.com/AtomLinter/linter-tidy/pull/92) ([tyearke](https://github.com/tyearke))
46 |
47 | ## [v2.2.1](https://github.com/AtomLinter/linter-tidy/tree/v2.2.1) (2016-10-12)
48 | [Full Changelog](https://github.com/AtomLinter/linter-tidy/compare/v2.2.0...v2.2.1)
49 |
50 | **Implemented enhancements:**
51 |
52 | - linting of .hbs files [\#16](https://github.com/AtomLinter/linter-tidy/issues/16)
53 | - Rewrite in ES2017 [\#87](https://github.com/AtomLinter/linter-tidy/pull/87) ([Arcanemagus](https://github.com/Arcanemagus))
54 | - Update CI configuration [\#86](https://github.com/AtomLinter/linter-tidy/pull/86) ([Arcanemagus](https://github.com/Arcanemagus))
55 | - Update eslint-config-airbnb-base to version 8.0.0 🚀 [\#83](https://github.com/AtomLinter/linter-tidy/pull/83) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
56 | - Update eslint-config-airbnb-base to version 7.0.0 🚀 [\#82](https://github.com/AtomLinter/linter-tidy/pull/82) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
57 | - Update eslint-config-airbnb-base to version 6.0.0 🚀 [\#81](https://github.com/AtomLinter/linter-tidy/pull/81) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
58 | - Update atom-linter to version 8.0.0 🚀 [\#78](https://github.com/AtomLinter/linter-tidy/pull/78) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
59 |
60 | **Fixed bugs:**
61 |
62 | - Fails to use custom path [\#45](https://github.com/AtomLinter/linter-tidy/issues/45)
63 | - Rewrite in ES2017 [\#87](https://github.com/AtomLinter/linter-tidy/pull/87) ([Arcanemagus](https://github.com/Arcanemagus))
64 | - chore\(package\): update eslint-plugin-import to version 1.14.0 [\#80](https://github.com/AtomLinter/linter-tidy/pull/80) ([Arcanemagus](https://github.com/Arcanemagus))
65 | - Lint with system Node.js [\#79](https://github.com/AtomLinter/linter-tidy/pull/79) ([Arcanemagus](https://github.com/Arcanemagus))
66 |
67 | ## [v2.2.0](https://github.com/AtomLinter/linter-tidy/tree/v2.2.0) (2016-08-02)
68 | [Full Changelog](https://github.com/AtomLinter/linter-tidy/compare/v2.1.1...v2.2.0)
69 |
70 | **Implemented enhancements:**
71 |
72 | - Prepare v2.2.0 release [\#75](https://github.com/AtomLinter/linter-tidy/pull/75) ([tyearke](https://github.com/tyearke))
73 | - Update eslint to version 3.2.0 🚀 [\#72](https://github.com/AtomLinter/linter-tidy/pull/72) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
74 | - Allow custom grammar scopes to be linted [\#71](https://github.com/AtomLinter/linter-tidy/pull/71) ([tyearke](https://github.com/tyearke))
75 | - Pass cwd to linter [\#70](https://github.com/AtomLinter/linter-tidy/pull/70) ([thtliife](https://github.com/thtliife))
76 | - Update atom-linter to version 7.0.0 🚀 [\#65](https://github.com/AtomLinter/linter-tidy/pull/65) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
77 | - Update CI config [\#63](https://github.com/AtomLinter/linter-tidy/pull/63) ([Arcanemagus](https://github.com/Arcanemagus))
78 | - Update atom-linter to version 6.0.0 🚀 [\#54](https://github.com/AtomLinter/linter-tidy/pull/54) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
79 |
80 | **Fixed bugs:**
81 |
82 | - Docs: Update link to Tidy website [\#74](https://github.com/AtomLinter/linter-tidy/pull/74) ([tyearke](https://github.com/tyearke))
83 |
84 | ## [v2.1.1](https://github.com/AtomLinter/linter-tidy/tree/v2.1.1) (2016-06-06)
85 | [Full Changelog](https://github.com/AtomLinter/linter-tidy/compare/v2.1.0...v2.1.1)
86 |
87 | **Implemented enhancements:**
88 |
89 | - Update atom-linter to version 5.0.1 🚀 [\#51](https://github.com/AtomLinter/linter-tidy/pull/51) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
90 | - Update eslint-config-airbnb-base to version 3.0.0 🚀 [\#49](https://github.com/AtomLinter/linter-tidy/pull/49) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
91 | - Move to eslint-config-airbnb-base and remove babel-eslint [\#48](https://github.com/AtomLinter/linter-tidy/pull/48) ([Arcanemagus](https://github.com/Arcanemagus))
92 | - Update babel-eslint to version 6.0.2 🚀 [\#43](https://github.com/AtomLinter/linter-tidy/pull/43) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
93 | - Update eslint to version 2.2.0 🚀 [\#35](https://github.com/AtomLinter/linter-tidy/pull/35) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
94 | - Update babel-eslint to version 5.0.0 🚀 [\#34](https://github.com/AtomLinter/linter-tidy/pull/34) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
95 | - Update atom-package-deps to version 4.0.1 🚀 [\#33](https://github.com/AtomLinter/linter-tidy/pull/33) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
96 | - Update eslint-config-airbnb to version 5.0.0 🚀 [\#29](https://github.com/AtomLinter/linter-tidy/pull/29) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
97 | - Update eslint-config-airbnb to version 4.0.0 🚀 [\#28](https://github.com/AtomLinter/linter-tidy/pull/28) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
98 |
99 | **Fixed bugs:**
100 |
101 | - Fixed tidy linting file on disk instead of editor text [\#52](https://github.com/AtomLinter/linter-tidy/pull/52) ([tyearke](https://github.com/tyearke))
102 |
103 | ## [v2.1.0](https://github.com/AtomLinter/linter-tidy/tree/v2.1.0) (2016-01-21)
104 | [Full Changelog](https://github.com/AtomLinter/linter-tidy/compare/v2.0.0...v2.1.0)
105 |
106 | **Implemented enhancements:**
107 |
108 | - plugin does not work until file is saved [\#25](https://github.com/AtomLinter/linter-tidy/issues/25)
109 | - Use stdin and enable lintOnFly [\#26](https://github.com/AtomLinter/linter-tidy/pull/26) ([Arcanemagus](https://github.com/Arcanemagus))
110 |
111 | ## [v2.0.0](https://github.com/AtomLinter/linter-tidy/tree/v2.0.0) (2016-01-19)
112 | [Full Changelog](https://github.com/AtomLinter/linter-tidy/compare/v1.0.1...v2.0.0)
113 |
114 | **Implemented enhancements:**
115 |
116 | - Implement specs [\#20](https://github.com/AtomLinter/linter-tidy/issues/20)
117 | - Install `linter` automatically. [\#17](https://github.com/AtomLinter/linter-tidy/issues/17)
118 | - Update to tidy5 [\#11](https://github.com/AtomLinter/linter-tidy/issues/11)
119 | - Add Travis-CI config [\#23](https://github.com/AtomLinter/linter-tidy/pull/23) ([Arcanemagus](https://github.com/Arcanemagus))
120 | - Add specs [\#22](https://github.com/AtomLinter/linter-tidy/pull/22) ([Arcanemagus](https://github.com/Arcanemagus))
121 | - Upgrade to latest API [\#19](https://github.com/AtomLinter/linter-tidy/pull/19) ([steelbrain](https://github.com/steelbrain))
122 | - Point to tidy-html5 [\#13](https://github.com/AtomLinter/linter-tidy/pull/13) ([ghost](https://github.com/ghost))
123 |
124 | **Fixed bugs:**
125 |
126 | - Upcoming linter changes [\#12](https://github.com/AtomLinter/linter-tidy/issues/12)
127 |
128 | ## [v1.0.1](https://github.com/AtomLinter/linter-tidy/tree/v1.0.1) (2015-05-12)
129 | [Full Changelog](https://github.com/AtomLinter/linter-tidy/compare/v1.0.0...v1.0.1)
130 |
131 | **Fixed bugs:**
132 |
133 | - Config.unobserve is deprecated. [\#9](https://github.com/AtomLinter/linter-tidy/issues/9)
134 | - Package.getActivationCommands is deprecated. [\#7](https://github.com/AtomLinter/linter-tidy/issues/7)
135 | - Package.activateConfig is deprecated. [\#6](https://github.com/AtomLinter/linter-tidy/issues/6)
136 | - escapeMessageReplace not needed? [\#4](https://github.com/AtomLinter/linter-tidy/issues/4)
137 | - Entity into comment [\#3](https://github.com/AtomLinter/linter-tidy/issues/3)
138 |
139 | ## [v1.0.0](https://github.com/AtomLinter/linter-tidy/tree/v1.0.0) (2015-02-13)
140 | [Full Changelog](https://github.com/AtomLinter/linter-tidy/compare/v0.0.1...v1.0.0)
141 |
142 | ## [v0.0.1](https://github.com/AtomLinter/linter-tidy/tree/v0.0.1) (2014-08-21)
143 |
144 |
145 | \* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*
146 |
--------------------------------------------------------------------------------