December 2007 Archives

Thanks to Luis Lavena, ParseTree now has gems precompiled for windows! This makes things like ruby2ruby, heckle, and much more that much more accessible to the OS-challenged!

The good news: rubyconf 2007 videos are online.

The bad news: my talk was destroyed about 8 minutes in. :(

(did anyone else happen to record my talk?)

Ruby Inline is an analog to Perl's Inline::C. Out of the box, it allows you to embed C/++ external module code in your ruby script directly. By writing simple builder classes, you can teach how to cope with new languages (fortran, perl, whatever). The code is compiled and run on the fly when needed.

Changes:

3.6.6 / 2007-12-27* 1 minor enhancement:

Now that 1.9 is out, it is time to talk about multi-version testing using multiruby. multiruby is a lesser known tool in the zentest family. It automatically builds and privately installs multiple versions of ruby and multiplexes commands to all of them, allowing you to run your tests across multiple versions of ruby all at once.

If you read this blog, you probably already have zentest and multiruby is already available to you. If not, sudo gem install zentest and you're good to go. You can try it out now (tho I recommend updating zentest to the latest version for all the candy) and you should see something like this:

% multiruby -e 'p 1+1'
creating /Users/ryan/.multiruby
creating build
creating install
creating versions
  Downloading initial ruby tarballs to ~/.multiruby/versions:
    ruby-1.8.6-p111.tar.gz via HTTP... this might take a while.
    ruby-1.9.0-0.tar.gz via HTTP... this might take a while.
  ...done
  Put other ruby tarballs in ~/.multiruby/versions to use them.
creating /Users/ryan/.multiruby/install/1.8.6-p111
Running command: tar zxf ../versions/ruby-1.8.6-p111.tar.gz
building and installing 1.8.6-p111
Running command: ./configure --prefix /Users/ryan/.multiruby/install/1.8.6-p111 &> log.configure
Running command: nice make -j4 &> log.build
Running command: make install &> log.install
creating /Users/ryan/.multiruby/install/1.9.0-0
Running command: tar zxf ../versions/ruby-1.9.0-0.tar.gz
building and installing 1.9.0-0
Running command: ./configure --prefix /Users/ryan/.multiruby/install/1.9.0-0 &> log.configure
Running command: nice make -j4 &> log.build
Running command: make install &> log.install

VERSION = 1.8.6-p111

2

RESULT = 0

VERSION = 1.9.0-0

2

RESULT = 0

TOTAL RESULT = 0 failures out of 2

Passed: 1.8.6-p111, 1.9.0-0
Failed:

Of course, it only builds when it detects new versions in the versions directory. The next time you run it should be much faster and cleaner:

% multiruby -e 'p 1+1'

VERSION = 1.8.6-p111

2

RESULT = 0

VERSION = 1.9.0-0

2

RESULT = 0

TOTAL RESULT = 0 failures out of 2

Passed: 1.8.6-p111, 1.9.0-0
Failed:

What this really boils down to is this: you now have a command that you can use in place of ruby to test on multiple versions of ruby. Where before you'd type rake and get:

% rake
(in /Users/ryan/Work/p4/zss/src/ZenTest/dev)
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby -w -Ilib:ext:bin:test -e 'require "test/test_autotest.rb"; require "test/test_help.rb"; require "test/test_rails_autotest.rb"; require "test/test_rails_controller_test_case.rb"; require "test/test_rails_helper_test_case.rb"; require "test/test_rails_view_test_case.rb"; require "test/test_unit_diff.rb"; require "test/test_zentest.rb"; require "test/test_zentest_assertions.rb"; require "test/test_zentest_mapping.rb"; require "test/unit"'
Loaded suite -e
Started
......................................................................................................................................
Finished in 0.1947 seconds.

134 tests, 425 assertions, 0 failures, 0 errors

Now you can grab that ruby command and run it with multiruby instead:

% multiruby -w -Ilib:ext:bin:test -e 'require "test/test_autotest.rb"; require "test/test_help.rb"; require "test/test_rails_autotest.rb"; require "test/test_rails_controller_test_case.rb"; require "test/test_rails_helper_test_case.rb"; require "test/test_rails_view_test_case.rb"; require "test/test_unit_diff.rb"; require "test/test_zentest.rb"; require "test/test_zentest_assertions.rb"; require "test/test_zentest_mapping.rb"; require "test/unit"' 

VERSION = 1.8.6-p111

Loaded suite -e
Started
.........................................................................................................
Finished in 0.148562 seconds.

105 tests, 338 assertions, 0 failures, 0 errors

RESULT = 0

VERSION = 1.9.0-0

Loaded suite -e
Started
..................................................................................................................................
Finished in 0.147284 seconds.

130 tests, 407 assertions, 0 failures, 0 errors

RESULT = 0

TOTAL RESULT = 0 failures out of 2

Passed: 1.8.6-p111, 1.9.0-0
Failed:

But wait, there's MORE! As an added bonus, if you're using hoe on your project, you already have a rake multi task that does the running for you, no icky copy and paste!

That is all there is to it (besides fixing 1.9 compatibilities, of course), so get out there and test your code!

ZenTest provides 4 different tools and 1 library: zentest, unit_diff, autotest, multiruby, and Test::Rails.

ZenTest scans your target and unit-test code and writes your missing code based on simple naming rules, enabling XP at a much quicker pace. ZenTest only works with Ruby and Test::Unit.

unit_diff is a command-line filter to diff expected results from actual results and allow you to quickly see exactly what is wrong.

autotest is a continous testing facility meant to be used during development. As soon as you save a file, autotest will run the corresponding dependent tests.

multiruby runs anything you want on multiple versions of ruby. Great for compatibility checking!

Test::Rails helps you build industrial-strength Rails code.

Changes:

3.7.1 / 2007-12-27

ParseTree is a C extension (using RubyInline) that extracts the parse tree for an entire class or a specific method and returns it as a s-expression (aka sexp) using ruby's arrays, strings, symbols, and integers.

As an example:

def conditional1(arg1) if arg1 == 0 then return 1 end return 0 end

becomes:

[:defn, :conditional1, [:scope, [:block, [:args, :arg1], [:if, [:call, [:lvar, :arg1], :==, [:array, [:lit, 0]]], [:return, [:lit, 1]], nil], [:return, [:lit, 0]]]]]

  • Uses RubyInline, so it just drops in.
  • Includes SexpProcessor and CompositeSexpProcessor.
    • Allows you to write very clean filters.
  • Includes UnifiedRuby, allowing you to automatically rewrite ruby quirks.
  • ParseTree#parsetreefor_string lets you parse arbitrary strings of ruby.
  • Includes parsetreeshow, which lets you quickly snoop code.
    • echo "1+1" | parsetreeshow -f for quick snippet output.
  • Includes parsetreeabc, which lets you get abc metrics on code.
    • abc metrics = numbers of assignments, branches, and calls.
    • whitespace independent metric for method complexity.
  • Includes parsetreedeps, which shows you basic class level dependencies.
  • Does not work on the core classes, as they are not ruby (yet).

Changes:

2.1.1 / 2007-12-22

ZenTest provides 4 different tools and 1 library: zentest, unit_diff, autotest, multiruby, and Test::Rails.

ZenTest scans your target and unit-test code and writes your missing code based on simple naming rules, enabling XP at a much quicker pace. ZenTest only works with Ruby and Test::Unit.

unit_diff is a command-line filter to diff expected results from actual results and allow you to quickly see exactly what is wrong.

autotest is a continous testing facility meant to be used during development. As soon as you save a file, autotest will run the corresponding dependent tests.

multiruby runs anything you want on multiple versions of ruby. Great for compatibility checking!

Test::Rails helps you build industrial-strength Rails code.

Changes:

3.7.0 / 2007-12-21

  • 8 minor enhancements:

    • Added add_mapping to make file mappings cleaner.
    • Added assert_callback thanks to Aaron Patterson.
    • Added autotest/cctray.
    • Added extrafiles and extraclass_map, allowing .autotest files to be awesome.
    • Added url for lettuce principal thanks to Hugh Sasse.
    • Added zentest.rb refactorings thanks to Hugh Sasse.
    • Exceptions are now an array of regexps, built after :initialize hook.
    • Removed rubyfork and rubyfork_client. Eric got a faster laptop. :P
  • 6 bug fixes:

    • Fixed all my annoyances with @exceptions.
    • Fixed crasher in autotest/redgreen for non-matches.
    • Fixed everything to work with ruby 1.9.
    • Fixed rubygem requires causing strangeness in tests.
    • Fixed zentest mapping so ruby2ruby and test_ruby2ruby work.
    • Removed stupid YAML methods from TrueClass during testing. (Infected by Test::Rails' use of rubygems)
  • http://www.zenspider.com/ZSS/Products/ZenTest/

  • http://rubyforge.org/projects/zentest/
  • ryand-ruby@zenspider.com

ruby_parser (RP) is a ruby parser written in pure ruby (utilizing racc--which does by default use a C extension). RP's output is the same as ParseTree's output: s-expressions using ruby's arrays and base types.

FEATURES/PROBLEMS:

  • Pure ruby, no compiles.
  • Incredibly simple interface.
  • Output is 100% equivalent to ParseTree.
    • Can utilize PT's SexpProcessor and UnifiedRuby for language processing.
  • Known Issue: Speed sucks currently. 5500 tests currently run in 21 min.
  • Known Issue: Code is waaay ugly. Port of a port. Not my fault. Will fix RSN.
  • Known Issue: I don't currently support newline nodes.
  • Known Issue: Totally awesome.
  • Known Issue: dasgn_curr decls can be out of order from ParseTree's.
  • TODO: Add comment nodes.

SYNOPSIS:

RubyParser.new.parse "1+1"
# => s(:call, s(:lit, 1), :+, s(:array, s(:lit, 1)))

Changes:

1.0.0 / 2007-12-20

ruby2ruby provides a means of generating pure ruby code easily from ParseTree's Sexps. This makes making dynamic language processors much easier in ruby than ever before.

Changes:

1.1.8 / 2007-08-21

  • 6 minor enhancements:

    • Added super awesome .autotest file. YAY!
    • Removed nil.method_missing... too many ppl bitching about it.
    • Renamed RubyToRuby (the class name) to Ruby2Ruby.
    • Restructured self-translation tests so they were friendlier when dying.
    • Strings are now always one line long only.
    • Fully in sync with ParseTree and ruby_parser.
  • 2 bug fixes:

    • Fixed a number of issues/bugs discovered via ruby_parser.
    • Cleaned out some dead code and hacks we don't need anymore.
  • http://seattlerb.rubyforge.org/

  • http://rubyforge.org/projects/seattlerb

ParseTree is a C extension (using RubyInline) that extracts the parse tree for an entire class or a specific method and returns it as a s-expression (aka sexp) using ruby's arrays, strings, symbols, and integers.

As an example:

def conditional1(arg1) if arg1 == 0 then return 1 end return 0 end

becomes:

[:defn, :conditional1, [:scope, [:block, [:args, :arg1], [:if, [:call, [:lvar, :arg1], :==, [:array, [:lit, 0]]], [:return, [:lit, 1]], nil], [:return, [:lit, 0]]]]]

  • Uses RubyInline, so it just drops in.
  • Includes SexpProcessor and CompositeSexpProcessor.
    • Allows you to write very clean filters.
  • Includes UnifiedRuby, allowing you to automatically rewrite ruby quirks.
  • ParseTree#parsetreefor_string lets you parse arbitrary strings of ruby.
  • Includes parsetreeshow, which lets you quickly snoop code.
    • echo "1+1" | parsetreeshow -f for quick snippet output.
  • Includes parsetreeabc, which lets you get abc metrics on code.
    • abc metrics = numbers of assignments, branches, and calls.
    • whitespace independent metric for method complexity.
  • Includes parsetreedeps, which shows you basic class level dependencies.
  • Does not work on the core classes, as they are not ruby (yet).

Changes:

  • 13 minor enhancements:

    • Added (partial) regexp flag support, currently numerical. ugh.
    • Added -a flag to parsetreeshow to turn on newline (all) nodes.
    • Added -r to parsetreeshow for raw arrays instead of sexps.
    • Added Unifier (SexpProcessor) class to unified_ruby.rb.
    • Added a ton of tests while working on ruby_parser.
    • Added ability to tell proc {} (nil arg slot) from proc {||} (0 arg slot)
    • Added context tracking to rewriting phase... slightly broken.
    • Added evstr support. (I hate evan)
    • Added usage for parsetreeshow.
    • Changed verbose to be true all the time in parsetreefor_string.
    • Removed process_level from SexpProcessor... just look at context size instead.
    • Revamped ParseTree. No more passing around newline. Pass around self instead.
    • I'm starting to dislike ruby's AST. It is REALLY inconsistent.
  • 6 bug fix:

    • SexpProcessor#assert_type now a bit safer with bad values.
    • Uncovered a bug in ruby (AST changes when -v used), added handler code.
    • Fixed NODE_BLOCK and massively simplified in the process.
    • Fixed rewrite_defs to deal with non-block asts.
    • Fixed test/unit hack so it does not die under miniunit.
    • Found a bug in PT where parsetreefor_string had some shadowed variables.
  • http://www.zenspider.com/ZSS/Products/ParseTree/

DESCRIPTION:

Hoe is a simple rake/rubygems helper for project Rakefiles. It generates all the usual tasks for projects including rdoc generation, testing, packaging, and deployment.

Tasks Provided:

  • announce - Generate email announcement file and post to rubyforge.
  • audit - Run ZenTest against the package
  • check_manifest - Verify the manifest
  • clean - Clean up all the extras
  • config_hoe - Create a fresh ~/.hoerc file
  • debug_gem - Show information about the gem.
  • default - Run the default tasks
  • docs - Build the docs HTML Files
  • email - Generate email announcement file.
  • gem - Build the gem file only.
  • install - Install the package. Uses PREFIX and RUBYLIB
  • install_gem - Install the package as a gem
  • multi - Run the test suite using multiruby
  • package - Build all the packages
  • post_blog - Post announcement to blog.
  • post_news - Post announcement to rubyforge.
  • publish_docs - Publish RDoc to RubyForge
  • release - Package and upload the release to rubyforge.
  • ridocs - Generate ri locally for testing
  • test - Run the test suite. Use FILTER to add to the command line.
  • test_deps - Show which test files fail when run alone.
  • uninstall - Uninstall the package.

Changes:

1.4.0 / 2007-12-20

New Rule

| | Comments (0)

I'd rather have two releases than a delayed one.

been quiet lately

| | Comments (0)

I've been quiet lately. No blog posts. RSS feeds and email piling up. No releases in quite a while...

Get ready.

No Longer Secret

| | Comments (7)

I'm currently on a plane flying home from the bay area. I just spent the last two days participating in the latest rubinius sprint. (I had to go hem early to teach my ruby class).

So, we got the go ahead/mandate to drop the secrecy. Eric Hodel and I are joining Evan Phoenix at Engine Yard to work on rubinius. This is just about the most bad-ass job I could possibly get (my dreams of becoming an astronaut long-dashed against the rocks of horrible vision and only marginally better grades).

I'm only just digging in. Last night I made some changes to autotest that will make it possible to be used with mspec (rubinius' mini version of rspec). This should help accelerate development.

I'm also feverishly working on a new ruby parser written in pure ruby (+ racc) that outputs the same as ParseTree. I'm 99% done (measuring against my tests + dynamic tests generated from stdlib+all my rubygems). I hope to have a release soon. It does have a long way to go after correctness has been addressed. Namely, it is a port of a port and could use a lot of clean-up esp now that we have the true power of ruby behind it.

Anyhow. I'm terribly excited by this. I can't wait to see where we go next.