{ "info": { "author": "Grant McConnaughey", "author_email": "grantmcconnaughey@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Environment :: Console", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: MacOS", "Operating System :: Microsoft :: Windows", "Operating System :: POSIX", "Operating System :: Unix", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Software Development :: Quality Assurance" ], "description": "# Lintly\n\n[![Build Status](https://travis-ci.org/grantmcconnaughey/Lintly.svg?branch=master)](https://travis-ci.org/grantmcconnaughey/Lintly) [![codecov](https://codecov.io/gh/grantmcconnaughey/lintly/branch/master/graph/badge.svg)](https://codecov.io/gh/grantmcconnaughey/lintly)\n\nA Continuous Integration CLI that slurps up linter output and sends it to a GitHub PR review.\n\n## Usage\n\nFirst, `pip` install lintly:\n\n $ pip install lintly\n\n> Lintly requires Python 2.7 or 3.4+.\n\nNext, set the `LINTLY_API_KEY` environment variable to your GitHub API Key:\n\n $ export LINTLY_API_KEY=\"12345\"\n\nFinally, pipe the output of your linter to the `lintly` script:\n\n $ flake8 | lintly\n\nNow you will see linting errors in your Pull Requests! Nifty!\n\n![Lintly used on a pull request](./example.png)\n\n## Supported Git Services\n\n- GitHub\n\n> Support for GitLab and Bitbucket is planned.\n\n## Supported Linters\n\n- [flake8](http://flake8.pycqa.org/en/latest/)\n ```\n $ flake8 | lintly --format=flake8\n ```\n- [black](https://black.readthedocs.io/en/stable/)\n ```\n $ black --check | lintly --format=black\n ```\n- [pylint](https://www.pylint.org/)\n - For pylint you must use the `json` output format.\n ```\n $ pylint . --output-format=json | lintly --format=pylint-json\n ```\n- [eslint](https://eslint.org/)\n ```\n $ eslint . | lintly --format=eslint\n ```\n- [stylelint](https://stylelint.io/)\n ```\n $ stylelint . | lintly --format=stylelint\n ```\n\n- [cfn-lint](https://github.com/aws-cloudformation/cfn-python-lint)\n ```\n $ cfn-lint template.yaml | lintly --format=cfn-lint\n ```\n\nAdditional linters can be added by modifying the `lintly/parsers.py` module.\n\n## Configuration\n\nAt a minimum Lintly needs to know the following information to determine how to post the correct GitHub PR Review:\n\n- **GitHub API key** (`--api-key` or `LINTLY_API_KEY` env var)\n - Generate your own [API Key here](https://github.com/settings/tokens/new). The API key will need the following GitHub scopes:\n - `repo:status` so that Lintly can post commit statuses on PRs.\n - `public_repo` so that Lintly can create pull request reviews on public repos.\n - `repo` so that Lintly can create pull request reviews on private repos.\n- **GitHub repository** (`--repo` or `LINTLY_REPO` env var)\n - This is your repository in the format `grantmcconnaughey/lintly`.\n > Note: Some Continuous Integration platforms will provide this value automatically.\n- **Pull Request number** (`--pr` or `LINTLY_PR` env var)\n > Note: Some Continuous Integration platforms will provide this value automatically.\n\nThese configuration values can be provided to Lintly via environment variables or by being passed in as arguments to the Lintly CLI. A list of all configuration values can be viewed by running `lintly --help`.\n\n## Supported Continuous Integration platforms\n\nLintly works out of the box with the following Continuous Integration platforms:\n\n- [Travis CI](#travis-ci)\n- Circle CI\n- AppVeyor\n- Shippable\n- Semaphore\n- CodeBuild\n\nWhen using these Continuous Integration platforms the repository, pull request number, and commit SHA will be detected automatically.\n\n### Travis CI example\n\nTo use with Lintly with Travis CI, add the following to your `.travis.yml` config file:\n\n```yml\nlanguage: python\n\njobs:\n include:\n - stage: lint\n install: pip install lintly\n script: flake8 | lintly --format=flake8\n\nstages:\n - lint\n```\n\n## To-Do\n\n- Add support for GitHub Enterprise custom GitHub URLs\n- Configuration to post either a PR comment or PR review\n- Link to Build URL from commit status\n- Support for config file\n- Auto-detect linters\n- GitLab support\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/grantmcconnaughey/lintly", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "lintly", "package_url": "https://pypi.org/project/lintly/", "platform": "any", "project_url": "https://pypi.org/project/lintly/", "project_urls": { "Homepage": "https://github.com/grantmcconnaughey/lintly" }, "release_url": "https://pypi.org/project/lintly/0.3.0/", "requires_dist": [ "cached-property (<2.0)", "click (<7.0)", "jinja2 (<3.0)", "PyGithub (<2.0)", "python-gitlab (<2.0)", "sh (<1.13)", "six" ], "requires_python": "", "summary": "Slurp up linter output and send it to a GitHub PR review.", "version": "0.3.0" }, "last_serial": 4889822, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "f59e55a8ab09c3cd02ad4b538eeff4be", "sha256": "393877d6f49ce29f4ca62a599796b2f54ddf114ef9d94d436ebee7f0d89f7ee5" }, "downloads": -1, "filename": "lintly-0.1.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "f59e55a8ab09c3cd02ad4b538eeff4be", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 18471, "upload_time": "2018-06-11T03:39:13", "url": "https://files.pythonhosted.org/packages/c5/21/a797c89442042ac538a58348e39b2d4bee36280088ee2bb3a0999e189c30/lintly-0.1.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9c0e44481da3cecf00d65680de0094ff", "sha256": "d1afe30c0c63a0fb53a0e28e21ff077ca810b0b1b11476753a1b71c00d53cb14" }, "downloads": -1, "filename": "lintly-0.1.0.tar.gz", "has_sig": false, "md5_digest": "9c0e44481da3cecf00d65680de0094ff", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14292, "upload_time": "2018-06-11T03:39:15", "url": "https://files.pythonhosted.org/packages/67/bc/ee0420a79b2dc20d6fd502bb0ac21c2decc08ca7155d36fdac4178a36275/lintly-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "38b9cd683dd02a3b4274eaee860e808f", "sha256": "c3225b323aa3f6ea7d95f37ad908b0345b966e136595d14432c8784812118513" }, "downloads": -1, "filename": "lintly-0.1.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "38b9cd683dd02a3b4274eaee860e808f", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 19814, "upload_time": "2018-06-11T03:43:27", "url": "https://files.pythonhosted.org/packages/c6/d5/5e47a1ef7f3d3d6ef5b2610afec344c055f5f2f819a1bafd92c31e13228b/lintly-0.1.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0004c6adfa2d3a2c6d1120470f1523b3", "sha256": "0d1878ac0334ad08f9466a77a3e3370aea478d5680421f4055c5bd4de0290ce2" }, "downloads": -1, "filename": "lintly-0.1.1.tar.gz", "has_sig": false, "md5_digest": "0004c6adfa2d3a2c6d1120470f1523b3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14769, "upload_time": "2018-06-11T03:43:29", "url": "https://files.pythonhosted.org/packages/ba/cb/5c99a2340576afdeda898b997e6c5b7d916825d0c04d8ab23ece87d1842d/lintly-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "41b41e44b1ff0b9982b0e6295dbab899", "sha256": "11c2397c57935441a66c02a7bfdf44f6ebd87794a6e0c83ba218ef022bff9f84" }, "downloads": -1, "filename": "lintly-0.1.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "41b41e44b1ff0b9982b0e6295dbab899", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 19799, "upload_time": "2018-06-11T04:02:55", "url": "https://files.pythonhosted.org/packages/9f/81/d92f7e566b95befb0b655cffaad7bb17fbc356b2134ebe164fbd820b7069/lintly-0.1.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ca2f753030d22f0f222b0e2301ac1d85", "sha256": "2795db3a018c21889161bbc4a3af6d99d6fd2ac53f227362f468e480df6a96bb" }, "downloads": -1, "filename": "lintly-0.1.2.tar.gz", "has_sig": false, "md5_digest": "ca2f753030d22f0f222b0e2301ac1d85", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 144352, "upload_time": "2018-06-11T04:02:57", "url": "https://files.pythonhosted.org/packages/70/d6/6c7c98f307909c53491db79f152cf4602ec5c47e135e9e7fa9fab95f3103/lintly-0.1.2.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "414c50fdcfaefd2f8bdd15da232a25c9", "sha256": "3a71bfab9e465b8a801d04bfdc6728b9ef68cbccbf380ad46afffd983259acf8" }, "downloads": -1, "filename": "lintly-0.2.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "414c50fdcfaefd2f8bdd15da232a25c9", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 20830, "upload_time": "2018-11-21T16:57:28", "url": "https://files.pythonhosted.org/packages/4f/77/d06c8efc1ffeec8c2b409dcc1b5df85853d3d0d15fcc64bedbf921627304/lintly-0.2.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ed11d0f718cc268045896ea01c48a67e", "sha256": "57ea880bdd19b66b700e8ec9468f99c2390ddda6f70feb06e1454acf2d952f5f" }, "downloads": -1, "filename": "lintly-0.2.0.tar.gz", "has_sig": false, "md5_digest": "ed11d0f718cc268045896ea01c48a67e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 144578, "upload_time": "2018-11-21T16:57:31", "url": "https://files.pythonhosted.org/packages/4a/5e/6f49bd1469779ba2227b60c9b8e580c41c19f2ff207b016998c9dd0ed755/lintly-0.2.0.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "3372e74b4eb96b14c548fb9db1ce0955", "sha256": "5bde7c4c17752d338c19017c4caf999baf34fcd6ea93aa80b236357b7a48832f" }, "downloads": -1, "filename": "lintly-0.3.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "3372e74b4eb96b14c548fb9db1ce0955", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 21227, "upload_time": "2019-03-03T03:37:00", "url": "https://files.pythonhosted.org/packages/9f/1f/317a3f35a65e773a859ce84c7816ea6bc5c4f1cdcf38fc71c7e46e677500/lintly-0.3.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "771c7da18c74c8f643df190381006b56", "sha256": "0a6a72f67c95aab6ac6411948ca99626cd5804cd3105401308b833af3c66e815" }, "downloads": -1, "filename": "lintly-0.3.0.tar.gz", "has_sig": false, "md5_digest": "771c7da18c74c8f643df190381006b56", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 145040, "upload_time": "2019-03-03T03:37:02", "url": "https://files.pythonhosted.org/packages/14/04/3aaf1388ba1c4345d4df608da448f40629f72e8c21f54ce5c47f32815ae0/lintly-0.3.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "3372e74b4eb96b14c548fb9db1ce0955", "sha256": "5bde7c4c17752d338c19017c4caf999baf34fcd6ea93aa80b236357b7a48832f" }, "downloads": -1, "filename": "lintly-0.3.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "3372e74b4eb96b14c548fb9db1ce0955", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 21227, "upload_time": "2019-03-03T03:37:00", "url": "https://files.pythonhosted.org/packages/9f/1f/317a3f35a65e773a859ce84c7816ea6bc5c4f1cdcf38fc71c7e46e677500/lintly-0.3.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "771c7da18c74c8f643df190381006b56", "sha256": "0a6a72f67c95aab6ac6411948ca99626cd5804cd3105401308b833af3c66e815" }, "downloads": -1, "filename": "lintly-0.3.0.tar.gz", "has_sig": false, "md5_digest": "771c7da18c74c8f643df190381006b56", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 145040, "upload_time": "2019-03-03T03:37:02", "url": "https://files.pythonhosted.org/packages/14/04/3aaf1388ba1c4345d4df608da448f40629f72e8c21f54ce5c47f32815ae0/lintly-0.3.0.tar.gz" } ] }