Converts Ruby files to and from Ruby 1.9's Hash syntax
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.


In Ruby 1.9, you can write a hash with symbol keys in two ways:

{ :foo => bar }
{ foo: bar }

Some have expressed discontent at this syntax change. Luckily, it's purely syntax sugar: there's no reason other than preference to use one or the other (assuming you are targeting 1.9). That means we can freely convert between them! That's what hash_syntax does: it scans Ruby code and turns the code into all 1.8 syntax or all 1.9 syntax.

Using hash_syntax

To convert a whole project to 1.8 syntax:

hash_syntax --to-18

To convert a whole project to 1.9 syntax:

hash_syntax --to-19

With no arguments, hash_syntax will scan the following paths using Dir[] and operate on each matching file:

  • app/**/*.rb
  • ext/**/*.rb
  • features/**/*.rb
  • lib/**/*.rb
  • spec/**/*.rb
  • test/**/*.rb

If you wish to convert individual files, you can name them explicitly:

hash_syntax --to-19 lib/foo.rb

That's all there is to it!

How it works

hash_syntax uses the object_regex library (source) to perform regex searches on the Ruby token stream of a given file. A Ruby 1.8 symbol hash key which can be converted to 1.9's syntax can be described as:

symbeg (ident | kw) sp? hashrocket

By using each token's unique name, (with one tweak: all other operators are op and the hashrocket is hashrocket), object_regex can search using this pattern and find it in the Ruby source. Conveniently, you cannot have a line break between the symbol and the hashrocket; otherwise, the regex would be a bit more complicated (also needing to consider comments!). Each match is replaced inline as text, and hash_syntax notes how much the line has shrunk, in case further replacements happen on the same line. A better option would be to replace the actual tokens in the stream and reconstruct the source from the token stream.

Ruby 1.9 symbol tokens are just a single label token; they are easy to find in the source.


gem install hash_syntax

Note on Patches/Pull Requests

  • Fork the project.
  • Make your feature addition or bug fix.
  • Add tests for it. This is important so I don't break it in a future version unintentionally.
  • Commit, do not mess with rakefile, version, or history. (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
  • Send me a pull request. Bonus points for topic branches.


Copyright (c) 2011 Michael Edgar. See LICENSE for details.