yet another code counter: gloc
gloc
is yet another code counter, with some differences and enhancements compared to similar utilities.
Most importantly, it simply groups files based on their file extension, unlike other code counters that group files based on the - oftentimes incorrect - language of their content (as determined by whatever "language detection" heuristics these tools may use).
Further differences and enhancements:
- it doesn't ignore files just because it doesn't recognise them (ie. cannot correctly determine or guess their language)
- in a git repo, it processes
$( git ls-files )
by default - in a non-git directory, it processes
$( find . -type f )
by default - it generates human-friendly,
(c)loc
-alike output - it is Unix pipeline friendly, by design:
- it reads the list of filenames to process from
stdin
if[ ! -t 0 ]
- it writes machine-parsable JSON output to
stdout
if[ ! -t 1 ]
- it reads the list of filenames to process from
Example
For the popular Ruby on Rails framework, gloc
generates the following (c)loc
-alike output:
--------------------------------------------------------------------------------
Language Files Lines Blank Comment Code
--------------------------------------------------------------------------------
*.rb 2,149 304,495 47,846 42,651 213,998
*.md 74 49,604 14,204 0 35,400
*.js 39 9,717 1,452 564 7,701
*.yml 150 3,367 278 0 3,089
*.erb 408 2,183 254 0 1,929
* 81 2,255 392 0 1,863
*.css 24 1,640 214 32 1,394
*.coffee 24 1,190 197 0 993
*.rake 16 864 137 0 727
*.rdoc 11 985 352 0 633
*.tt 28 515 88 0 427
*.lock 1 437 11 0 426
*.yaml 1 231 1 0 230
*.gemspec 11 306 79 0 227
*.html 28 225 15 3 207
*.json 3 65 0 0 65
*.builder 19 62 2 0 60
*.y 1 50 4 0 46
*.sql 1 49 6 0 43
*.zoo 2 8 0 0 8
*.ru 2 8 2 0 6
*.txt 6 6 0 0 6
*.ruby 2 4 0 0 4
*.erb~ 4 4 0 0 4
*.raw 2 2 0 0 2
*.styles 1 1 0 0 1
*.log 1 1 0 0 1
*.dtd 1 1 0 0 1
*.mab 1 1 0 0 1
*.javascript 1 1 0 0 1
--------------------------------------------------------------------------------
Total 3,092 378,277 65,534 43,250 269,493
--------------------------------------------------------------------------------
What It Is Not!
For various reasons, none of these existing utilities to count lines of code are fit for (my) purpose:
And it definitely isn't:
Installation
gem install gloc
Usage
The simplest way to use gloc
is to simply run:
gloc
It should behave pretty much as you'd expect!
in a git repo
In a git repo, running gloc
will process all files known to git, so is roughly equivalent to:
git ls-files | gloc
in a non-git repo
In a non-git repo, running gloc
will process all files in the directory, so is roughly equivalent to:
find . -type f | gloc
Sorting
The results are sorted by "lines of code" by default (with "lines of code" defined as lines that aren't blank or comment-only) but the following options are supported to sort the results differently:
gloc -files # sort by number of files
gloc -lines # sort by the total number of lines
gloc -blank # sort by the number of blank lines
gloc -comment # sort by the number of comment lines
gloc -code # sort by lines of code (default)
Processing
When gloc
's STDOUT isn't a TTY, it outputs the LoC stats in JSON format, for further parsing and processing.
This also means you can pretty-print the LoC stats as follows:
gloc | jq
... which uses the the jq
utility for processing the JSON output.
To "force" the typical TTY output even when STDOUT isn't a TTY, you can use the -tty
option as follows:
gloc -tty | pbcopy
... which copies the non-JSON version of the LoC stats to the clipboard.
Known Issues and Possible Enhancements
- identify comment-only lines for a lot more languages
- support more file encodings (not just
UTF-8
andISO-8859-1
) - (?) parse shebang lines for scripts without a file extension
- (?) installation via Homebrew
- (?) convert script to Perl for performance
Development
After checking out the repo, run bin/setup
to install dependencies. Then, run rake test
to run the tests. You can also run bin/console
for an interactive prompt that will allow you to experiment.
To install this gem onto your local machine, run bundle exec rake install
. To release a new version, update the version number in version.rb
, and then run bundle exec rake release
, which will create a git tag for the version, push git commits and tags, and push the .gem
file to rubygems.org.
Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/pvdb/gloc. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the Contributor Covenant code of conduct.
License
The gem is available as open source under the terms of the MIT License.