├── spec ├── files │ ├── empty.py │ ├── bad.py │ └── good.py ├── .eslintrc.js └── linter-pylint-spec.js ├── .gitignore ├── .gitattributes ├── .github_changelog_generator ├── .editorconfig ├── .travis.yml ├── README.md ├── package.json ├── lib └── main.js └── CHANGELOG.md /spec/files/empty.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /spec/files/bad.py: -------------------------------------------------------------------------------- 1 | asfd 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | -------------------------------------------------------------------------------- /spec/files/good.py: -------------------------------------------------------------------------------- 1 | """Simple test file.""" 2 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text eol=lf 3 | -------------------------------------------------------------------------------- /.github_changelog_generator: -------------------------------------------------------------------------------- 1 | user=Atomlinter 2 | project=linter-pylint 3 | unreleased=true 4 | future-release=v2.1.1 5 | exclude_labels=duplicate,question,invalid,wontfix,Duplicate,Question,Invalid,Wontfix,External,Unable to Reproduce,needs info 6 | -------------------------------------------------------------------------------- /spec/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | env: { 3 | atomtest: true, 4 | jasmine: true, 5 | }, 6 | rules: { 7 | "import/no-extraneous-dependencies": [ 8 | "error", 9 | { 10 | "devDependencies": true 11 | } 12 | ] 13 | } 14 | }; 15 | -------------------------------------------------------------------------------- /.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 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | ### Project specific config ### 2 | matrix: 3 | include: 4 | - os: linux 5 | language: python 6 | python: "2.7" 7 | env: ATOM_CHANNEL=stable 8 | 9 | - os: linux 10 | language: python 11 | python: "3.6" 12 | env: ATOM_CHANNEL=beta 13 | 14 | install: 15 | - pip install pylint 16 | 17 | before_script: 18 | - pylint --version 19 | 20 | ### Generic setup follows ### 21 | script: 22 | - curl -s -O https://raw.githubusercontent.com/atom/ci/master/build-package.sh 23 | - chmod u+x build-package.sh 24 | - ./build-package.sh 25 | 26 | notifications: 27 | email: 28 | on_success: never 29 | on_failure: change 30 | 31 | branches: 32 | only: 33 | - master 34 | - /^greenkeeper/.*$/ 35 | 36 | git: 37 | depth: 10 38 | 39 | sudo: false 40 | 41 | dist: trusty 42 | 43 | addons: 44 | apt: 45 | packages: 46 | - build-essential 47 | - fakeroot 48 | - git 49 | - libsecret-1-dev 50 | -------------------------------------------------------------------------------- /spec/linter-pylint-spec.js: -------------------------------------------------------------------------------- 1 | 'use babel'; 2 | 3 | import * as path from 'path'; 4 | import { 5 | // eslint-disable-next-line no-unused-vars 6 | it, fit, wait, beforeEach, afterEach, 7 | } from 'jasmine-fix'; 8 | 9 | const goodPath = path.join(__dirname, 'files', 'good.py'); 10 | const badPath = path.join(__dirname, 'files', 'bad.py'); 11 | const emptyPath = path.join(__dirname, 'files', 'empty.py'); 12 | 13 | const { lint } = require('../lib/main.js').provideLinter(); 14 | 15 | const wikiURLBase = 'http://pylint-messages.wikidot.com/messages:'; 16 | 17 | describe('The pylint provider for Linter', () => { 18 | beforeEach(async () => { 19 | await atom.packages.activatePackage('linter-pylint'); 20 | await atom.packages.activatePackage('language-python'); 21 | }); 22 | 23 | it('should be in the packages list', () => { 24 | expect(atom.packages.isPackageLoaded('linter-pylint')).toBe(true); 25 | }); 26 | 27 | it('should be an active package', () => { 28 | expect(atom.packages.isPackageActive('linter-pylint')).toBe(true); 29 | }); 30 | 31 | it('checks bad.py and reports the correct results', async () => { 32 | const editor = await atom.workspace.open(badPath); 33 | const messages = await lint(editor); 34 | 35 | expect(messages.length).toBe(3); 36 | 37 | expect(messages[0].severity).toBe('info'); 38 | expect(messages[0].excerpt).toBe('C0111 Missing module docstring'); 39 | expect(messages[0].location.file).toBe(badPath); 40 | expect(messages[0].location.position).toEqual([[0, 0], [0, 4]]); 41 | expect(messages[0].url).toBe(`${wikiURLBase}C0111`); 42 | 43 | expect(messages[1].severity).toBe('warning'); 44 | expect(messages[1].excerpt).toBe('W0104 Statement seems to have no effect'); 45 | expect(messages[1].location.file).toBe(badPath); 46 | expect(messages[1].location.position).toEqual([[0, 0], [0, 4]]); 47 | expect(messages[1].url).toBe(`${wikiURLBase}W0104`); 48 | 49 | expect(messages[2].severity).toBe('error'); 50 | expect(messages[2].excerpt).toBe("E0602 Undefined variable 'asfd'"); 51 | expect(messages[2].location.file).toBe(badPath); 52 | expect(messages[2].location.position).toEqual([[0, 0], [0, 4]]); 53 | expect(messages[2].url).toBe(`${wikiURLBase}E0602`); 54 | }); 55 | 56 | it('finds nothing wrong with an empty file', async () => { 57 | const editor = await atom.workspace.open(emptyPath); 58 | const messages = await lint(editor); 59 | expect(messages.length).toBe(0); 60 | }); 61 | 62 | it('finds nothing wrong with a valid file', async () => { 63 | const editor = await atom.workspace.open(goodPath); 64 | const messages = await lint(editor); 65 | expect(messages.length).toBe(0); 66 | }); 67 | }); 68 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # linter-pylint 2 | [![Build Status](https://travis-ci.org/AtomLinter/linter-pylint.svg?branch=master)](https://travis-ci.org/AtomLinter/linter-pylint) 3 | [![Dependency Status](https://david-dm.org/AtomLinter/linter-pylint.svg)](https://david-dm.org/AtomLinter/linter-pylint) 4 | [![Plugin installs!](https://img.shields.io/apm/dm/linter-pylint.svg)](https://atom.io/packages/linter-pylint) 5 | [![Package version!](https://img.shields.io/apm/v/linter-pylint.svg?style=flat)](https://atom.io/packages/linter-pylint) 6 | 7 | This package will lint your opened Python-files in Atom, using [pylint](https://www.pylint.org/). 8 | 9 | ## Installation 10 | 11 | 1. Install [pylint](http://www.pylint.org/#install). 12 | 2. `$ apm install linter-pylint` 13 | 14 | ## Configuration 15 | * **Executable** Path to your pylint executable. This is useful if you have different versions of pylint for Python 2 16 | and 3 or if you are using a virtualenv. Use `%p` for the current project (no trailing /). 17 | * **Message Format** Format for Pylint messages where `%m` is the message, `%i` is the numeric message ID (e.g. W0613) 18 | and `%s` is the human-readable message ID (e.g. unused-argument). 19 | * **Python Path** Paths to be added to the `PYTHONPATH` environment variable. Use `%p` for the current project 20 | directory (e.g. `%p/vendor`) or `%f` for the directory of the current 21 | file location. 22 | * **Rc File** Path to pylintrc file. Use `%p` for the current project directory or `%f` for the directory of the current 23 | file location. 24 | * **Working Directory** Directory pylint is run from. Use `%p` for the current project directory or `%f` for the 25 | directory of the current file. 26 | * `%p` will fallback to the current file's directory (equivilent to `%f`) if no project directory can be determined. 27 | 28 | ## Other available linters 29 | There are other linters available - take a look at the linters [mainpage](https://github.com/steelbrain/linter). 30 | 31 | ## Changelog 32 | 33 | ### 1.1.0 34 | - Allow use of project and file directories in rcfile, cwd, and PYTHONPATH (d82116d) 35 | - Fix use of PYTHONPATH (7fb325) 36 | 37 | ### 1.0.0 38 | - Use latest linter API 39 | 40 | ### 0.2.1 41 | - Use new API for project path 42 | 43 | ### 0.2.0 44 | - Settings to configure rcfile, executable name [#24](https://github.com/AtomLinter/linter-pylint/pull/24) 45 | 46 | ### 0.1.5 47 | - Fix lint message display on Windows [#15](https://github.com/AtomLinter/linter-pylint/issues/15) 48 | - Fix temporary file leak when pylint isn't present 49 | 50 | ### 0.1.3 51 | - Display pylint message ids 52 | - Fix debug mode [#9](https://github.com/AtomLinter/linter-pylint/pull/9) 53 | - Use project directory as cwd (works better with Atom projects) 54 | 55 | ### 0.1.2 56 | - fix 'has no method getCmd' bug [#4](https://github.com/AtomLinter/linter-pylint/issues/4) 57 | 58 | ### 0.1.0 59 | 60 | - Implemented first version of 'linter-pylint' 61 | - Added support for Errors and Warnings, "Refactor", "Convention and "Fatal"-messages are ignored due to missing display-capabilities. 62 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "linter-pylint", 3 | "main": "./lib/main.js", 4 | "version": "2.1.1", 5 | "private": true, 6 | "description": "Lint python on the fly, using pylint", 7 | "repository": "https://github.com/AtomLinter/linter-pylint", 8 | "license": "MIT", 9 | "scripts": { 10 | "test": "apm test", 11 | "lint": "eslint ." 12 | }, 13 | "engines": { 14 | "atom": ">=1.4.0 <2.0.0" 15 | }, 16 | "configSchema": { 17 | "executablePath": { 18 | "type": "string", 19 | "default": "pylint", 20 | "description": "Command or full path to pylint. Use %p for current project directory (no trailing /) or %h for current project name.", 21 | "order": 1 22 | }, 23 | "pythonPath": { 24 | "type": "string", 25 | "default": "", 26 | "description": "Paths to be added to $PYTHONPATH. Use %p for current project directory or %f for the directory of the current file.", 27 | "order": 1 28 | }, 29 | "rcFile": { 30 | "type": "string", 31 | "default": "", 32 | "description": "Path to pylintrc file. Use %p for the current project directory or %f for the directory of the current file.", 33 | "order": 2 34 | }, 35 | "workingDirectory": { 36 | "type": "string", 37 | "default": "%p", 38 | "description": "Directory pylint is run from. Use %p for the current project directory or %f for the directory of the current file.", 39 | "order": 2 40 | }, 41 | "messageFormat": { 42 | "type": "string", 43 | "default": "%i %m", 44 | "description": "Format for Pylint messages where %m is the message, %i is the numeric message ID (e.g. W0613) and %s is the human-readable message ID (e.g. unused-argument).", 45 | "order": 2 46 | }, 47 | "disableTimeout": { 48 | "title": "Disable Execution Timeout", 49 | "type": "boolean", 50 | "default": false, 51 | "description": "By default processes running longer than 10 seconds will be automatically terminated. Enable this option if you are getting messages about process execution timing out.", 52 | "order": 3 53 | } 54 | }, 55 | "providedServices": { 56 | "linter": { 57 | "versions": { 58 | "2.0.0": "provideLinter" 59 | } 60 | } 61 | }, 62 | "dependencies": { 63 | "atom-linter": "10.0.0", 64 | "atom-package-deps": "5.1.0", 65 | "lazy-req": "2.0.0" 66 | }, 67 | "devDependencies": { 68 | "eslint": "6.4.0", 69 | "eslint-config-airbnb-base": "14.0.0", 70 | "eslint-plugin-import": "2.18.2", 71 | "jasmine-fix": "1.3.1" 72 | }, 73 | "package-deps": [ 74 | "linter:2.0.0" 75 | ], 76 | "renovate": { 77 | "extends": [ 78 | "config:base" 79 | ] 80 | }, 81 | "eslintConfig": { 82 | "extends": "airbnb-base", 83 | "rules": { 84 | "global-require": "off", 85 | "import/no-unresolved": [ 86 | "error", 87 | { 88 | "ignore": [ 89 | "atom" 90 | ] 91 | } 92 | ] 93 | }, 94 | "globals": { 95 | "atom": true 96 | }, 97 | "env": { 98 | "node": true 99 | } 100 | } 101 | } 102 | -------------------------------------------------------------------------------- /lib/main.js: -------------------------------------------------------------------------------- 1 | 'use babel'; 2 | 3 | /** 4 | * Note that this can't be loaded lazily as `atom` doesn't export it correctly 5 | * for that, however as this comes from app.asar it is pre-compiled and is 6 | * essentially "free" as there is no expensive compilation step. 7 | */ 8 | // eslint-disable-next-line import/no-extraneous-dependencies, import/extensions 9 | import { CompositeDisposable } from 'atom'; 10 | import path from 'path'; 11 | 12 | const fs = require('fs'); 13 | const lazyReq = require('lazy-req')(require); 14 | 15 | const { delimiter, dirname } = lazyReq('path')('delimiter', 'dirname'); 16 | const { exec, generateRange } = lazyReq('atom-linter')('exec', 'generateRange'); 17 | const os = lazyReq('os'); 18 | 19 | // Some local variables 20 | const errorWhitelist = [ 21 | /^No config file found, using default configuration$/, 22 | /^Using config file /, 23 | ]; 24 | 25 | const getProjectDir = (filePath) => { 26 | const atomProject = atom.project.relativizePath(filePath)[0]; 27 | if (atomProject === null) { 28 | // Default project to file directory if project path cannot be determined 29 | return dirname(filePath); 30 | } 31 | return atomProject; 32 | }; 33 | 34 | const filterWhitelistedErrors = (stderr) => { 35 | // Split the input and remove blank lines 36 | const lines = stderr.split(os().EOL).filter((line) => !!line); 37 | const filteredLines = lines.filter((line) => ( 38 | // Only keep the line if it is not ignored 39 | !errorWhitelist.some((errorRegex) => errorRegex.test(line)) 40 | )); 41 | return filteredLines.join(os().EOL); 42 | }; 43 | 44 | const fixPathString = (pathString, fileDir, projectDir) => { 45 | const string = pathString; 46 | const fRstring = string.replace(/%f/g, fileDir); 47 | const hRstring = fRstring.replace(/%h/g, path.basename(projectDir)); 48 | const pRstring = hRstring.replace(/%p/g, projectDir); 49 | return pRstring; 50 | }; 51 | 52 | const determineSeverity = (severity) => { 53 | switch (severity) { 54 | case 'error': 55 | case 'warning': 56 | case 'info': 57 | return severity; 58 | case 'convention': 59 | return 'info'; 60 | default: 61 | return 'warning'; 62 | } 63 | }; 64 | 65 | export default { 66 | activate() { 67 | require('atom-package-deps').install('linter-pylint'); 68 | 69 | this.subscriptions = new CompositeDisposable(); 70 | 71 | // FIXME: Remove backwards compatibility in a future minor version 72 | const oldPath = atom.config.get('linter-pylint.executable'); 73 | if (oldPath !== undefined) { 74 | atom.config.unset('linter-pylint.executable'); 75 | if (oldPath !== 'pylint') { 76 | // If the old config wasn't set to the default migrate it over 77 | atom.config.set('linter-pylint.executablePath', oldPath); 78 | } 79 | } 80 | 81 | this.subscriptions.add(atom.config.observe('linter-pylint.executablePath', (value) => { 82 | this.executablePath = value; 83 | })); 84 | this.subscriptions.add(atom.config.observe('linter-pylint.rcFile', (value) => { 85 | this.rcFile = value; 86 | })); 87 | this.subscriptions.add(atom.config.observe('linter-pylint.messageFormat', (value) => { 88 | this.messageFormat = value; 89 | })); 90 | this.subscriptions.add(atom.config.observe('linter-pylint.pythonPath', (value) => { 91 | this.pythonPath = value; 92 | })); 93 | this.subscriptions.add(atom.config.observe('linter-pylint.workingDirectory', (value) => { 94 | this.workingDirectory = value.replace(delimiter, ''); 95 | })); 96 | this.subscriptions.add(atom.config.observe('linter-pylint.disableTimeout', (value) => { 97 | this.disableTimeout = value; 98 | })); 99 | }, 100 | 101 | deactivate() { 102 | this.subscriptions.dispose(); 103 | }, 104 | 105 | provideLinter() { 106 | return { 107 | name: 'Pylint', 108 | scope: 'file', 109 | lintsOnChange: false, 110 | grammarScopes: ['source.python', 'source.python.django'], 111 | lint: async (editor) => { 112 | const filePath = editor.getPath(); 113 | const fileDir = dirname(filePath); 114 | const fileText = editor.getText(); 115 | const projectDir = getProjectDir(filePath); 116 | const cwd = fixPathString(this.workingDirectory, fileDir, projectDir); 117 | const execPath = fixPathString(this.executablePath, '', projectDir); 118 | let format = this.messageFormat; 119 | const patterns = { 120 | '%m': 'msg', 121 | '%i': 'msg_id', 122 | '%s': 'symbol', 123 | }; 124 | Object.keys(patterns).forEach((pattern) => { 125 | format = format.replace(new RegExp(pattern, 'g'), `{${patterns[pattern]}}`); 126 | }); 127 | const env = Object.create(process.env, { 128 | PYTHONPATH: { 129 | value: [ 130 | process.env.PYTHONPATH, 131 | fixPathString(this.pythonPath, fileDir, projectDir), 132 | ].filter((x) => !!x).join(delimiter), 133 | enumerable: true, 134 | }, 135 | LANG: { value: 'en_US.UTF-8', enumerable: true }, 136 | }); 137 | 138 | const args = [ 139 | `--msg-template='{line},{column},{category},{msg_id}:${format}'`, 140 | '--reports=n', 141 | '--output-format=text', 142 | ]; 143 | if ( 144 | this.rcFile !== '' 145 | && fs.existsSync(`${fixPathString(this.rcFile, fileDir, projectDir)}`) 146 | ) { 147 | args.push(`--rcfile=${fixPathString(this.rcFile, fileDir, projectDir)}`); 148 | } 149 | args.push(filePath); 150 | 151 | const execOpts = { env, cwd, stream: 'both' }; 152 | if (this.disableTimeout) { 153 | execOpts.timeout = Infinity; 154 | } 155 | 156 | const data = await exec(execPath, args, execOpts); 157 | 158 | if (editor.getText() !== fileText) { 159 | // Editor text was modified since the lint was triggered, tell Linter not to update 160 | return null; 161 | } 162 | 163 | const filteredErrors = filterWhitelistedErrors(data.stderr); 164 | if (filteredErrors) { 165 | // pylint threw an error we aren't ignoring! 166 | throw new Error(filteredErrors); 167 | } 168 | 169 | const lineRegex = /(\d+),(\d+),(\w+),(\w\d+):(.*)\r?(?:\n|$)/g; 170 | const toReturn = []; 171 | 172 | let match = lineRegex.exec(data.stdout); 173 | while (match !== null) { 174 | const line = Number.parseInt(match[1], 10) - 1; 175 | const column = Number.parseInt(match[2], 10); 176 | const position = generateRange(editor, line, column); 177 | const message = { 178 | severity: determineSeverity(match[3]), 179 | excerpt: match[5], 180 | location: { file: filePath, position }, 181 | url: `http://pylint-messages.wikidot.com/messages:${match[4]}`, 182 | }; 183 | 184 | toReturn.push(message); 185 | match = lineRegex.exec(data.stdout); 186 | } 187 | 188 | return toReturn; 189 | }, 190 | }; 191 | }, 192 | }; 193 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | ## [v2.1.1](https://github.com/Atomlinter/linter-pylint/tree/v2.1.1) (2018-02-01) 4 | 5 | [Full Changelog](https://github.com/Atomlinter/linter-pylint/compare/v2.1.0...v2.1.1) 6 | 7 | **Implemented enhancements:** 8 | 9 | - Asyncify the specs [\#229](https://github.com/AtomLinter/linter-pylint/pull/229) ([Arcanemagus](https://github.com/Arcanemagus)) 10 | - Update eslint-config-airbnb-base to version 12.0.0 🚀 [\#228](https://github.com/AtomLinter/linter-pylint/pull/228) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 11 | - Update eslint to version 4.3.0 🚀 [\#222](https://github.com/AtomLinter/linter-pylint/pull/222) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 12 | 13 | **Fixed bugs:** 14 | 15 | - linting fails when .pylintrc is present [\#236](https://github.com/AtomLinter/linter-pylint/issues/236) 16 | - Pylint-1.6.4 deprecation warnings [\#185](https://github.com/AtomLinter/linter-pylint/issues/185) 17 | - Fix error whitelist [\#237](https://github.com/AtomLinter/linter-pylint/pull/237) ([gucciferXCIV](https://github.com/gucciferXCIV)) 18 | - Update Travis CI configuration [\#227](https://github.com/AtomLinter/linter-pylint/pull/227) ([Arcanemagus](https://github.com/Arcanemagus)) 19 | 20 | ## [v2.1.0](https://github.com/Atomlinter/linter-pylint/tree/v2.1.0) (2017-05-10) 21 | 22 | [Full Changelog](https://github.com/Atomlinter/linter-pylint/compare/v2.0.1...v2.1.0) 23 | 24 | **Implemented enhancements:** 25 | 26 | - Update atom-linter to v10.0.0 🚀 [\#211](https://github.com/AtomLinter/linter-pylint/pull/211) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 27 | - Add path placeholder for project name [\#210](https://github.com/AtomLinter/linter-pylint/pull/210) ([nrth](https://github.com/nrth)) 28 | 29 | **Fixed bugs:** 30 | 31 | - PYTHONPATH hacks break inner pylint imports [\#104](https://github.com/AtomLinter/linter-pylint/issues/104) 32 | - Remove hardcoded PYTHONPATH hack. [\#213](https://github.com/AtomLinter/linter-pylint/pull/213) ([ddaanet](https://github.com/ddaanet)) 33 | 34 | ## [v2.0.1](https://github.com/Atomlinter/linter-pylint/tree/v2.0.1) (2017-03-30) 35 | 36 | [Full Changelog](https://github.com/Atomlinter/linter-pylint/compare/v2.0.0...v2.0.1) 37 | 38 | **Fixed bugs:** 39 | 40 | - linter-pylint wont work after update to 2.0.0 [\#206](https://github.com/AtomLinter/linter-pylint/issues/206) 41 | - Rename range to position [\#207](https://github.com/AtomLinter/linter-pylint/pull/207) ([Arcanemagus](https://github.com/Arcanemagus)) 42 | 43 | ## [v2.0.0](https://github.com/Atomlinter/linter-pylint/tree/v2.0.0) (2017-03-29) 44 | 45 | [Full Changelog](https://github.com/Atomlinter/linter-pylint/compare/v1.2.3...v2.0.0) 46 | 47 | **Implemented enhancements:** 48 | 49 | - Error running Pylint Error: Process execution timed out [\#204](https://github.com/AtomLinter/linter-pylint/issues/204) 50 | - PyLint console does not contain any web hyperlinks + unable to copy/paste [\#77](https://github.com/AtomLinter/linter-pylint/issues/77) 51 | - Rename executable to executablePath [\#153](https://github.com/AtomLinter/linter-pylint/issues/153) 52 | 53 | **Fixed bugs:** 54 | 55 | - Relative imports not working \(Django\) [\#110](https://github.com/AtomLinter/linter-pylint/issues/110) 56 | - Bad warning: C0103 invalid module name "atom-linter\_7080..." at line 1 col 0 in .../\_\_init\_\_.py [\#57](https://github.com/AtomLinter/linter-pylint/issues/57) 57 | - Linter v2 [\#205](https://github.com/AtomLinter/linter-pylint/pull/205) ([Arcanemagus](https://github.com/Arcanemagus)) 58 | 59 | ## [v1.2.3](https://github.com/Atomlinter/linter-pylint/tree/v1.2.3) (2017-03-18) 60 | 61 | [Full Changelog](https://github.com/Atomlinter/linter-pylint/compare/v1.2.2...v1.2.3) 62 | 63 | **Implemented enhancements:** 64 | 65 | - Update eslint-config-airbnb-base to v11.1.1 [\#203](https://github.com/AtomLinter/linter-pylint/pull/203) ([Arcanemagus](https://github.com/Arcanemagus)) 66 | - Update CI configuration [\#202](https://github.com/AtomLinter/linter-pylint/pull/202) ([Arcanemagus](https://github.com/Arcanemagus)) 67 | - Update atom-linter to v9.0.0 🚀 [\#198](https://github.com/AtomLinter/linter-pylint/pull/198) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 68 | - Update dependencies to enable Greenkeeper 🌴 [\#196](https://github.com/AtomLinter/linter-pylint/pull/196) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 69 | - Update eslint-config-airbnb-base to version 8.0.0 🚀 [\#186](https://github.com/AtomLinter/linter-pylint/pull/186) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) 70 | 71 | **Fixed bugs:** 72 | 73 | - Update CI configuration [\#190](https://github.com/AtomLinter/linter-pylint/pull/190) ([Arcanemagus](https://github.com/Arcanemagus)) 74 | 75 | ## [v1.2.2](https://github.com/Atomlinter/linter-pylint/tree/v1.2.2) (2016-09-16) 76 | 77 | [Full Changelog](https://github.com/Atomlinter/linter-pylint/compare/v1.2.1...v1.2.2) 78 | 79 | **Implemented enhancements:** 80 | 81 | - Add support for `python \(django\)` files [\#87](https://github.com/AtomLinter/linter-pylint/issues/87) 82 | - Update CI Configuration [\#182](https://github.com/AtomLinter/linter-pylint/pull/182) ([Arcanemagus](https://github.com/Arcanemagus)) 83 | - Update eslint to version 3.5.0 🚀 [\#179](https://github.com/AtomLinter/linter-pylint/pull/179) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) 84 | - Update atom-linter to version 8.0.0 🚀 [\#176](https://github.com/AtomLinter/linter-pylint/pull/176) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) 85 | - Add support for `python \(django\)` files [\#173](https://github.com/AtomLinter/linter-pylint/pull/173) ([nanorepublica](https://github.com/nanorepublica)) 86 | 87 | **Fixed bugs:** 88 | 89 | - Error: Column start greater than line length [\#165](https://github.com/AtomLinter/linter-pylint/issues/165) 90 | - Fix a race condition [\#183](https://github.com/AtomLinter/linter-pylint/pull/183) ([Arcanemagus](https://github.com/Arcanemagus)) 91 | 92 | ## [v1.2.1](https://github.com/Atomlinter/linter-pylint/tree/v1.2.1) (2016-07-05) 93 | 94 | [Full Changelog](https://github.com/Atomlinter/linter-pylint/compare/v1.2.0...v1.2.1) 95 | 96 | **Implemented enhancements:** 97 | 98 | - Support file-local environment variables in pylint setting \(and others\) [\#84](https://github.com/AtomLinter/linter-pylint/issues/84) 99 | - Support `%p` expansion for `pylint` executable [\#62](https://github.com/AtomLinter/linter-pylint/issues/62) 100 | - Update atom-linter to version 6.0.0 🚀 [\#155](https://github.com/AtomLinter/linter-pylint/pull/155) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) 101 | - Update eslint-config-airbnb-base to version 3.0.1 🚀 [\#146](https://github.com/AtomLinter/linter-pylint/pull/146) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) 102 | - Update atom-linter to version 5.0.1 🚀 [\#145](https://github.com/AtomLinter/linter-pylint/pull/145) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) 103 | - Move to eslint-config-airbnb-base [\#141](https://github.com/AtomLinter/linter-pylint/pull/141) ([Arcanemagus](https://github.com/Arcanemagus)) 104 | - Update eslint-config-airbnb to version 7.0.0 🚀 [\#137](https://github.com/AtomLinter/linter-pylint/pull/137) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) 105 | - A few updates [\#132](https://github.com/AtomLinter/linter-pylint/pull/132) ([Arcanemagus](https://github.com/Arcanemagus)) 106 | - Update eslint to version 2.2.0 🚀 [\#122](https://github.com/AtomLinter/linter-pylint/pull/122) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) 107 | - Update babel-eslint to version 5.0.0 🚀 [\#121](https://github.com/AtomLinter/linter-pylint/pull/121) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) 108 | - Update atom-package-deps to version 4.0.1 🚀 [\#120](https://github.com/AtomLinter/linter-pylint/pull/120) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) 109 | - Update eslint-config-airbnb to version 5.0.0 🚀 [\#115](https://github.com/AtomLinter/linter-pylint/pull/115) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) 110 | - atom-linter@4.3.4 breaks build 🚨 [\#111](https://github.com/AtomLinter/linter-pylint/pull/111) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) 111 | - Update lodash to version 4.0.0 🚀 [\#109](https://github.com/AtomLinter/linter-pylint/pull/109) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) 112 | 113 | **Fixed bugs:** 114 | 115 | - Pylint is executed in an Unicode-incompatible way. [\#135](https://github.com/AtomLinter/linter-pylint/issues/135) 116 | - Linter produces yellow marks in editor, but error/warning popup will not show [\#82](https://github.com/AtomLinter/linter-pylint/issues/82) 117 | - Linter cannot find pylint [\#80](https://github.com/AtomLinter/linter-pylint/issues/80) 118 | - Support virtualenv [\#75](https://github.com/AtomLinter/linter-pylint/issues/75) 119 | - Force environment encoding to UTF-8 [\#152](https://github.com/AtomLinter/linter-pylint/pull/152) ([Arcanemagus](https://github.com/Arcanemagus)) 120 | - ES6 Rewrite [\#151](https://github.com/AtomLinter/linter-pylint/pull/151) ([Arcanemagus](https://github.com/Arcanemagus)) 121 | - Update README URLs based on HTTP redirects [\#150](https://github.com/AtomLinter/linter-pylint/pull/150) ([ReadmeCritic](https://github.com/ReadmeCritic)) 122 | - Update atom-linter to 4.x [\#103](https://github.com/AtomLinter/linter-pylint/pull/103) ([SpainTrain](https://github.com/SpainTrain)) 123 | 124 | ## [v1.2.0](https://github.com/Atomlinter/linter-pylint/tree/v1.2.0) (2015-12-02) 125 | 126 | [Full Changelog](https://github.com/Atomlinter/linter-pylint/compare/v1.1.2...v1.2.0) 127 | 128 | **Implemented enhancements:** 129 | 130 | - Allow %f in pythonpath for linting relative imports [\#98](https://github.com/AtomLinter/linter-pylint/pull/98) ([rainyday](https://github.com/rainyday)) 131 | 132 | ## [v1.1.2](https://github.com/Atomlinter/linter-pylint/tree/v1.1.2) (2015-12-01) 133 | 134 | [Full Changelog](https://github.com/Atomlinter/linter-pylint/compare/v1.1.1...v1.1.2) 135 | 136 | **Implemented enhancements:** 137 | 138 | - add \r to regex for atom-linter on windows [\#97](https://github.com/AtomLinter/linter-pylint/pull/97) ([rainyday](https://github.com/rainyday)) 139 | 140 | ## [v1.1.1](https://github.com/Atomlinter/linter-pylint/tree/v1.1.1) (2015-11-30) 141 | 142 | [Full Changelog](https://github.com/Atomlinter/linter-pylint/compare/v1.1.0...v1.1.1) 143 | 144 | **Fixed bugs:** 145 | 146 | - Fix typo in config descriptions [\#96](https://github.com/AtomLinter/linter-pylint/pull/96) ([rainyday](https://github.com/rainyday)) 147 | 148 | ## [v1.1.0](https://github.com/Atomlinter/linter-pylint/tree/v1.1.0) (2015-11-30) 149 | 150 | [Full Changelog](https://github.com/Atomlinter/linter-pylint/compare/v1.0.5...v1.1.0) 151 | 152 | **Implemented enhancements:** 153 | 154 | - Update atom-linter and fix specs [\#95](https://github.com/AtomLinter/linter-pylint/pull/95) ([Arcanemagus](https://github.com/Arcanemagus)) 155 | - Allow use of project and file dir in rcfile, cwd, pythonpath. [\#91](https://github.com/AtomLinter/linter-pylint/pull/91) ([rainyday](https://github.com/rainyday)) 156 | 157 | **Fixed bugs:** 158 | 159 | - PYTHONPATH does not work [\#86](https://github.com/AtomLinter/linter-pylint/issues/86) 160 | - actually use PYTHONPATH environment variable [\#93](https://github.com/AtomLinter/linter-pylint/pull/93) ([d70-t](https://github.com/d70-t)) 161 | 162 | ## [v1.0.5](https://github.com/Atomlinter/linter-pylint/tree/v1.0.5) (2015-11-22) 163 | 164 | [Full Changelog](https://github.com/Atomlinter/linter-pylint/compare/v1.0.4...v1.0.5) 165 | 166 | **Fixed bugs:** 167 | 168 | - TypeError: Cannot read property 'length' of undefined [\#78](https://github.com/AtomLinter/linter-pylint/issues/78) 169 | 170 | ## [v1.0.4](https://github.com/Atomlinter/linter-pylint/tree/v1.0.4) (2015-11-20) 171 | 172 | [Full Changelog](https://github.com/Atomlinter/linter-pylint/compare/v1.0.3...v1.0.4) 173 | 174 | **Implemented enhancements:** 175 | 176 | - App specs [\#89](https://github.com/AtomLinter/linter-pylint/pull/89) ([Arcanemagus](https://github.com/Arcanemagus)) 177 | - Update package dependencies [\#88](https://github.com/AtomLinter/linter-pylint/pull/88) ([Arcanemagus](https://github.com/Arcanemagus)) 178 | 179 | **Fixed bugs:** 180 | 181 | - Fix travis yml [\#79](https://github.com/AtomLinter/linter-pylint/pull/79) ([Arcanemagus](https://github.com/Arcanemagus)) 182 | 183 | ## [v1.0.3](https://github.com/Atomlinter/linter-pylint/tree/v1.0.3) (2015-10-05) 184 | 185 | [Full Changelog](https://github.com/Atomlinter/linter-pylint/compare/v1.0.2...v1.0.3) 186 | 187 | **Implemented enhancements:** 188 | 189 | - Fix getProjDir\(\) for symbolic links [\#74](https://github.com/AtomLinter/linter-pylint/pull/74) ([kankaristo](https://github.com/kankaristo)) 190 | - Run linting on TravisCI [\#73](https://github.com/AtomLinter/linter-pylint/pull/73) ([SpainTrain](https://github.com/SpainTrain)) 191 | - Add a coffeelint.json [\#72](https://github.com/AtomLinter/linter-pylint/pull/72) ([Arcanemagus](https://github.com/Arcanemagus)) 192 | 193 | ## [v1.0.2](https://github.com/Atomlinter/linter-pylint/tree/v1.0.2) (2015-10-02) 194 | 195 | [Full Changelog](https://github.com/Atomlinter/linter-pylint/compare/v1.0.1...v1.0.2) 196 | 197 | **Implemented enhancements:** 198 | 199 | - Add linter name [\#71](https://github.com/AtomLinter/linter-pylint/pull/71) ([Arcanemagus](https://github.com/Arcanemagus)) 200 | 201 | ## [v1.0.1](https://github.com/Atomlinter/linter-pylint/tree/v1.0.1) (2015-09-28) 202 | 203 | [Full Changelog](https://github.com/Atomlinter/linter-pylint/compare/v1.0.0...v1.0.1) 204 | 205 | **Implemented enhancements:** 206 | 207 | - Install `linter` automatically. [\#63](https://github.com/AtomLinter/linter-pylint/issues/63) 208 | - Add Mike S as a maintainer [\#59](https://github.com/AtomLinter/linter-pylint/issues/59) 209 | - Per project .pylintrc file configuration [\#45](https://github.com/AtomLinter/linter-pylint/issues/45) 210 | - Show linter codes [\#28](https://github.com/AtomLinter/linter-pylint/issues/28) 211 | - Lint also Django Python files [\#17](https://github.com/AtomLinter/linter-pylint/issues/17) 212 | - Install `linter` with `atom-package-deps` [\#64](https://github.com/AtomLinter/linter-pylint/pull/64) ([SpainTrain](https://github.com/SpainTrain)) 213 | 214 | **Fixed bugs:** 215 | 216 | - Donate button image 403 [\#68](https://github.com/AtomLinter/linter-pylint/issues/68) 217 | - Issue with On-The-Fly linting [\#54](https://github.com/AtomLinter/linter-pylint/issues/54) 218 | - Object.activate is deprecated. [\#49](https://github.com/AtomLinter/linter-pylint/issues/49) 219 | - Not all errors are show!? [\#46](https://github.com/AtomLinter/linter-pylint/issues/46) 220 | - Upcoming linter changes [\#41](https://github.com/AtomLinter/linter-pylint/issues/41) 221 | - Linting on temporary files means imports don't work [\#23](https://github.com/AtomLinter/linter-pylint/issues/23) 222 | - Do not undraw current lint issues unless they are fixed [\#11](https://github.com/AtomLinter/linter-pylint/issues/11) 223 | - Remove donate link from README, broken image link [\#69](https://github.com/AtomLinter/linter-pylint/pull/69) ([miigotu](https://github.com/miigotu)) 224 | - README: Update with latest config parameters [\#56](https://github.com/AtomLinter/linter-pylint/pull/56) ([SpainTrain](https://github.com/SpainTrain)) 225 | 226 | ## [v1.0.0](https://github.com/Atomlinter/linter-pylint/tree/v1.0.0) (2015-08-17) 227 | 228 | [Full Changelog](https://github.com/Atomlinter/linter-pylint/compare/v0.2.2...v1.0.0) 229 | 230 | **Implemented enhancements:** 231 | 232 | - Update: Use latest linter API [\#55](https://github.com/AtomLinter/linter-pylint/pull/55) ([SpainTrain](https://github.com/SpainTrain)) 233 | - Add option to configure the format of linter messages [\#47](https://github.com/AtomLinter/linter-pylint/pull/47) ([Holiverh](https://github.com/Holiverh)) 234 | - Include support to fatal, convention and refactor messages [\#22](https://github.com/AtomLinter/linter-pylint/pull/22) ([marcelocarlosbr](https://github.com/marcelocarlosbr)) 235 | 236 | **Fixed bugs:** 237 | 238 | - Config.unobserve is deprecated. [\#31](https://github.com/AtomLinter/linter-pylint/issues/31) 239 | - Deprecated: 'activationEvents' [\#29](https://github.com/AtomLinter/linter-pylint/issues/29) 240 | 241 | ## [v0.2.2](https://github.com/Atomlinter/linter-pylint/tree/v0.2.2) (2015-05-21) 242 | 243 | [Full Changelog](https://github.com/Atomlinter/linter-pylint/compare/v0.2.1...v0.2.2) 244 | 245 | **Fixed bugs:** 246 | 247 | - Cleanup current deprecations [\#40](https://github.com/AtomLinter/linter-pylint/pull/40) ([awatts](https://github.com/awatts)) 248 | 249 | ## [v0.2.1](https://github.com/Atomlinter/linter-pylint/tree/v0.2.1) (2015-02-26) 250 | 251 | [Full Changelog](https://github.com/Atomlinter/linter-pylint/compare/v0.2.0...v0.2.1) 252 | 253 | **Fixed bugs:** 254 | 255 | - Make sure output is text [\#25](https://github.com/AtomLinter/linter-pylint/pull/25) ([daemonburrito](https://github.com/daemonburrito)) 256 | 257 | ## [v0.2.0](https://github.com/Atomlinter/linter-pylint/tree/v0.2.0) (2014-12-15) 258 | 259 | [Full Changelog](https://github.com/Atomlinter/linter-pylint/compare/v0.1.5...v0.2.0) 260 | 261 | **Implemented enhancements:** 262 | 263 | - Specify pylint path and .pylintrc path as settings [\#16](https://github.com/AtomLinter/linter-pylint/issues/16) 264 | - Switching between pylint executables for py2 and py3 [\#14](https://github.com/AtomLinter/linter-pylint/issues/14) 265 | - Add support for configuration and removed executable check [\#24](https://github.com/AtomLinter/linter-pylint/pull/24) ([evilhamsterman](https://github.com/evilhamsterman)) 266 | 267 | **Fixed bugs:** 268 | 269 | - Work when pylint is called pylint-script.py [\#13](https://github.com/AtomLinter/linter-pylint/issues/13) 270 | - Uncaught Error: spawn ENOENT [\#12](https://github.com/AtomLinter/linter-pylint/issues/12) 271 | - fix \#13 [\#19](https://github.com/AtomLinter/linter-pylint/pull/19) ([fnkr](https://github.com/fnkr)) 272 | 273 | ## [v0.1.5](https://github.com/Atomlinter/linter-pylint/tree/v0.1.5) (2014-08-18) 274 | 275 | [Full Changelog](https://github.com/Atomlinter/linter-pylint/compare/v0.1.4...v0.1.5) 276 | 277 | **Fixed bugs:** 278 | 279 | - Remove space from msg-template in cmd & regex [\#15](https://github.com/AtomLinter/linter-pylint/issues/15) 280 | 281 | ## [v0.1.4](https://github.com/Atomlinter/linter-pylint/tree/v0.1.4) (2014-08-13) 282 | 283 | [Full Changelog](https://github.com/Atomlinter/linter-pylint/compare/v0.1.3...v0.1.4) 284 | 285 | ## [v0.1.3](https://github.com/Atomlinter/linter-pylint/tree/v0.1.3) (2014-07-29) 286 | 287 | [Full Changelog](https://github.com/Atomlinter/linter-pylint/compare/v0.1.2...v0.1.3) 288 | 289 | **Implemented enhancements:** 290 | 291 | - Show message ids in lint messages [\#10](https://github.com/AtomLinter/linter-pylint/pull/10) ([dmnd](https://github.com/dmnd)) 292 | - Use project root as cwd [\#8](https://github.com/AtomLinter/linter-pylint/pull/8) ([dmnd](https://github.com/dmnd)) 293 | 294 | **Fixed bugs:** 295 | 296 | - Respect linter.lintDebug config [\#9](https://github.com/AtomLinter/linter-pylint/pull/9) ([dmnd](https://github.com/dmnd)) 297 | 298 | ## [v0.1.2](https://github.com/Atomlinter/linter-pylint/tree/v0.1.2) (2014-06-24) 299 | 300 | [Full Changelog](https://github.com/Atomlinter/linter-pylint/compare/v0.1.0...v0.1.2) 301 | 302 | **Fixed bugs:** 303 | 304 | - Uncaught TypeError: Object \#\ has no method 'getCmd' [\#4](https://github.com/AtomLinter/linter-pylint/issues/4) 305 | - Now using getCmdAndArgs. Fixes \#4 [\#5](https://github.com/AtomLinter/linter-pylint/pull/5) ([sebdah](https://github.com/sebdah)) 306 | - Fixed debug-output, implemented use of `cwd` for pylint-check [\#3](https://github.com/AtomLinter/linter-pylint/pull/3) ([florianb](https://github.com/florianb)) 307 | 308 | ## [v0.1.0](https://github.com/Atomlinter/linter-pylint/tree/v0.1.0) (2014-05-26) 309 | 310 | [Full Changelog](https://github.com/Atomlinter/linter-pylint/compare/v0.0.1...v0.1.0) 311 | 312 | ## [v0.0.1](https://github.com/Atomlinter/linter-pylint/tree/v0.0.1) (2014-05-26) 313 | 314 | [Full Changelog](https://github.com/Atomlinter/linter-pylint/compare/v0.0.4...v0.0.1) 315 | 316 | **Implemented enhancements:** 317 | 318 | - implemented linter-pylint [\#1](https://github.com/AtomLinter/linter-pylint/pull/1) ([florianb](https://github.com/florianb)) 319 | 320 | ## [v0.0.4](https://github.com/Atomlinter/linter-pylint/tree/v0.0.4) (2014-05-12) 321 | 322 | [Full Changelog](https://github.com/Atomlinter/linter-pylint/compare/793f18ba887db70983bcd4e6fa167a9f158dfe99...v0.0.4) 323 | 324 | 325 | 326 | \* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)* 327 | --------------------------------------------------------------------------------