[rspec-users] Coding standards and whitespace

Wincent Colaiuta win at wincent.com
Thu Jul 26 05:26:28 EDT 2007


Recently as a result of using Git I've noticed a number of  
inconsistencies in the RSpec codebase with respect to whitespace  
(mixed line endings, mixed use of spaces and tabs for indentation,  
and trailing whitespace at the end of lines). I never would have  
noticed, but Git produces nice colorized diff output which highlights  
these kinds of inconsistencies.

I wanted to ask if the core RSpec team had established any  
conventions/standards for these things. The basic rationale is that  
if all contributors agree to a small number of conventions for  
whitespace there are less likely to be changesets with non- 
substantive whitespace differences (really, false alarms).

The procedure I used to explore this was as follows:

First export a clean copy of the trunk:

   svn export svn://rubyforge.org/var/svn/rspec/trunk rspec-trunk
   cd rspec-trunk

Then use the following Bash incantation to see which files had UNIX,  
Mac or Windows line endings:

IFS="
"
for FILE in $(find . -type f)
do
   if ! perl -ne "exit 1 if m/\r/;" "$FILE"; then
     echo "CR detected in : $FILE"
   else
     echo "ok             : $FILE"
   fi
done

All text files used UNIX line endings (LF) with the exception of  
these four, which used Windows line endings (CRLF):

doc/src/default.css
rspec/bin/spec_translator
spec_ui/examples/selenium/README.txt
spec_ui/History.txt

I did a similar Bash thing to find out which files had tabs in them;  
many of them appear to consistently use tabs for indentation but some  
do not, using a mixture of tabs and spaces.

doc/src/breadcrumbs.css
doc/src/default.css
doc/src/default.template
rspec/lib/spec/runner/formatter/base_text_formatter.rb
rspec/lib/spec/runner/formatter/html_formatter.rb
rspec/lib/spec/runner/spec_parser.rb
rspec/spec/spec/runner/formatter/html_formatted-1.8.4.html
rspec/spec/spec/runner/formatter/html_formatted-1.8.5-jruby.html
rspec/spec/spec/runner/formatter/html_formatted-1.8.5.html
rspec/spec/spec/runner/formatter/html_formatted-1.8.6.html
RSpec.tmbundle/Commands/Alternate File.tmCommand
RSpec.tmbundle/Commands/Run Focussed Specification.tmCommand
RSpec.tmbundle/Commands/Run Specifications - Normal.tmCommand
RSpec.tmbundle/Commands/Run Specifications in selected files or  
directories.tmCommand
RSpec.tmbundle/info.plist
RSpec.tmbundle/Snippets/and_raise.tmSnippet
RSpec.tmbundle/Snippets/and_return_block.tmSnippet
RSpec.tmbundle/Snippets/and_return_value.tmSnippet
RSpec.tmbundle/Snippets/and_throw.tmSnippet
RSpec.tmbundle/Snippets/and_yield.tmSnippet
RSpec.tmbundle/Snippets/any_number_of_times.tmSnippet
RSpec.tmbundle/Snippets/at_least.tmSnippet
RSpec.tmbundle/Snippets/at_least_once.tmSnippet
RSpec.tmbundle/Snippets/at_least_twice.tmSnippet
RSpec.tmbundle/Snippets/at_most.tmSnippet
RSpec.tmbundle/Snippets/at_most_once.tmSnippet
RSpec.tmbundle/Snippets/at_most_twice.tmSnippet
RSpec.tmbundle/Snippets/controller_context.tmSnippet
RSpec.tmbundle/Snippets/controller_context_RESTful.tmSnippet
RSpec.tmbundle/Snippets/Custom Matcher.tmSnippet
RSpec.tmbundle/Snippets/Describe.tmSnippet
RSpec.tmbundle/Snippets/Describe_type.tmSnippet
RSpec.tmbundle/Snippets/Describe_type_string.tmSnippet
RSpec.tmbundle/Snippets/exactly.tmSnippet
RSpec.tmbundle/Snippets/It.tmSnippet
RSpec.tmbundle/Snippets/mock.tmSnippet
RSpec.tmbundle/Snippets/once.tmSnippet
RSpec.tmbundle/Snippets/Require spec_helper.tmSnippet
RSpec.tmbundle/Snippets/response_should_be_success.tmSnippet
RSpec.tmbundle/Snippets/response_should_not_be_success.tmSnippet
RSpec.tmbundle/Snippets/Set Controller for Spec.tmSnippet
RSpec.tmbundle/Snippets/setup.tmSnippet
RSpec.tmbundle/Snippets/should ==.tmSnippet
RSpec.tmbundle/Snippets/should =~.tmSnippet
RSpec.tmbundle/Snippets/should eql.tmSnippet
RSpec.tmbundle/Snippets/should_be.tmSnippet
RSpec.tmbundle/Snippets/should_be_a_kind_of.tmSnippet
RSpec.tmbundle/Snippets/should_be_an_instance_of.tmSnippet
RSpec.tmbundle/Snippets/should_be_close.tmSnippet
RSpec.tmbundle/Snippets/should_be_redirect.tmSnippet
RSpec.tmbundle/Snippets/should_equal.tmSnippet
RSpec.tmbundle/Snippets/should_have.tmSnippet
RSpec.tmbundle/Snippets/should_have_at_least.tmSnippet
RSpec.tmbundle/Snippets/should_have_at_most.tmSnippet
RSpec.tmbundle/Snippets/should_have_records.tmSnippet
RSpec.tmbundle/Snippets/should_include.tmSnippet
RSpec.tmbundle/Snippets/should_match.tmSnippet
RSpec.tmbundle/Snippets/should_not ==.tmSnippet
RSpec.tmbundle/Snippets/should_not =~.tmSnippet
RSpec.tmbundle/Snippets/should_not eql.tmSnippet
RSpec.tmbundle/Snippets/should_not_be.tmSnippet
RSpec.tmbundle/Snippets/should_not_be_a_kind_of.tmSnippet
RSpec.tmbundle/Snippets/should_not_be_an_instance_of.tmSnippet
RSpec.tmbundle/Snippets/should_not_be_close.tmSnippet
RSpec.tmbundle/Snippets/should_not_be_redirect.tmSnippet
RSpec.tmbundle/Snippets/should_not_equal.tmSnippet
RSpec.tmbundle/Snippets/should_not_include.tmSnippet
RSpec.tmbundle/Snippets/should_not_match.tmSnippet
RSpec.tmbundle/Snippets/should_not_predicate.tmSnippet
RSpec.tmbundle/Snippets/should_not_raise.tmSnippet
RSpec.tmbundle/Snippets/should_not_receive.tmSnippet
RSpec.tmbundle/Snippets/should_not_respond_to.tmSnippet
RSpec.tmbundle/Snippets/should_not_satisfy.tmSnippet
RSpec.tmbundle/Snippets/should_not_throw.tmSnippet
RSpec.tmbundle/Snippets/should_predicate.tmSnippet
RSpec.tmbundle/Snippets/should_raise.tmSnippet
RSpec.tmbundle/Snippets/should_receive.tmSnippet
RSpec.tmbundle/Snippets/should_receive_with_any_args.tmSnippet
RSpec.tmbundle/Snippets/should_receive_with_args.tmSnippet
RSpec.tmbundle/Snippets/should_receive_with_no_args.tmSnippet
RSpec.tmbundle/Snippets/should_redirect_to.tmSnippet
RSpec.tmbundle/Snippets/should_render.tmSnippet
RSpec.tmbundle/Snippets/should_respond_to.tmSnippet
RSpec.tmbundle/Snippets/should_satisfy.tmSnippet
RSpec.tmbundle/Snippets/should_throw.tmSnippet
RSpec.tmbundle/Snippets/teardown.tmSnippet
RSpec.tmbundle/Snippets/twice.tmSnippet
rspec_on_rails/generators/rspec/templates/script/spec_server

Finally I did a search for trailing whitespace. Which yielded the  
following list. Many of the lines contain nothing but whitespace;  
sometimes this use is consistent (ie. the whitespace corresponds to  
the nesting level of the current scope) but at other times it is not.

doc/metainfo.yaml
doc/plugin/breadcrumbs.rb
doc/plugin/rspec_content.rb
doc/plugin/svn_tag.rb
doc/plugin/syntax.rb
doc/plugin/version.rb
doc/src/breadcrumbs.css
doc/src/community/contribute.page
doc/src/community/index.page
doc/src/default.template
doc/src/documentation/before_and_after.page
doc/src/documentation/index.page
doc/src/documentation/mocks/index.page
doc/src/documentation/mocks/mocks.page
doc/src/documentation/rails/generators.page
doc/src/documentation/rails/index.page
doc/src/documentation/rails/install.page
doc/src/documentation/rails/runners.page
doc/src/documentation/rails/writing/index.page
doc/src/documentation/tools/extensions/editors/index.page
doc/src/documentation/tools/extensions/editors/textmate.page
doc/src/documentation/tools/heckle.page
doc/src/documentation/tools/index.page
doc/src/documentation/tools/rake.page
doc/src/documentation/tools/rcov.page
doc/src/documentation/tools/spec.page
doc/src/download.page
doc/src/images/ducks1.png
doc/src/index.page
doc/src/upgrade.page
example_rails_app/app/controllers/naughty_controller.rb
example_rails_app/app/controllers/people_controller.rb
example_rails_app/app/helpers/people_helper.rb
example_rails_app/app/models/person.rb
example_rails_app/config/boot.rb
example_rails_app/config/environment.rb
example_rails_app/config/environments/test.rb
example_rails_app/config/routes.rb
example_rails_app/db/migrate/004_create_things.rb
example_rails_app/lib/tasks/bootstrap_rspec.rake
example_rails_app/public/.htaccess
example_rails_app/public/index.html
example_rails_app/public/javascripts/controls.js
example_rails_app/public/javascripts/dragdrop.js
example_rails_app/public/javascripts/effects.js
example_rails_app/spec/controllers/naughty_controller_spec.rb
example_rails_app/spec/controllers/people_controller_spec.rb
example_rails_app/spec/fixtures/animals.yml
example_rails_app/spec/helpers/people_helper_spec.rb
example_rails_app/spec/models/person_spec.rb
example_rails_app/spec/views/person/create_view_spec.rb
example_rails_app/spec/views/person/show_view_spec.rb
example_rails_app/spec/watir/person_spec.rb
example_rails_app/TODO
pre_commit/lib/pre_commit/core.rb
pre_commit/lib/pre_commit/pre_commit.rb
pre_commit/lib/pre_commit/rspec.rb
pre_commit/lib/pre_commit/rspec_on_rails.rb
pre_commit/spec/pre_commit/pre_commit_spec.rb
pre_commit/spec/pre_commit/rspec_on_rails_spec.rb
rspec/CHANGES
rspec/examples/auto_spec_description_example.rb
rspec/examples/before_and_after_example.rb
rspec/examples/behave_as_example.rb
rspec/examples/custom_expectation_matchers.rb
rspec/examples/file_accessor.rb
rspec/examples/file_accessor_spec.rb
rspec/examples/helper_method_example.rb
rspec/examples/legacy_spec.rb
rspec/examples/predicate_example.rb
rspec/examples/shared_behaviours_example.rb
rspec/examples/stack.rb
rspec/examples/stack_spec.rb
rspec/examples/stubbing_example.rb
rspec/examples/test_case_adapter_example.rb
rspec/examples/test_case_spec.rb
rspec/failing_examples/failure_in_setup.rb
rspec/failing_examples/failure_in_teardown.rb
rspec/failing_examples/mocking_example.rb
rspec/failing_examples/predicate_example.rb
rspec/failing_examples/raising_example.rb
rspec/failing_examples/team_spec.rb
rspec/lib/autotest/rspec.rb
rspec/lib/spec/dsl/behaviour.rb
rspec/lib/spec/dsl/behaviour_callbacks.rb
rspec/lib/spec/dsl/behaviour_eval.rb
rspec/lib/spec/dsl/behaviour_factory.rb
rspec/lib/spec/dsl/configuration.rb
rspec/lib/spec/dsl/description.rb
rspec/lib/spec/dsl/example.rb
rspec/lib/spec/dsl/example_matcher.rb
rspec/lib/spec/dsl/example_should_raise_handler.rb
rspec/lib/spec/expectations/differs/default.rb
rspec/lib/spec/expectations/handler.rb
rspec/lib/spec/expectations.rb
rspec/lib/spec/extensions/object.rb
rspec/lib/spec/matchers/be.rb
rspec/lib/spec/matchers/be_close.rb
rspec/lib/spec/matchers/change.rb
rspec/lib/spec/matchers/eql.rb
rspec/lib/spec/matchers/equal.rb
rspec/lib/spec/matchers/has.rb
rspec/lib/spec/matchers/have.rb
rspec/lib/spec/matchers/include.rb
rspec/lib/spec/matchers/match.rb
rspec/lib/spec/matchers/operator_matcher.rb
rspec/lib/spec/matchers/raise_error.rb
rspec/lib/spec/matchers/respond_to.rb
rspec/lib/spec/matchers/satisfy.rb
rspec/lib/spec/matchers/throw_symbol.rb
rspec/lib/spec/matchers.rb
rspec/lib/spec/mocks/argument_constraint_matchers.rb
rspec/lib/spec/mocks/argument_expectation.rb
rspec/lib/spec/mocks/error_generator.rb
rspec/lib/spec/mocks/errors.rb
rspec/lib/spec/mocks/message_expectation.rb
rspec/lib/spec/mocks/methods.rb
rspec/lib/spec/mocks/mock.rb
rspec/lib/spec/mocks/order_group.rb
rspec/lib/spec/mocks/proxy.rb
rspec/lib/spec/mocks/space.rb
rspec/lib/spec/mocks/spec_methods.rb
rspec/lib/spec/mocks.rb
rspec/lib/spec/rake/spectask.rb
rspec/lib/spec/rake/verify_rcov.rb
rspec/lib/spec/runner/backtrace_tweaker.rb
rspec/lib/spec/runner/behaviour_runner.rb
rspec/lib/spec/runner/command_line.rb
rspec/lib/spec/runner/extensions/kernel.rb
rspec/lib/spec/runner/extensions/object.rb
rspec/lib/spec/runner/formatter/base_formatter.rb
rspec/lib/spec/runner/formatter/base_text_formatter.rb
rspec/lib/spec/runner/formatter/failing_behaviours_formatter.rb
rspec/lib/spec/runner/formatter/failing_examples_formatter.rb
rspec/lib/spec/runner/formatter/html_formatter.rb
rspec/lib/spec/runner/formatter/progress_bar_formatter.rb
rspec/lib/spec/runner/formatter/rdoc_formatter.rb
rspec/lib/spec/runner/formatter/snippet_extractor.rb
rspec/lib/spec/runner/formatter/specdoc_formatter.rb
rspec/lib/spec/runner/heckle_runner.rb
rspec/lib/spec/runner/option_parser.rb
rspec/lib/spec/runner/options.rb
rspec/lib/spec/runner/reporter.rb
rspec/lib/spec/runner/spec_parser.rb
rspec/lib/spec/runner.rb
rspec/lib/spec/translator.rb
rspec/lib/spec/version.rb
rspec/Rakefile
rspec/README
rspec/spec/spec/dsl/behaviour_eval_spec.rb
rspec/spec/spec/dsl/behaviour_factory_spec.rb
rspec/spec/spec/dsl/behaviour_spec.rb
rspec/spec/spec/dsl/configuration_spec.rb
rspec/spec/spec/dsl/description_spec.rb
rspec/spec/spec/dsl/example_class_spec.rb
rspec/spec/spec/dsl/example_instance_spec.rb
rspec/spec/spec/dsl/example_should_raise_spec.rb
rspec/spec/spec/dsl/predicate_matcher_spec.rb
rspec/spec/spec/dsl/shared_behaviour_spec.rb
rspec/spec/spec/expectations/extensions/object_spec.rb
rspec/spec/spec/expectations/fail_with_spec.rb
rspec/spec/spec/matchers/be_spec.rb
rspec/spec/spec/matchers/change_spec.rb
rspec/spec/spec/matchers/description_generation_spec.rb
rspec/spec/spec/matchers/exist_spec.rb
rspec/spec/spec/matchers/handler_spec.rb
rspec/spec/spec/matchers/have_spec.rb
rspec/spec/spec/matchers/matcher_methods_spec.rb
rspec/spec/spec/matchers/operator_matcher_spec.rb
rspec/spec/spec/matchers/raise_error_spec.rb
rspec/spec/spec/matchers/respond_to_spec.rb
rspec/spec/spec/matchers/throw_symbol_spec.rb
rspec/spec/spec/mocks/any_number_of_times_spec.rb
rspec/spec/spec/mocks/bug_report_11545_spec.rb
rspec/spec/spec/mocks/bug_report_7611_spec.rb
rspec/spec/spec/mocks/bug_report_8302_spec.rb
rspec/spec/spec/mocks/failing_mock_argument_constraints_spec.rb
rspec/spec/spec/mocks/mock_ordering_spec.rb
rspec/spec/spec/mocks/mock_space_spec.rb
rspec/spec/spec/mocks/mock_spec.rb
rspec/spec/spec/mocks/multiple_return_value_spec.rb
rspec/spec/spec/mocks/once_counts_spec.rb
rspec/spec/spec/mocks/partial_mock_spec.rb
rspec/spec/spec/mocks/partial_mock_using_mocks_directly_spec.rb
rspec/spec/spec/mocks/passing_mock_argument_constraints_spec.rb
rspec/spec/spec/mocks/stub_spec.rb
rspec/spec/spec/mocks/twice_counts_spec.rb
rspec/spec/spec/runner/behaviour_runner_spec.rb
rspec/spec/spec/runner/command_line_spec.rb
rspec/spec/spec/runner/drb_command_line_spec.rb
rspec/spec/spec/runner/example_matcher_spec.rb
rspec/spec/spec/runner/execution_context_spec.rb
rspec/spec/spec/runner/extensions/kernel_spec.rb
rspec/spec/spec/runner/formatter/failing_behaviours_formatter_spec.rb
rspec/spec/spec/runner/formatter/html_formatted-1.8.5-jruby.html
rspec/spec/spec/runner/formatter/html_formatter_spec.rb
rspec/spec/spec/runner/formatter/progress_bar_formatter_dry_run_spec.rb
rspec/spec/spec/runner/formatter/progress_bar_formatter_spec.rb
rspec/spec/spec/runner/formatter/rdoc_formatter_dry_run_spec.rb
rspec/spec/spec/runner/formatter/rdoc_formatter_spec.rb
rspec/spec/spec/runner/formatter/specdoc_formatter_dry_run_spec.rb
rspec/spec/spec/runner/noisy_backtrace_tweaker_spec.rb
rspec/spec/spec/runner/option_parser_spec.rb
rspec/spec/spec/runner/options_spec.rb
rspec/spec/spec/runner/quiet_backtrace_tweaker_spec.rb
rspec/spec/spec/runner/reporter_spec.rb
rspec/spec/spec/runner/spec_parser_spec.rb
rspec/spec/spec/spec_classes.rb
rspec/spec/spec/translator_spec.rb
rspec/spec.opts
rspec/UPGRADE
RSpec.tmbundle/Support/lib/spec/mate/switch_command.rb
RSpec.tmbundle/Support/lib/spec_mate.rb
RSpec.tmbundle/Support/spec/spec/mate/switch_command_spec.rb
RSpec.tmbundle/Support/spec/spec_mate_spec.rb
rspec_on_rails/generators/rspec/templates/script/spec_server
rspec_on_rails/generators/rspec_controller/templates/helper_spec.rb
rspec_on_rails/generators/rspec_controller/templates/view_spec.rb
rspec_on_rails/generators/rspec_controller/USAGE
rspec_on_rails/generators/rspec_scaffold/rspec_scaffold_generator.rb
rspec_on_rails/generators/rspec_scaffold/templates/controller_spec.rb
rspec_on_rails/generators/rspec_scaffold/templates/edit_erb_spec.rb
rspec_on_rails/generators/rspec_scaffold/templates/index_erb_spec.rb
rspec_on_rails/generators/rspec_scaffold/templates/new_erb_spec.rb
rspec_on_rails/generators/rspec_scaffold/templates/show_erb_spec.rb
rspec_on_rails/lib/autotest/rails_rspec.rb
rspec_on_rails/lib/spec/dsl/configuration.rb
rspec_on_rails/lib/spec/matchers/have.rb
rspec_on_rails/lib/spec/rails/dsl/behaviour/base.rb
rspec_on_rails/lib/spec/rails/dsl/behaviour/controller.rb
rspec_on_rails/lib/spec/rails/dsl/behaviour/functional.rb
rspec_on_rails/lib/spec/rails/dsl/behaviour/helper.rb
rspec_on_rails/lib/spec/rails/dsl/behaviour/render_observer.rb
rspec_on_rails/lib/spec/rails/dsl/behaviour/view.rb
rspec_on_rails/lib/spec/rails/extensions/action_controller/base.rb
rspec_on_rails/lib/spec/rails/matchers/assert_select.rb
rspec_on_rails/lib/spec/rails/matchers/have_text.rb
rspec_on_rails/lib/spec/rails/matchers/redirect_to.rb
rspec_on_rails/lib/spec/rails/matchers/render_template.rb
rspec_on_rails/lib/spec/rails.rb
rspec_on_rails/MIT-LICENSE
rspec_on_rails/spec/rails/autotest/mappings_spec.rb
rspec_on_rails/spec/rails/dsl/behaviour_factory_spec.rb
rspec_on_rails/spec/rails/dsl/configuration_spec.rb
rspec_on_rails/spec/rails/dsl/controller_isolation_spec.rb
rspec_on_rails/spec/rails/dsl/controller_spec_spec.rb
rspec_on_rails/spec/rails/dsl/helper_spec_spec.rb
rspec_on_rails/spec/rails/dsl/ivar_proxy_spec.rb
rspec_on_rails/spec/rails/dsl/shared_behaviour_spec.rb
rspec_on_rails/spec/rails/dsl/view_spec_spec.rb
rspec_on_rails/spec/rails/extensions/action_view_base_spec.rb
rspec_on_rails/spec/rails/extensions/active_record_spec.rb
rspec_on_rails/spec/rails/matchers/assert_select_spec.rb
rspec_on_rails/spec/rails/matchers/description_generation_spec.rb
rspec_on_rails/spec/rails/matchers/redirect_to_spec.rb
rspec_on_rails/spec/rails/matchers/render_spec.rb
rspec_on_rails/spec/spec_helper.rb
rspec_on_rails/spec_resources/controllers/controller_spec_controller.rb
rspec_on_rails/spec_resources/controllers/redirect_spec_controller.rb
rspec_on_rails/spec_resources/controllers/render_spec_controller.rb
rspec_on_rails/spec_resources/controllers/rjs_spec_controller.rb
rspec_on_rails/spec_resources/helpers/explicit_helper.rb
rspec_on_rails/tasks/rspec.rake
spec_distributed/lib/spec/distributed/master_runner.rb
spec_distributed/lib/spec/distributed/slave_runner.rb
spec_distributed/Rakefile
spec_distributed/README.txt
spec_distributed/setup.rb
spec_ui/examples/selenium/Rakefile
spec_ui/examples/selenium/spec/spec_helper.rb
spec_ui/examples/watir/Rakefile
spec_ui/examples/watir/spec/watir/find_rspecs_homepage_spec.rb
spec_ui/lib/spec/ui/formatter.rb
spec_ui/lib/spec/ui/selenium/driver_ext.rb
spec_ui/lib/spec/ui/watir/browser.rb
spec_ui/lib/spec/ui/watir/matchers.rb
spec_ui/Rakefile
spec_ui/spec/spec/ui/watir/matchers_spec.rb

No big deal, but just wanted to throw this out there to see what you  
think.

Cheers,
Wincent



More information about the rspec-users mailing list