About
Remove trailing whitespace, append missing \n and replace tabs by two spaces.
Usage
# edit script.rb and all Ruby scripts in lib directory
code-cleaner script.rb lib
# normalize standard input and print output to standard output
cat script.rb | code-cleaner
# add encoding declaration if missing
code-cleaner --encoding=utf-8
Blacklisting & Whitelisting
Of course you don’t want to remove spaces from other files like PDF documents, images etc. You don’t even want to remove spaces from all Ruby scripts, you probably want to ignore vendored files and locally installed gems. And this is where blacklisting and whitelisting comes handy.
Default behaviour is to ignore everything from vendor and gems directories and from other directories just files ending with .rb, .rake, .task and .thor are normalized.
You can change this behaviour by setting environment variables BLACKLIST
and WHITELIST
. What you pass to these variables will be treated as a regular expression. The default behaviour respond to BLACKLIST='/(vendor|gems)/'
and WHITELIST='(^bin/[^/]+|Rakefile|Thorfile|Gemfile$)|(^.+\.(rb|rake|nake|thor|task|gemspec)$)'
. Here’s an example how you can use it:
WHITELIST=''^(Rakefile|Thorfile|Gemfile|.+\.(rb|rake|nake|thor|task|gemspec))$'' BLACKLIST='/(vendor|gems)/' code-cleaner .
Note that these rules aren’t applied for explicit arguments, so if you run code-cleaner README.textile
, your readme actually will be normalized. It’s because blacklisting and whitelisting rules are applied just on directories, so if you run code-cleaner .
, your readme will stay untouched. Because of this reason code-cleaner .
and code-cleaner *
will be different.
If you want to force blacklisting resp. whitelisting even for explicitly specified files, use --apply-rules
switch. If you want just try it, use --try-apply-rules
which will tell you which files will be skipped and exit without any editing. If some files left in ARGV, the exit status will be 0, otherwise it will be 1.
In your Ruby projects, you might add all files in your bin
and script
directories into whitelist: WHITELIST='(^bin/[^/]+|Rakefile|Thorfile|Gemfile$)|(^.+\.(rb|rake|nake|thor|task|gemspec)$)'
Exit statuses
If code-cleaner does any changes, the exit status will be 0, otherwise it will be 10. It means you can use it in commands like:
if code-cleaner "$file" --apply-rules; then # code-cleaner exits with 0 if some changes were made
git add "$file" # so the changes will be committed immediately
fi
Or, better and more safe way is to directly check exit status of last command via $?
as is used in the default pre-commit
hook:
code-cleaner .
if [ $? -eq 10 ]; then
echo Any modifications were made
else
echo File was changed
fi
Pre-commit hook
The best way how you can ensure your sources are clean is to use pre-commit hook, if your SCM provides this function. Plus, if you are using git, just use load "code-cleaner.rake"
in your Rakefile and then run rake hooks:whitespace:install
. There are also alternatives for Nake (code-cleaner.nake
) and Thor (code-cleaner.thor
). Second way is to use rake --rakefile /path/to/code-cleaner/tasks/code-cleaner.rake hooks:whitespace:install
resp. nake /path/to/code-cleaner/tasks/code-cleaner.nake hooks:whitespace:install
directly.
It might force you to remove your .git/hooks/pre-commit
if this file exist. If you haven’t done any editation in this file, it’s safe to do so and if you done some, then you will need to merge your changes manually. You can do it manually, or, if you are using Nake or Thor, just use --force
option.
Here’s an example how you can integrate code-cleaner to your tasks:
begin
load "code-cleaner.nake"
rescue LoadError
warn "If you want to contribute to nake, you have to install code-cleaner gem and then run ./tasks.rb hooks:whitespace:install"
end
Also, if you project run in bundled environment, make sure you have your bin
or script
directory in your $PATH
or change the pre-commit hook to point to the right path to the code-cleaner
. If you are using Nake or Thor, just specify --path=bin
resp. --path=script
as an option for the hooks:whitespace:install
If you are using Rake, you will have to do it manually.
—encoding=utf-8 —whitelist=pattern & —blacklist=pattern
Nake::Task["hooks:whitespace:install"].tap do |task|
task.config[:path] = "bin"
task.config[:encoding] = "utf-8"
task.config[:whitelist] = '(^bin/[^/]+|Rakefile|Thorfile|Gemfile$)|(^.+\.(rb|rake|nake|thor|task|gemspec)$)'
#task.config[:blacklist]
end