Skip to content
Generate Ruby source from a Ripper style AST
Latest commit 438adba Aug 29, 2013 @jimweirich Add binary comparison ops to test
JRuby is having problems with >=, so I added it to the list of
operators to explicitly check.
Failed to load latest commit information.
doc Added RDoc task Nov 26, 2009
lib :top_const_field handler Aug 6, 2013
rakelib Bump to 0.3.10. Feb 6, 2013
test Add binary comparison ops to test Aug 29, 2013
.gitignore Add TAGS file to ignore list. Feb 4, 2013
.project_env.rc Fix Meth() resourcing (issue #6) Jul 10, 2013
.togglerc Infrastructure Nov 25, 2009
.travis.yml Add travis config. Jul 10, 2013
MIT-LICENSE Add MIT license. Feb 25, 2013
Rakefile Remove references to README.textile. Feb 4, 2013

Sorcerer -- Recovering the Source

Master Build Status

Sorcerer will generate Ruby code from a Ripper-like abstract syntax tree (i.e. S-Expressions).

Sorcerer is targetted mainly at small snippets of Ruby code, expressable in a single line. Longer examples may be re-sourced, but they will be rendered in a single line format.

Version: 1.0.0


Sorcerer is only tested on Ruby 1.9 and 2.0.


Description Link
Git Clone git://
Issues / Bug Tracking
Continuous Integration!/jimweirich/sorcerer


  sexp = [:binary,
           [:var_ref, [:@ident, "a", [1, 0]]],
           [:var_ref, [:@ident, "b", [1, 4]]]]
  puts Sorcerer.source(sexp)

will generate

  a + b

Ripper may be used to produce the s-expressions used by Sorcerer. The following will produce the same output.

  sexp ="a + b").parse
  puts Sorcerer.source(sexp)


No Options

By default, sorcerer will output its source in single line mode.

For example, given:

  sexp ="def foo; bar; end").parse

Then the following

  puts Sorcerer.source(sexp)

generates single line output (the default):

def foo; bar; end

Multi-Line Output

If you want multi-line output of source, add the multiline option to the source command.

For example, given the sexp generated above, then this

  puts Sorcerer.source(sexp, multiline: true)

generates multi-line output

def foo

(Note that all multi-line output will have a final newline.)


By default, sorcerer does not indent its multiline output. Adding the "indent" option will cause the output to be indented.

For example, given the sexp generated above, then the following

  puts Sorcerer.source(sexp, indent: true)

generates indented output:

def foo

Debugging Output

If you wish to see the S-Expressions processed by Sorcerer and the output emitted, then use the debug option:

  puts Sorcerer.source(sexp, debug: true)


Sorcerer is available under the terms of the MIT license. See the MIT-LICENSE file for details.


  • 1.0.2 - Fix bug in interpolated regular expression resourcing.

  • 1.0.1 - Add support for missing exception class or variable in rescue (from Trent Ogren).

  • 1.0.0 - Ready for the work, version 1!

  • 0.3.11 - Fix support for subexpressions involving Meth() calls.

  • 0.3.10 - Fix several issues with spaces in argument lists.

  • 0.3.9 - Support %i{} and %I{}.

  • 0.3.8 - Include constants in sub-expressions.

  • 0.3.7 - Include array in sub-expressions.

  • 0.3.6 - Support 'defined?'. Suppress nil, true, false in sub-expressions.

  • 0.3.5 - Add handler for mrhs_new.

  • 0.3.4 - Support 'meth a, b'.

  • 0.3.3 - Fix unary not.

  • 0.3.2 - Support 'def mod.method' syntax.

  • 0.3.1 - 1.9.3 support. Indenting stabby procs. RedCloth not required for testing.

  • 0.3.0 - New hash literal support. Multi-line output always end with a newline.

  • 0.2.0 - Added support for indented output.

  • 0.1.0 - Added support for multi-line output. Improved rendering of a number of constructs

  • 0.0.7 - Basic single line version

Something went wrong with that request. Please try again.