Giter VIP home page Giter VIP logo

lll's Introduction

Build Status Coverage Godoc license Go Report Card

lll

Line length linter, used to enforce line length in files. Support for only checking go files.

Installation

$ go get github.com/walle/lll/...

Usage

usage: lll [--maxlength MAXLENGTH] [--tabwidth TABWIDTH] [--goonly] [--skiplist SKIPLIST] [--vendor] [--files] [--exclude EXCLUDE] [INPUT [INPUT ...]]

positional arguments:
  input

options:
  --maxlength MAXLENGTH, -l MAXLENGTH
                         max line length to check for [default: 80]
  --tabwidth TABWIDTH, -w TABWIDTH
                         tab width in spaces [default: 1]
  --goonly, -g           only check .go files
  --skiplist SKIPLIST, -s SKIPLIST
                         list of dirs to skip [default: [.git vendor]]
  --vendor               check files in vendor directory
  --files                read file names from stdin one at each line
  --exclude EXCLUDE, -e EXCLUDE
                         exclude lines that matches this regex
  --help, -h             display this help and exit

Example usage to check only go files for lines more than 100 characters. Excluding lines that contain the words TODO or FIXME. lll -l 100 -g -e "TODO|FIXME" path/to/myproject.

You can also define the flags using environment variables, eg. MAXLENGTH=100 GOONLY=true lll path/to/my/project.

Testing

Use the go test tool.

$ go test -cover

Contributing

All contributions are welcome! See CONTRIBUTING for more info.

License

The code is under the MIT license. See LICENSE for more information.

lll's People

Contributors

alessio avatar jeanmertz avatar nickhudkins avatar perpet avatar walle avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

lll's Issues

URLs are also reported as too long

I find this annoying, but apparently if you have a really long link, and it's the only thing in the line, it is still being reported.
I often put in comments links to other projects as a reference e.g.

// https://github.com/walle/lll/blob/4438bccd245f7e87a5a69023625f01e7035c05c0/utils.go#L15

nolint:lll is also not respected in comments

Allow excluding imports from lll

We have some long imports which exceed our lll length configuration.

We'd like to disable lll from anything inside import ( XYZ ) as there's not really much we can do about these import lengths.

Is there any way this could be added as a configuration?

Thanks!

lll should not complain about long strings

One of, if not the most popular style guide in the world is the Airbnb JavaScript Style Guide, which represents best-practice across a lot of the JavaScript and TypeScript ecosystem.

In the style guide, it mentions:

6.2 Strings that cause the line to go over 100 characters should not be written across multiple lines using string concatenation.

Why? Broken strings are painful to work with and make code less searchable.

// bad
const errorMessage = 'This is a super long error that was thrown because \
of Batman. When you stop to think about how Batman had anything to do \
with this, you would get nowhere \
fast.';

// bad
const errorMessage = 'This is a super long error that was thrown because ' +
  'of Batman. When you stop to think about how Batman had anything to do ' +
  'with this, you would get nowhere fast.';

// good
const errorMessage = 'This is a super long error that was thrown because of Batman. When you stop to think about how Batman had anything to do with this, you would get nowhere fast.';

This policy seems sensible. With the "bad" code example above, grepping through a project for "thrown because of Batman" would return 0 results.

One other problem with using string concatenation is that realignment is tedious when you have to remove a sentence. And it introduces unnecessary Git noise. e.g.

msg := ""Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor " +
    "incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud " +
    "exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure " +
    "dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur."

-->

// We remove the second sentence, but now the entire code block has to be readjusted
msg := ""Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor " +
    "incididunt ut labore et dolore magna aliqua. Duis aute irure dolor in reprehenderit in " +
    "voluptate velit esse cillum dolore eu fugiat nulla pariatur."

In JavaScript/TypeScript land, the most popular linter is eslint, which is similar to lll in that it has a max-len rule. It has an ignoreStrings flag which is set to true by default - a sensible default.

The implementation for this is located here: https://github.com/eslint/eslint/blob/master/lib/rules/max-len.js#L314-L315
As you can see, it is extremely simple.

In Golang land, I think the practice of ignoring strings should also apply, for precisely the same reasons. I was curious to see if other big Go projects were breaking up long strings, so I took a look at Kubernetes, which is probably the biggest. I was only able to find one instance of concatenated strings. Instead, most code is written like like this.

Similar to eslint, is it possible to add an ignoreStrings flag to lll? Currently, I have gotten so fed up with adding //nolint: lll everywhere that I have stopped using the linter, but it is a great tool and I would love to be able to use it again in the future.

Line reporting off-by-one

Running this on a piece of code:

$ lll -g -l 100 main_test.go

main_test.go:194: line is 104 characters
main_test.go:211: line is 123 characters
main_test.go:215: line is 149 characters
main_test.go:216: line is 149 characters
main_test.go:217: line is 149 characters
main_test.go:219: line is 117 characters
main_test.go:243: line is 155 characters
main_test.go:256: line is 128 characters

Running the same, but now excluding anything starting with func:

$ lll -e func -g -l 100 main_test.go
main_test.go:210: line is 123 characters
main_test.go:214: line is 149 characters
main_test.go:215: line is 149 characters
main_test.go:216: line is 149 characters
main_test.go:218: line is 117 characters
main_test.go:242: line is 155 characters
main_test.go:255: line is 128 characters

The first report (line 194) is now properly skipped, but all other lines now have an off-by-one issue, where previously line 211 was reported to have 123 characters (which is correct), but now the report says that line is on line 210, which is incorrect.

VSCode Extension?

I couldn't find a VSCode extension for this and wanted to understand if:

  1. There's a technical limitation (i.e. I should look into it)
  2. There's a better way (i.e. not use an extension)
  3. Just haven't had time to add it

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.