Archive for the ‘ruby’ Category
Using Models In Rails Migrations
It is quite tempting to use models in rails migrations.
At the time the migration is expected to run, the model class will have been updated already, so it is hard use that in the migration itself, even though it would be useful.
Consider this example:
class CreateUsers < ActiveRecord::Migration def self.up t.string :email, :null => false t.string :password, :null => false end # create a dummy user - with newer rails versions this should really go in seeds.rb! User.create!(:email => 'user@example.com', :password => 'demo') end def self.down drop_table :users end end
Doesn’t get simpler than this!
Now lets add another migration:
class AddSSNForUser < ActiveRecord::Migration def self.up add_column, :users, :ssn, :string, :null => false end def self.down remove_column, :users, :ssn end end
And a corresponding validation to the User model:
class User < ActiveRecord::Base # ... validates_presence_of :ssn # ... end
Now if you were to run the database migrations on an empty database, the first migration would fail because of the lack of a SSN. Worse, it is quite possible that the User class is now called something else.
How do you get around this issue:
class CreateUsers < ActiveRecord::Migration # define your own User class class User < ActiveRecord::Base #... end def self.up # clear all cache that rails maintains about the User class/table mapping User.reset_column_information create_table :users do |t| # whatever we did in the example above end # this statement will always work no matter what. User.create!(:email => 'user@example.com', :password => 'demo') end def self.down drop_table :users end end
Sometimes using SQL for performing data migrations could get quite cumbersome and unreadable, and using model objects is the simplest way to run any form of data migration. In such a case, it’s better to copy your model code into the migration.
Cucumber On JRuby inside Eclipse
Fredrick recently asked on the swtbot newsgroup:
My goal is to be able to write some user acceptance tests (using Cucumber) to be able to tests some of my Eclipse plug-ins.
Cucumber is a BDD framework written in (J)ruby. It executes plain text files as functional tests. As a first step, the goal was to be able to print a simple ‘hello world’:
This required being able to bundle jruby with the necessary gems, the jruby jar is already OSGi-fied, so creating a manifest was not required.
First drop in the jruby-complete.jar that we just created inside the target eclipse’s plugins directory.
Then create an eclipse application with the following in it:
public class CucumberRunner implements IApplication {
public Object start(IApplicationContext context) throws Exception {
Bundle bundle = Platform.getBundle("org.jruby.jruby");
URL jrubyHome = FileLocator.toFileURL(bundle.getEntry("/META-INF/jruby.home"));
RubyInstanceConfig config = new RubyInstanceConfig();
config.setJRubyHome(jrubyHome.toString());
Ruby runtime = JavaEmbedUtils.initialize(new ArrayList(), config);
RubyRuntimeAdapter evaler = JavaEmbedUtils.newRuntimeAdapter();
evaler.eval(runtime, "p 'Hello, Eclipse World'");
JavaEmbedUtils.terminate(runtime);
return EXIT_OK;
}
public void stop() {
// do nothing
}
}
Now all we needed was to be able to execute the cucumber executable instead of printing hello world
Import the cucumber plugin with a sample calculator to execute it:
Run JRuby From Within A Jar And Package Your Own Gems Along
Jruby-in a jar already bundles rspec and rake, so the goal was to find out where it gets packaged.
Download the jruby source zip, extract it and open the build.xml file, search for “rspec” (there’s two occurences) and you’ll find that it’s passed in as an argument to the gem installer, add in another line with “cucumber”:
<target name="install-gems">
<property name="jruby.home" value="${basedir}"/>
<java classname="org.jruby.Main" fork="true" maxmemory="${jruby.launch.memory}" failonerror="true">
<classpath refid="build.classpath"/>
<classpath path="${jruby.classes.dir}"/>
<sysproperty key="jruby.home" value="${jruby.home}"/>
<arg value="--command"/>
<arg value="maybe_install_gems"/>
<arg value="rspec"/>
<arg value="rake"/>
<arg value="cucumber"/> <!-- add cucumber -->
<arg value="--env-shebang"/>
</java>
</target>
Then run ant:
$ ant jar-complete
To verify that everything is fine:
$ java -jar lib/jruby-complete.jar -S gem list *** LOCAL GEMS *** builder (2.1.2) cucumber (0.2.3) diff-lcs (1.1.2) polyglot (0.2.5) rake (0.8.4) rspec (1.2.2) sources (0.0.1) term-ansicolor (1.0.3) treetop (1.2.5)
Great we’ve now managed to package jruby-in-a-jar with some additional gems. Now to run cucumber on jruby in eclipse.
Controller Testing in Active Scaffold
I just started my adventure with rails a few nights ago. Figured that Active Scaffold based controllers do something that is different from the default controllers generated by the scaffold generator.
For one all controller tests broke when I moved to active scaffold. Here’s a blog post that talks about testing active scaffold based controllers.
Making Eclipse Plug-ins using JRuby or Groovy
Read more about using JRuby or Groovy to write eclipse plugins here: http://dev.eclipse.org/blogs/wayne/2007/07/26/making-eclipse-plug-ins-using-jruby-or-groovy/

