<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>GravityBlast &#187; Ruby</title>
	<atom:link href="http://gravityblast.com/category/ruby/feed/" rel="self" type="application/rss+xml" />
	<link>http://gravityblast.com</link>
	<description>...coding blast beat!</description>
	<lastBuildDate>Thu, 08 Apr 2010 08:12:49 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Flex functional testing with FunFx and Cucumber</title>
		<link>http://gravityblast.com/2009/08/20/flex-functional-testing-with-funfx-and-cucumber/</link>
		<comments>http://gravityblast.com/2009/08/20/flex-functional-testing-with-funfx-and-cucumber/#comments</comments>
		<pubDate>Thu, 20 Aug 2009 13:11:56 +0000</pubDate>
		<dc:creator>Andrea Franz</dc:creator>
				<category><![CDATA[Cucumber]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[RIA]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Testing]]></category>

		<guid isPermaLink="false">http://gravityblast.com/?p=317</guid>
		<description><![CDATA[Cucumber is a great tool I usually use for BDD in my ruby projects, but yesterday I tried it with Flex, and it was very enjoyable. Here a little example on how to test Flex applications with Cucumber.
First of all you need ruby, then you need to install the following gems:

sudo gem install rspec cucumber [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://cukes.info/">Cucumber</a> is a great tool I usually use for <a href="http://en.wikipedia.org/wiki/Behavior_driven_development" title="Behavior Driven Development">BDD</a> in my ruby projects, but yesterday I tried it with Flex, and it was very enjoyable. Here a little example on how to test Flex applications with Cucumber.</p>
<p>First of all you need ruby, then you need to install the following gems:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> gem <span style="color: #c20cb9; font-weight: bold;">install</span> rspec cucumber watir safariwatir funfx</pre></div></div>

<p>(I used the following codes on <strong>mac os x</strong>, with <strong>ruby 1.8.6</strong>, <strong>safari 4.0.3</strong> and <strong>funx 0.2.2</strong>)</p>
<p>After that open Flex Builder and create a new project called CucumberExample and use the following code for your main mxml file:</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?</span>xml <span style="color: #004993;">version</span>=<span style="color: #990000;">&quot;1.0&quot;</span> encoding=<span style="color: #990000;">&quot;utf-8&quot;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>
<span style="color: #000000; font-weight: bold;">&lt;</span>mx<span style="color: #000000; font-weight: bold;">:</span>Application xmlns<span style="color: #000000; font-weight: bold;">:</span>mx=<span style="color: #990000;">&quot;http://www.adobe.com/2006/mxml&quot;</span> layout=<span style="color: #990000;">&quot;absolute&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span>
	<span style="color: #000000; font-weight: bold;">&lt;</span>mx<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Number</span> id=<span style="color: #990000;">&quot;index&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000; font-weight:bold;">0</span><span style="color: #000000; font-weight: bold;">&lt;/</span>mx<span style="color: #000000; font-weight: bold;">:</span>Number<span style="color: #000000; font-weight: bold;">&gt;</span>
	<span style="color: #000000; font-weight: bold;">&lt;</span>mx<span style="color: #000000; font-weight: bold;">:</span>VBox <span style="color: #004993;">width</span>=<span style="color: #990000;">&quot;300&quot;</span> <span style="color: #004993;">height</span>=<span style="color: #990000;">&quot;200&quot;</span> <span style="color: #004993;">backgroundColor</span>=<span style="color: #990000;">&quot;white&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span>
		<span style="color: #000000; font-weight: bold;">&lt;</span>mx<span style="color: #000000; font-weight: bold;">:</span>HBox <span style="color: #004993;">width</span>=<span style="color: #990000;">&quot;100%&quot;</span> <span style="color: #004993;">height</span>=<span style="color: #990000;">&quot;30&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span>			
			<span style="color: #000000; font-weight: bold;">&lt;</span>mx<span style="color: #000000; font-weight: bold;">:</span>Button id=<span style="color: #990000;">&quot;buttonDecrement&quot;</span> label=<span style="color: #990000;">&quot;-&quot;</span> <span style="color: #004993;">width</span>=<span style="color: #990000;">&quot;100%&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span>
			<span style="color: #000000; font-weight: bold;">&lt;</span>mx<span style="color: #000000; font-weight: bold;">:</span>Button id=<span style="color: #990000;">&quot;buttonIncrement&quot;</span> label=<span style="color: #990000;">&quot;+&quot;</span> <span style="color: #004993;">width</span>=<span style="color: #990000;">&quot;100%&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span>
		<span style="color: #000000; font-weight: bold;">&lt;/</span>mx<span style="color: #000000; font-weight: bold;">:</span>HBox<span style="color: #000000; font-weight: bold;">&gt;</span>
		<span style="color: #000000; font-weight: bold;">&lt;</span>mx<span style="color: #000000; font-weight: bold;">:</span>HBox <span style="color: #004993;">width</span>=<span style="color: #990000;">&quot;100%&quot;</span> <span style="color: #004993;">height</span>=<span style="color: #990000;">&quot;100%&quot;</span> verticalAlign=<span style="color: #990000;">&quot;middle&quot;</span> horizontalAlign=<span style="color: #990000;">&quot;center&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span>
			<span style="color: #000000; font-weight: bold;">&lt;</span>mx<span style="color: #000000; font-weight: bold;">:</span>Label id=<span style="color: #990000;">&quot;myLabel&quot;</span> <span style="color: #004993;">text</span>=<span style="color: #990000;">&quot;{index}&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span>			
		<span style="color: #000000; font-weight: bold;">&lt;/</span>mx<span style="color: #000000; font-weight: bold;">:</span>HBox<span style="color: #000000; font-weight: bold;">&gt;</span>
	<span style="color: #000000; font-weight: bold;">&lt;/</span>mx<span style="color: #000000; font-weight: bold;">:</span>VBox<span style="color: #000000; font-weight: bold;">&gt;</span>
<span style="color: #000000; font-weight: bold;">&lt;/</span>mx<span style="color: #000000; font-weight: bold;">:</span>Application<span style="color: #000000; font-weight: bold;">&gt;</span></pre></div></div>

<p>As you can see, we have a number, 2 buttons and a label. Now create a directory called features inside your flex project folder and create the first Cucumber feature file, called counter:</p>
<p><strong>CucumberExample/features/counter.feature</strong>:</p>

<div class="wp_syntax"><div class="code"><pre class="cucumber" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">Feature</span>: Counter
  <span style="color:#9966CC; font-weight:bold;">In order</span> to count something
  As a flex rock star
  I want to use my great flex app
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">Scenario</span>: Increment index
    <span style="color:#9966CC; font-weight:bold;">Given</span> I open my flex app
    <span style="color:#9966CC; font-weight:bold;">And</span> I click the increment button
    <span style="color:#9966CC; font-weight:bold;">Then</span> the label text should be <span style="color:#996600;">&quot;1&quot;</span>
    <span style="color:#9966CC; font-weight:bold;">When</span> I click the decrement button
    <span style="color:#9966CC; font-weight:bold;">Then</span> the label text should be <span style="color:#996600;">&quot;0&quot;</span>
    <span style="color:#9966CC; font-weight:bold;">When</span> I click the decrement button
    <span style="color:#9966CC; font-weight:bold;">Then</span> the label text should be <span style="color:#996600;">&quot;-1&quot;</span></pre></div></div>

<p>It&#8217;s a test written in pure plain text.</p>
<p>In the <strong>features</strong> folder create another folder called <strong>step_definitions</strong> with a blank file called <strong>counter_steps.rb</strong>, we&#8217;ll use it later.</p>
<p>Now open the console, go the to flex project root and run your test:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>path<span style="color: #000000; font-weight: bold;">/</span>to<span style="color: #000000; font-weight: bold;">/</span>CucumberExample
cucumber features</pre></div></div>

<p>You should see something like this:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">...
<span style="color: #000000;">1</span> scenario <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">1</span> undefined<span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000;">7</span> steps <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">7</span> undefined<span style="color: #7a0874; font-weight: bold;">&#41;</span>
0m0.002s</pre></div></div>

<p>You can implement step definitions for undefined steps with these snippets:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">Given <span style="color:#006600; font-weight:bold;">/</span>^I <span style="color:#CC0066; font-weight:bold;">open</span> my flex app$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  pending
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
Given <span style="color:#006600; font-weight:bold;">/</span>^I click the increment button$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  pending
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">Then</span> <span style="color:#006600; font-weight:bold;">/</span>^the label text should be <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span>$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>arg1<span style="color:#006600; font-weight:bold;">|</span>
  pending
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">When</span> <span style="color:#006600; font-weight:bold;">/</span>^I click the decrement button$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  pending
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Before implementing the steps above, we need to add the funfx component to our library.</p>
<p>Download the latest <strong>swc</strong> file from <a href="http://rubyforge.org/frs/?group_id=3898&#038;release_id=16452">rubyforge</a> and place it in your <strong>CucumberExample/libs</strong> folder (I used the version 0.2.2).</p>
<p>Duplicate the bin-debug folder and rename it to <strong>test</strong> (you have a bin-debug folder after the first time you run the CucumberExample from FlexBuilder).</p>
<p>Inside the test directory create a file called <strong>test_server.rb</strong> with the following content:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'webrick'</span>
&nbsp;
server = <span style="color:#6666ff; font-weight:bold;">WEBrick::HTTPServer</span>.<span style="color:#9900CC;">new</span> <span style="color:#ff3333; font-weight:bold;">:Port</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006666;">9852</span>, <span style="color:#ff3333; font-weight:bold;">:DocumentRoot</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">dirname</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF; font-weight:bold;">__FILE__</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#CC0066; font-weight:bold;">trap</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;INT&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#123;</span> server.<span style="color:#9900CC;">shutdown</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
server.<span style="color:#9900CC;">start</span></pre></div></div>

<p>Now you need a compiled version of your project that includes funfx.We&#8217;ll use it just for testing:</p>
<p><strong>build_test.sh</strong></p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/sh</span>
<span style="color: #007800;">FLEX_SDK_HOME</span>=<span style="color: #ff0000;">&quot;/Applications/Adobe Flex Builder 3/sdks/3.2.0&quot;</span>
<span style="color: #ff0000;">&quot;<span style="color: #007800;">$FLEX_SDK_HOME</span>/bin/mxmlc&quot;</span> <span style="color: #660033;">-verbose-stacktraces</span> <span style="color: #660033;">-include-libraries</span> .<span style="color: #000000; font-weight: bold;">/</span>libs<span style="color: #000000; font-weight: bold;">/</span>funfx-0.2.2.swc <span style="color: #ff0000;">&quot;<span style="color: #007800;">$FLEX_SDK_HOME</span>/frameworks/libs/automation.swc&quot;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$FLEX_SDK_HOME</span>/frameworks/libs/automation_dmv.swc&quot;</span>  <span style="color: #ff0000;">&quot;<span style="color: #007800;">$FLEX_SDK_HOME</span>/frameworks/libs/automation_agent.swc&quot;</span> <span style="color: #660033;">-output</span> .<span style="color: #000000; font-weight: bold;">/</span><span style="color: #7a0874; font-weight: bold;">test</span><span style="color: #000000; font-weight: bold;">/</span>CucumberExample.swf <span style="color: #660033;">--</span> .<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>CucumberExample.mxml</pre></div></div>

<p>Run test <strong>compile_test.sh</strong></p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">chmod</span> <span style="color: #000000;">755</span> .<span style="color: #000000; font-weight: bold;">/</span>build_test.sh
.<span style="color: #000000; font-weight: bold;">/</span>build_test.sh</pre></div></div>

<p>Now open another terminal window and start the test server:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>path<span style="color: #000000; font-weight: bold;">/</span>to<span style="color: #000000; font-weight: bold;">/</span>CucumberExample<span style="color: #000000; font-weight: bold;">/</span><span style="color: #7a0874; font-weight: bold;">test</span>
ruby test_server.rb</pre></div></div>

<p>Open http://localhost:9852/CucumberExample.html with your browser and you should see your flex app.</p>
<p>Now you can come back to your features and implement the step we leave before. Here my implementation:</p>
<p><strong>CucumberExample/features/step_definitions/counter_steps.rb</strong></p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">Given <span style="color:#006600; font-weight:bold;">/</span>^I <span style="color:#CC0066; font-weight:bold;">open</span> my flex app$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  open_flex_app
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
Given <span style="color:#006600; font-weight:bold;">/</span>^I click the <span style="color:#006600; font-weight:bold;">&#40;</span>increment<span style="color:#006600; font-weight:bold;">|</span>decrement<span style="color:#006600; font-weight:bold;">&#41;</span> button$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>button<span style="color:#006600; font-weight:bold;">|</span>  
  click_button<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;button#{button.capitalize}&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>  
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">Then</span> <span style="color:#006600; font-weight:bold;">/</span>^the label text should be <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span>$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>text<span style="color:#006600; font-weight:bold;">|</span>
  label_text.<span style="color:#9900CC;">should</span> == text  
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p><strong>open_flex_app</strong>, <strong>click_button</strong> and <strong>label_text</strong> are methods  defined in my <strong>env.rb</strong> file.</p>
<p><strong>CucumberExample/features/support/env.rb</strong></p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">&quot;rubygems&quot;</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'funfx/browser/safariwatir'</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">module</span> FlexWorld
  <span style="color:#9966CC; font-weight:bold;">def</span> open_flex_app
    <span style="color:#0066ff; font-weight:bold;">@browser</span>.<span style="color:#9900CC;">goto</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;http://localhost:9852/CucumberExample.html&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> click_button<span style="color:#006600; font-weight:bold;">&#40;</span>button_id<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#0066ff; font-weight:bold;">@flex_app</span>.<span style="color:#9900CC;">button</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:id</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> button_id<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">click</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> label_text
    <span style="color:#0066ff; font-weight:bold;">@flex_app</span>.<span style="color:#9900CC;">label</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:id</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;myLabel&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">text</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
Before <span style="color:#9966CC; font-weight:bold;">do</span>
  <span style="color:#0066ff; font-weight:bold;">@browser</span>  = <span style="color:#6666ff; font-weight:bold;">Watir::Safari</span>.<span style="color:#9900CC;">new</span>
  <span style="color:#0066ff; font-weight:bold;">@flex_app</span> = <span style="color:#0066ff; font-weight:bold;">@browser</span>.<span style="color:#9900CC;">flex_app</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;CucumberExample&quot;</span>, <span style="color:#996600;">&quot;CucumberExample&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>  
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
After <span style="color:#9966CC; font-weight:bold;">do</span>
  <span style="color:#0066ff; font-weight:bold;">@browser</span>.<span style="color:#9900CC;">close</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
World<span style="color:#006600; font-weight:bold;">&#40;</span>FlexWorld<span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<p>Now you are ready to run your tests.  Start the test_server and then the features. You should have  an error:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">Then the label text should be <span style="color: #ff0000;">&quot;1&quot;</span>  <span style="color: #666666; font-style: italic;"># features/step_definitions/counter_steps.rb:9</span>
      expected: <span style="color: #ff0000;">&quot;1&quot;</span>,
           got: <span style="color: #ff0000;">&quot;0&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>using ==<span style="color: #7a0874; font-weight: bold;">&#41;</span></pre></div></div>

<p>This because we didn&#8217;t implement the functionality yet in our flex app. So, change the mxml file with the following:</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?</span>xml <span style="color: #004993;">version</span>=<span style="color: #990000;">&quot;1.0&quot;</span> encoding=<span style="color: #990000;">&quot;utf-8&quot;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>
<span style="color: #000000; font-weight: bold;">&lt;</span>mx<span style="color: #000000; font-weight: bold;">:</span>Application xmlns<span style="color: #000000; font-weight: bold;">:</span>mx=<span style="color: #990000;">&quot;http://www.adobe.com/2006/mxml&quot;</span> layout=<span style="color: #990000;">&quot;absolute&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span>
	<span style="color: #000000; font-weight: bold;">&lt;</span>mx<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Number</span> id=<span style="color: #990000;">&quot;index&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000; font-weight:bold;">0</span><span style="color: #000000; font-weight: bold;">&lt;/</span>mx<span style="color: #000000; font-weight: bold;">:</span>Number<span style="color: #000000; font-weight: bold;">&gt;</span>
	<span style="color: #000000; font-weight: bold;">&lt;</span>mx<span style="color: #000000; font-weight: bold;">:</span>VBox <span style="color: #004993;">width</span>=<span style="color: #990000;">&quot;300&quot;</span> <span style="color: #004993;">height</span>=<span style="color: #990000;">&quot;200&quot;</span> <span style="color: #004993;">backgroundColor</span>=<span style="color: #990000;">&quot;white&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span>
		<span style="color: #000000; font-weight: bold;">&lt;</span>mx<span style="color: #000000; font-weight: bold;">:</span>HBox <span style="color: #004993;">width</span>=<span style="color: #990000;">&quot;100%&quot;</span> <span style="color: #004993;">height</span>=<span style="color: #990000;">&quot;30&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span>			
			<span style="color: #000000; font-weight: bold;">&lt;</span>mx<span style="color: #000000; font-weight: bold;">:</span>Button id=<span style="color: #990000;">&quot;buttonDecrement&quot;</span> label=<span style="color: #990000;">&quot;-&quot;</span> <span style="color: #004993;">width</span>=<span style="color: #990000;">&quot;100%&quot;</span> <span style="color: #004993;">click</span>=<span style="color: #990000;">&quot;index--&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span>
			<span style="color: #000000; font-weight: bold;">&lt;</span>mx<span style="color: #000000; font-weight: bold;">:</span>Button id=<span style="color: #990000;">&quot;buttonIncrement&quot;</span> label=<span style="color: #990000;">&quot;+&quot;</span> <span style="color: #004993;">width</span>=<span style="color: #990000;">&quot;100%&quot;</span> <span style="color: #004993;">click</span>=<span style="color: #990000;">&quot;index++&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span>
		<span style="color: #000000; font-weight: bold;">&lt;/</span>mx<span style="color: #000000; font-weight: bold;">:</span>HBox<span style="color: #000000; font-weight: bold;">&gt;</span>
		<span style="color: #000000; font-weight: bold;">&lt;</span>mx<span style="color: #000000; font-weight: bold;">:</span>HBox <span style="color: #004993;">width</span>=<span style="color: #990000;">&quot;100%&quot;</span> <span style="color: #004993;">height</span>=<span style="color: #990000;">&quot;100%&quot;</span> verticalAlign=<span style="color: #990000;">&quot;middle&quot;</span> horizontalAlign=<span style="color: #990000;">&quot;center&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span>
			<span style="color: #000000; font-weight: bold;">&lt;</span>mx<span style="color: #000000; font-weight: bold;">:</span>Label id=<span style="color: #990000;">&quot;myLabel&quot;</span> <span style="color: #004993;">text</span>=<span style="color: #990000;">&quot;{index}&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span>			
		<span style="color: #000000; font-weight: bold;">&lt;/</span>mx<span style="color: #000000; font-weight: bold;">:</span>HBox<span style="color: #000000; font-weight: bold;">&gt;</span>
	<span style="color: #000000; font-weight: bold;">&lt;/</span>mx<span style="color: #000000; font-weight: bold;">:</span>VBox<span style="color: #000000; font-weight: bold;">&gt;</span>
<span style="color: #000000; font-weight: bold;">&lt;/</span>mx<span style="color: #000000; font-weight: bold;">:</span>Application<span style="color: #000000; font-weight: bold;">&gt;</span></pre></div></div>

<p>It&#8217;s the same code but I added the click action to the increment and decrement buttons. Now compile the new code and run the features again:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">.<span style="color: #000000; font-weight: bold;">/</span>build_test.sh
cucumber features</pre></div></div>

<p>You shoiuld have the following output, with all the seven steps passed:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">Feature: Counter
  In order to count something
  As a <span style="color: #c20cb9; font-weight: bold;">flex</span> rock star
  I want to use my great <span style="color: #c20cb9; font-weight: bold;">flex</span> app
&nbsp;
  Scenario: Increment index            <span style="color: #666666; font-style: italic;"># features/counter.feature:6</span>
    Given I open my <span style="color: #c20cb9; font-weight: bold;">flex</span> app           <span style="color: #666666; font-style: italic;"># features/step_definitions/counter_steps.rb:1</span>
    And I click the increment button   <span style="color: #666666; font-style: italic;"># features/step_definitions/counter_steps.rb:5</span>
    Then the label text should be <span style="color: #ff0000;">&quot;1&quot;</span>  <span style="color: #666666; font-style: italic;"># features/step_definitions/counter_steps.rb:9</span>
    When I click the decrement button  <span style="color: #666666; font-style: italic;"># features/step_definitions/counter_steps.rb:5</span>
    Then the label text should be <span style="color: #ff0000;">&quot;0&quot;</span>  <span style="color: #666666; font-style: italic;"># features/step_definitions/counter_steps.rb:9</span>
    When I click the decrement button  <span style="color: #666666; font-style: italic;"># features/step_definitions/counter_steps.rb:5</span>
    Then the label text should be <span style="color: #ff0000;">&quot;-1&quot;</span> <span style="color: #666666; font-style: italic;"># features/step_definitions/counter_steps.rb:9</span>
&nbsp;
<span style="color: #000000;">1</span> scenario <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">1</span> passed<span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000;">7</span> steps <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">7</span> passed<span style="color: #7a0874; font-weight: bold;">&#41;</span>
0m9.781s</pre></div></div>

<p>If you have any problems you may want to clear the cache from safari.</p>
<p>I used the funfx gem from  <a href="http://funfx.rubyforge.org/">rubyforge</a> but it&#8217;s not up to date. If you want you can get the new code from <a href="http://github.com/peternic/funfx/tree/master">github</a>, it should have new features.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>share</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://buzz.yahoo.com/submit?submitUrl=http://gravityblast.com/2009/08/20/flex-functional-testing-with-funfx-and-cucumber/&amp;submitHeadline=Flex+functional+testing+with+FunFx+and+Cucumber&amp;submitSummary=" rel="nofollow" title="Add to&nbsp;Buzz"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/buzz.png" title="Add to&nbsp;Buzz" alt="Add to&nbsp;Buzz" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://gravityblast.com/2009/08/20/flex-functional-testing-with-funfx-and-cucumber/&amp;title=Flex+functional+testing+with+FunFx+and+Cucumber" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://gravityblast.com/2009/08/20/flex-functional-testing-with-funfx-and-cucumber/&amp;title=Flex+functional+testing+with+FunFx+and+Cucumber" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dzone.com/links/add.html?description=Flex+functional+testing+with+FunFx+and+Cucumber&amp;url=http://gravityblast.com/2009/08/20/flex-functional-testing-with-funfx-and-cucumber/&amp;title=Flex+functional+testing+with+FunFx+and+Cucumber" rel="nofollow" title="Add to&nbsp;DZone"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/dzone.png" title="Add to&nbsp;DZone" alt="Add to&nbsp;DZone" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http://gravityblast.com/2009/08/20/flex-functional-testing-with-funfx-and-cucumber/" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://gravityblast.com/2009/08/20/flex-functional-testing-with-funfx-and-cucumber/&amp;title=Flex+functional+testing+with+FunFx+and+Cucumber" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.netscape.com/submit/?U=http://gravityblast.com/2009/08/20/flex-functional-testing-with-funfx-and-cucumber/&amp;T=Flex+functional+testing+with+FunFx+and+Cucumber" rel="nofollow" title="Add to&nbsp;Netscape"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/netscape.png" title="Add to&nbsp;Netscape" alt="Add to&nbsp;Netscape" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://gravityblast.com/2009/08/20/flex-functional-testing-with-funfx-and-cucumber/&amp;title=Flex+functional+testing+with+FunFx+and+Cucumber" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://slashdot.org/bookmark.pl?url=http://gravityblast.com/2009/08/20/flex-functional-testing-with-funfx-and-cucumber/&amp;title=Flex+functional+testing+with+FunFx+and+Cucumber" rel="nofollow" title="Add to&nbsp;Slashdot"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/slashdot.png" title="Add to&nbsp;Slashdot" alt="Add to&nbsp;Slashdot" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit.php?url=http://gravityblast.com/2009/08/20/flex-functional-testing-with-funfx-and-cucumber/&amp;title=Flex+functional+testing+with+FunFx+and+Cucumber" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://gravityblast.com/2009/08/20/flex-functional-testing-with-funfx-and-cucumber/" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://tipd.com/submit.php?url=http://gravityblast.com/2009/08/20/flex-functional-testing-with-funfx-and-cucumber/" rel="nofollow" title="Add to&nbsp;Tip'd"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/tipd.png" title="Add to&nbsp;Tip'd" alt="Add to&nbsp;Tip'd" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+Flex+functional+testing+with+FunFx+and+Cucumber+@+http://gravityblast.com/2009/08/20/flex-functional-testing-with-funfx-and-cucumber/" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://gravityblast.com/2009/08/20/flex-functional-testing-with-funfx-and-cucumber/&amp;t=Flex+functional+testing+with+FunFx+and+Cucumber" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://gravityblast.com/2009/08/20/flex-functional-testing-with-funfx-and-cucumber/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Hostname middleware for rails apps on multiple servers</title>
		<link>http://gravityblast.com/2009/08/15/hostname-middleware-for-rails-apps-on-multiple-servers/</link>
		<comments>http://gravityblast.com/2009/08/15/hostname-middleware-for-rails-apps-on-multiple-servers/#comments</comments>
		<pubDate>Sat, 15 Aug 2009 22:37:36 +0000</pubDate>
		<dc:creator>Andrea Franz</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://gravityblast.com/?p=303</guid>
		<description><![CDATA[If you run a rails application on multiple servers behind a load balancer, almost every time you make a request you have a response from a different host. If you want to know which host has sent back the response, you can use a middleware that adds the hostname in the page title of each [...]]]></description>
			<content:encoded><![CDATA[<p>If you run a rails application on multiple servers behind a load balancer, almost every time you make a request you have a response from a different host. If you want to know which host has sent back the response, you can use a middleware that adds the hostname in the page title of each request.</p>
<p><strong>lib/hostname.rb</strong>:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> Hostname  
  TITLE_REGEXP = <span style="color:#006600; font-weight:bold;">/</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&lt;</span>title<span style="color:#006600; font-weight:bold;">&gt;</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#91;</span>^<span style="color:#006600; font-weight:bold;">&lt;</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">*</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&lt;</span>\<span style="color:#006600; font-weight:bold;">/</span>title<span style="color:#006600; font-weight:bold;">&gt;</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">/</span>i
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> initialize<span style="color:#006600; font-weight:bold;">&#40;</span>app, hostname=<span style="color:#996600;">&quot;&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#0066ff; font-weight:bold;">@app</span>          = app
    <span style="color:#0066ff; font-weight:bold;">@title_suffix</span> = <span style="color:#996600;">&quot; - on #{hostname}&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> call<span style="color:#006600; font-weight:bold;">&#40;</span>env<span style="color:#006600; font-weight:bold;">&#41;</span>
    status, headers, response = <span style="color:#0066ff; font-weight:bold;">@app</span>.<span style="color:#9900CC;">call</span><span style="color:#006600; font-weight:bold;">&#40;</span>env<span style="color:#006600; font-weight:bold;">&#41;</span>
    add_hostname<span style="color:#006600; font-weight:bold;">&#40;</span>response, headers<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">if</span> headers<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;Content-Type&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span> =~ <span style="color:#006600; font-weight:bold;">%</span>r<span style="color:#006600; font-weight:bold;">&#123;</span>text<span style="color:#006600; font-weight:bold;">/</span>html<span style="color:#006600; font-weight:bold;">&#125;</span>
    <span style="color:#006600; font-weight:bold;">&#91;</span>status, headers, response<span style="color:#006600; font-weight:bold;">&#93;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>  
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> add_hostname<span style="color:#006600; font-weight:bold;">&#40;</span>response, headers<span style="color:#006600; font-weight:bold;">&#41;</span>
    response.<span style="color:#9900CC;">each</span><span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">|</span>s<span style="color:#006600; font-weight:bold;">|</span> s.<span style="color:#CC0066; font-weight:bold;">sub!</span><span style="color:#006600; font-weight:bold;">&#40;</span>TITLE_REGEXP, <span style="color:#996600;">&quot;<span style="color:#000099;">\\</span>1<span style="color:#000099;">\\</span>2#{@title_suffix}<span style="color:#000099;">\\</span>3&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">if</span> s =~ TITLE_REGEXP<span style="color:#006600; font-weight:bold;">&#125;</span>
    headers<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;Content-Length&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span> = <span style="color:#006600; font-weight:bold;">&#40;</span>headers<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;Content-Length&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">to_i</span> <span style="color:#006600; font-weight:bold;">+</span> <span style="color:#0066ff; font-weight:bold;">@title_suffix</span>.<span style="color:#9900CC;">length</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">to_s</span>
    <span style="color:#0000FF; font-weight:bold;">nil</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>To use it, add this line in your <strong>environment.rb</strong>:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">config.<span style="color:#9900CC;">middleware</span>.<span style="color:#9900CC;">use</span> <span style="color:#996600;">&quot;Hostname&quot;</span>, <span style="color:#006600; font-weight:bold;">%</span>x<span style="color:#996600;">&quot;hostname&quot;</span>.<span style="color:#CC0066; font-weight:bold;">chomp</span></pre></div></div>

<p>When you don&#8217;t need it anymore you can simply remove the line above.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>share</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://buzz.yahoo.com/submit?submitUrl=http://gravityblast.com/2009/08/15/hostname-middleware-for-rails-apps-on-multiple-servers/&amp;submitHeadline=Hostname+middleware+for+rails+apps+on+multiple+servers&amp;submitSummary=" rel="nofollow" title="Add to&nbsp;Buzz"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/buzz.png" title="Add to&nbsp;Buzz" alt="Add to&nbsp;Buzz" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://gravityblast.com/2009/08/15/hostname-middleware-for-rails-apps-on-multiple-servers/&amp;title=Hostname+middleware+for+rails+apps+on+multiple+servers" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://gravityblast.com/2009/08/15/hostname-middleware-for-rails-apps-on-multiple-servers/&amp;title=Hostname+middleware+for+rails+apps+on+multiple+servers" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dzone.com/links/add.html?description=Hostname+middleware+for+rails+apps+on+multiple+servers&amp;url=http://gravityblast.com/2009/08/15/hostname-middleware-for-rails-apps-on-multiple-servers/&amp;title=Hostname+middleware+for+rails+apps+on+multiple+servers" rel="nofollow" title="Add to&nbsp;DZone"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/dzone.png" title="Add to&nbsp;DZone" alt="Add to&nbsp;DZone" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http://gravityblast.com/2009/08/15/hostname-middleware-for-rails-apps-on-multiple-servers/" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://gravityblast.com/2009/08/15/hostname-middleware-for-rails-apps-on-multiple-servers/&amp;title=Hostname+middleware+for+rails+apps+on+multiple+servers" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.netscape.com/submit/?U=http://gravityblast.com/2009/08/15/hostname-middleware-for-rails-apps-on-multiple-servers/&amp;T=Hostname+middleware+for+rails+apps+on+multiple+servers" rel="nofollow" title="Add to&nbsp;Netscape"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/netscape.png" title="Add to&nbsp;Netscape" alt="Add to&nbsp;Netscape" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://gravityblast.com/2009/08/15/hostname-middleware-for-rails-apps-on-multiple-servers/&amp;title=Hostname+middleware+for+rails+apps+on+multiple+servers" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://slashdot.org/bookmark.pl?url=http://gravityblast.com/2009/08/15/hostname-middleware-for-rails-apps-on-multiple-servers/&amp;title=Hostname+middleware+for+rails+apps+on+multiple+servers" rel="nofollow" title="Add to&nbsp;Slashdot"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/slashdot.png" title="Add to&nbsp;Slashdot" alt="Add to&nbsp;Slashdot" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit.php?url=http://gravityblast.com/2009/08/15/hostname-middleware-for-rails-apps-on-multiple-servers/&amp;title=Hostname+middleware+for+rails+apps+on+multiple+servers" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://gravityblast.com/2009/08/15/hostname-middleware-for-rails-apps-on-multiple-servers/" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://tipd.com/submit.php?url=http://gravityblast.com/2009/08/15/hostname-middleware-for-rails-apps-on-multiple-servers/" rel="nofollow" title="Add to&nbsp;Tip'd"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/tipd.png" title="Add to&nbsp;Tip'd" alt="Add to&nbsp;Tip'd" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+Hostname+middleware+for+rails+apps+on+multiple+servers+@+http://gravityblast.com/2009/08/15/hostname-middleware-for-rails-apps-on-multiple-servers/" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://gravityblast.com/2009/08/15/hostname-middleware-for-rails-apps-on-multiple-servers/&amp;t=Hostname+middleware+for+rails+apps+on+multiple+servers" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://gravityblast.com/2009/08/15/hostname-middleware-for-rails-apps-on-multiple-servers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Testing rails generators with Cucumber</title>
		<link>http://gravityblast.com/2009/08/11/testing-rails-generators-with-cucumber/</link>
		<comments>http://gravityblast.com/2009/08/11/testing-rails-generators-with-cucumber/#comments</comments>
		<pubDate>Tue, 11 Aug 2009 13:43:59 +0000</pubDate>
		<dc:creator>Andrea Franz</dc:creator>
				<category><![CDATA[Cucumber]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Testing]]></category>

		<guid isPermaLink="false">http://gravityblast.com/?p=282</guid>
		<description><![CDATA[In the last days I switched a lot of old projects to use Cucumber, then I started writing test for Web App Theme. Here I haven&#8217;t models or controllers to test, because it&#8217;s just a generator, but I found enjoyable the use of plain text features to describe the ThemeGenerator behavior:

Feature: Layout generation
  In [...]]]></description>
			<content:encoded><![CDATA[<p>In the last days I switched a lot of old projects to use <a href="http://cukes.info/" title="Cucumber">Cucumber</a>, then I started writing test for <a href="http://github.com/pilu/web-app-theme" title="Web App Theme">Web App Theme</a>. Here I haven&#8217;t models or controllers to test, because it&#8217;s just a generator, but I found enjoyable the use of plain text features to describe the <strong>ThemeGenerator</strong> behavior:</p>

<div class="wp_syntax"><div class="code"><pre class="cucumber" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">Feature</span>: Layout generation
  <span style="color:#9966CC; font-weight:bold;">In order</span> to create a great application
  I should be able to generate a layout with Web App Theme
&nbsp;
  <span style="color:#008000; font-style:italic;"># script/generate theme</span>
  <span style="color:#9966CC; font-weight:bold;">Scenario</span>: Generate a layout    
    <span style="color:#9966CC; font-weight:bold;">Given</span> I have a new rails app
    <span style="color:#9966CC; font-weight:bold;">And</span> I have no layouts
    <span style="color:#9966CC; font-weight:bold;">And</span> I have no stylesheets
    <span style="color:#9966CC; font-weight:bold;">When</span> I generate a theme
    <span style="color:#9966CC; font-weight:bold;">Then</span> I should have a layout named <span style="color:#996600;">&quot;application.html.erb&quot;</span>
    <span style="color:#9966CC; font-weight:bold;">And</span> I should have a stylesheet named <span style="color:#996600;">&quot;web_app_theme.css&quot;</span>
    <span style="color:#9966CC; font-weight:bold;">And</span> I should have a stylesheet named <span style="color:#996600;">&quot;web_app_theme_override.css&quot;</span>
    <span style="color:#9966CC; font-weight:bold;">And</span> I should have a stylesheet named <span style="color:#996600;">&quot;themes/default/style.css&quot;</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># script/generate theme admin</span>
  <span style="color:#9966CC; font-weight:bold;">Scenario</span>: Generate a layout with a name
    <span style="color:#9966CC; font-weight:bold;">Given</span> I have a new rails app
    <span style="color:#9966CC; font-weight:bold;">And</span> I have no layouts
    <span style="color:#9966CC; font-weight:bold;">And</span> I generate a theme with name <span style="color:#996600;">&quot;admin&quot;</span>
    <span style="color:#9966CC; font-weight:bold;">Then</span> I should have a layout named <span style="color:#996600;">&quot;admin.html.erb&quot;</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># script/generate theme --theme=&quot;drastic-dark&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">Scenario</span>: Generate a layout choosing a theme
    <span style="color:#9966CC; font-weight:bold;">Given</span> I have a new rails app
    <span style="color:#9966CC; font-weight:bold;">And</span> I have no stylesheets
    <span style="color:#9966CC; font-weight:bold;">And</span> I generate a theme choosing the <span style="color:#996600;">&quot;drastic-dark&quot;</span> theme
    <span style="color:#9966CC; font-weight:bold;">Then</span> I should have a stylesheet named <span style="color:#996600;">&quot;themes/drastic-dark/style.css&quot;</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># script/generate theme --theme=bec --no_layout</span>
  <span style="color:#9966CC; font-weight:bold;">Scenario</span>: Generate only stylesheets without layout
    <span style="color:#9966CC; font-weight:bold;">Given</span> I have a new rails app
    <span style="color:#9966CC; font-weight:bold;">And</span> I have no layouts
    <span style="color:#9966CC; font-weight:bold;">And</span> I generate a theme without layout choosing the <span style="color:#996600;">&quot;bec&quot;</span> theme
    <span style="color:#9966CC; font-weight:bold;">Then</span> I should have a stylesheet named <span style="color:#996600;">&quot;themes/bec/style.css&quot;</span>
    <span style="color:#9966CC; font-weight:bold;">But</span> I should not have any layouts
&nbsp;
  <span style="color:#008000; font-style:italic;"># script/generate theme --app_name=&quot;My New Application&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">Scenario</span>: Generate layout with application name
    <span style="color:#9966CC; font-weight:bold;">Given</span> I have a new rails app
    <span style="color:#9966CC; font-weight:bold;">And</span> I have no layouts
    <span style="color:#9966CC; font-weight:bold;">And</span> I generate a theme with application name <span style="color:#996600;">&quot;My New Application&quot;</span>
    <span style="color:#9966CC; font-weight:bold;">Then</span> the layout <span style="color:#996600;">&quot;application.html.erb&quot;</span> should have <span style="color:#996600;">&quot;My New Application&quot;</span> as page title
&nbsp;
  <span style="color:#008000; font-style:italic;"># script/generate theme --type=sign</span>
  <span style="color:#9966CC; font-weight:bold;">Scenario</span>: Generate layout for signin <span style="color:#9966CC; font-weight:bold;">and</span> signup
    <span style="color:#9966CC; font-weight:bold;">Given</span> I have a new rails app
    <span style="color:#9966CC; font-weight:bold;">And</span> I have no layouts
    <span style="color:#9966CC; font-weight:bold;">And</span> I generate a theme for signin <span style="color:#9966CC; font-weight:bold;">and</span> signup
    <span style="color:#9966CC; font-weight:bold;">Then</span> I should have a layout named <span style="color:#996600;">&quot;sign.html.erb&quot;</span>
    <span style="color:#9966CC; font-weight:bold;">And</span> I should have a layout named <span style="color:#996600;">&quot;sign.html.erb&quot;</span> with just a box</pre></div></div>

<p>Here my steps:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">Given <span style="color:#006600; font-weight:bold;">/</span>^I have a new rails app$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  generate_rails_app
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
Given <span style="color:#006600; font-weight:bold;">/</span>^I have no layouts$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  remove_layouts  
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
Given <span style="color:#006600; font-weight:bold;">/</span>^I have no stylesheets$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  remove_stylesheets
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
Given <span style="color:#006600; font-weight:bold;">/</span>^I generate a theme$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  generate_layout<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:theme</span><span style="color:#006600; font-weight:bold;">&#41;</span>  
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
Given <span style="color:#006600; font-weight:bold;">/</span>^I generate a theme with name <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span>$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>name<span style="color:#006600; font-weight:bold;">|</span>
  generate_layout<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:theme</span>, name<span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
Given <span style="color:#006600; font-weight:bold;">/</span>^I generate a theme choosing the <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span> theme$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>theme_name<span style="color:#006600; font-weight:bold;">|</span>
  generate_layout<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:theme</span>, <span style="color:#ff3333; font-weight:bold;">:theme</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> theme_name<span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">Then</span> <span style="color:#006600; font-weight:bold;">/</span>^I should have a layout named <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span>$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>filename<span style="color:#006600; font-weight:bold;">|</span>
  layout_exists?<span style="color:#006600; font-weight:bold;">&#40;</span>filename<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">should</span> be_true  
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">Then</span> <span style="color:#006600; font-weight:bold;">/</span>^I should have a stylesheet named <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span>$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>filename<span style="color:#006600; font-weight:bold;">|</span>
  stylesheet_exists?<span style="color:#006600; font-weight:bold;">&#40;</span>filename<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">should</span> be_true    
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
Given <span style="color:#006600; font-weight:bold;">/</span>^I generate a theme without layout choosing the <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span> theme$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>theme_name<span style="color:#006600; font-weight:bold;">|</span>
  generate_layout<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:theme</span>, <span style="color:#ff3333; font-weight:bold;">:theme</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> theme_name, <span style="color:#ff3333; font-weight:bold;">:no_layout</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">true</span> <span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">Then</span> <span style="color:#006600; font-weight:bold;">/</span>^I should <span style="color:#9966CC; font-weight:bold;">not</span> have any layouts$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  layouts_count.<span style="color:#9900CC;">should</span> == <span style="color:#006666;">0</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
Given <span style="color:#006600; font-weight:bold;">/</span>^I generate a theme with application name <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span>$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>name<span style="color:#006600; font-weight:bold;">|</span>
  generate_layout<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:theme</span>, <span style="color:#ff3333; font-weight:bold;">:app_name</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> name <span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">Then</span> <span style="color:#006600; font-weight:bold;">/</span>^the layout <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span> should have <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span> as page title$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>layout, title<span style="color:#006600; font-weight:bold;">|</span>
  layout_title<span style="color:#006600; font-weight:bold;">&#40;</span>layout<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">should</span> == title
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
Given <span style="color:#006600; font-weight:bold;">/</span>^I generate a theme <span style="color:#9966CC; font-weight:bold;">for</span> signin <span style="color:#9966CC; font-weight:bold;">and</span> signup$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  generate_layout<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:theme</span>, <span style="color:#ff3333; font-weight:bold;">:layout_type</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:sign</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">Then</span> <span style="color:#006600; font-weight:bold;">/</span>^I should have a layout named <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span> with just a box$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>layout<span style="color:#006600; font-weight:bold;">|</span>
  layout_with_box?<span style="color:#006600; font-weight:bold;">&#40;</span>layout<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">should</span> be_true
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Basically I create a temp folder that I use as fake rails root, and there I launch the generator.  After each feature I remove that folder.</p>
<p>And here my <strong>env.rb</strong></p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">$:.<span style="color:#9900CC;">unshift</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">dirname</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF; font-weight:bold;">__FILE__</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">+</span> <span style="color:#996600;">&quot;/../../rails_generators&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">&quot;rubygems&quot;</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">&quot;rails_generator&quot;</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'rails_generator/scripts/generate'</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">&quot;fileutils&quot;</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">&quot;theme/theme_generator&quot;</span>
&nbsp;
web_app_theme_root  = <span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">dirname</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF; font-weight:bold;">__FILE__</span><span style="color:#006600; font-weight:bold;">&#41;</span>, <span style="color:#996600;">&quot;/../../&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
tmp_rails_app_name  = <span style="color:#996600;">&quot;tmp_rails_app&quot;</span>
tmp_rails_app_root  = <span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span>web_app_theme_root, tmp_rails_app_name<span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
<span style="color:#6666ff; font-weight:bold;">Rails::<span style="color:#CC00FF; font-weight:bold;">Generator</span>::Base</span>.<span style="color:#9900CC;">append_sources</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#6666ff; font-weight:bold;">Rails::<span style="color:#CC00FF; font-weight:bold;">Generator</span>::PathSource</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:plugin</span>, <span style="color:#996600;">&quot;#{web_app_theme_root}/rails_generators/&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">module</span> GeneratorHelpers
  <span style="color:#9966CC; font-weight:bold;">def</span> generate_rails_app
    <span style="color:#CC00FF; font-weight:bold;">FileUtils</span>.<span style="color:#9900CC;">mkdir</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span>@app_root<span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>    
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> remove_layouts
    <span style="color:#CC00FF; font-weight:bold;">FileUtils</span>.<span style="color:#9900CC;">rm_rf</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span>@app_root, <span style="color:#996600;">&quot;app&quot;</span>, <span style="color:#996600;">&quot;views&quot;</span>, <span style="color:#996600;">&quot;layouts&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> remove_stylesheets
    <span style="color:#CC00FF; font-weight:bold;">FileUtils</span>.<span style="color:#9900CC;">rm_rf</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span>@app_root, <span style="color:#996600;">&quot;public&quot;</span>, <span style="color:#996600;">&quot;stylesheets&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> generate_layout<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">*</span>args<span style="color:#006600; font-weight:bold;">&#41;</span>
    options = !args.<span style="color:#9900CC;">empty</span>? <span style="color:#006600; font-weight:bold;">&amp;&amp;</span> args.<span style="color:#9900CC;">last</span>.<span style="color:#9900CC;">is_a</span>?<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC00FF; font-weight:bold;">Hash</span><span style="color:#006600; font-weight:bold;">&#41;</span> ? args.<span style="color:#9900CC;">pop</span> : <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">&#125;</span>
    options.<span style="color:#9900CC;">merge</span>!<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#123;</span>:destination <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0066ff; font-weight:bold;">@app_root</span>, <span style="color:#ff3333; font-weight:bold;">:quiet</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">true</span><span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#41;</span>    
    <span style="color:#6666ff; font-weight:bold;">Rails::<span style="color:#CC00FF; font-weight:bold;">Generator</span>::Scripts::Generate</span>.<span style="color:#9900CC;">new</span>.<span style="color:#9900CC;">run</span><span style="color:#006600; font-weight:bold;">&#40;</span>args, options<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> layouts_count
    <span style="color:#CC00FF; font-weight:bold;">Dir</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span>@app_root, <span style="color:#996600;">&quot;app&quot;</span>, <span style="color:#996600;">&quot;views&quot;</span>, <span style="color:#996600;">&quot;layouts&quot;</span>, <span style="color:#996600;">&quot;**&quot;</span>, <span style="color:#996600;">&quot;*.erb&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">size</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> layout_exists?<span style="color:#006600; font-weight:bold;">&#40;</span>filename<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">exists</span>?<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span>@app_root, <span style="color:#996600;">&quot;app&quot;</span>, <span style="color:#996600;">&quot;views&quot;</span>, <span style="color:#996600;">&quot;layouts&quot;</span>, filename<span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> stylesheet_exists?<span style="color:#006600; font-weight:bold;">&#40;</span>relative_path<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">exists</span>?<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span>@app_root, <span style="color:#996600;">&quot;public&quot;</span>, <span style="color:#996600;">&quot;stylesheets&quot;</span>, relative_path<span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">should</span> be_true
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> layout_title<span style="color:#006600; font-weight:bold;">&#40;</span>layout<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#CC0066; font-weight:bold;">open</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span>@app_root, <span style="color:#996600;">&quot;app&quot;</span>, <span style="color:#996600;">&quot;views&quot;</span>, <span style="color:#996600;">&quot;layouts&quot;</span>, layout<span style="color:#006600; font-weight:bold;">&#41;</span>, <span style="color:#996600;">&quot;r&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">read</span>.<span style="color:#9900CC;">match</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">/&lt;</span>title<span style="color:#006600; font-weight:bold;">&gt;</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#91;</span>^<span style="color:#006600; font-weight:bold;">&lt;</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">*</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&lt;</span>\<span style="color:#006600; font-weight:bold;">/</span>title<span style="color:#006600; font-weight:bold;">&gt;/</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#93;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> layout_with_box?<span style="color:#006600; font-weight:bold;">&#40;</span>layout<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#CC0066; font-weight:bold;">open</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span>@app_root, <span style="color:#996600;">&quot;app&quot;</span>, <span style="color:#996600;">&quot;views&quot;</span>, <span style="color:#996600;">&quot;layouts&quot;</span>, layout<span style="color:#006600; font-weight:bold;">&#41;</span>, <span style="color:#996600;">&quot;r&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">read</span> =~ <span style="color:#006600; font-weight:bold;">%</span>r<span style="color:#006600; font-weight:bold;">|&lt;</span>div id=<span style="color:#996600;">&quot;box&quot;</span><span style="color:#006600; font-weight:bold;">&gt;|</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
Before <span style="color:#9966CC; font-weight:bold;">do</span>
  <span style="color:#0066ff; font-weight:bold;">@app_root</span> = tmp_rails_app_root  
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
After <span style="color:#9966CC; font-weight:bold;">do</span>
  <span style="color:#CC00FF; font-weight:bold;">FileUtils</span>.<span style="color:#9900CC;">rm_rf</span><span style="color:#006600; font-weight:bold;">&#40;</span>tmp_rails_app_root<span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
World<span style="color:#006600; font-weight:bold;">&#40;</span>GeneratorHelpers<span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>share</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://buzz.yahoo.com/submit?submitUrl=http://gravityblast.com/2009/08/11/testing-rails-generators-with-cucumber/&amp;submitHeadline=Testing+rails+generators+with+Cucumber&amp;submitSummary=" rel="nofollow" title="Add to&nbsp;Buzz"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/buzz.png" title="Add to&nbsp;Buzz" alt="Add to&nbsp;Buzz" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://gravityblast.com/2009/08/11/testing-rails-generators-with-cucumber/&amp;title=Testing+rails+generators+with+Cucumber" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://gravityblast.com/2009/08/11/testing-rails-generators-with-cucumber/&amp;title=Testing+rails+generators+with+Cucumber" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dzone.com/links/add.html?description=Testing+rails+generators+with+Cucumber&amp;url=http://gravityblast.com/2009/08/11/testing-rails-generators-with-cucumber/&amp;title=Testing+rails+generators+with+Cucumber" rel="nofollow" title="Add to&nbsp;DZone"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/dzone.png" title="Add to&nbsp;DZone" alt="Add to&nbsp;DZone" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http://gravityblast.com/2009/08/11/testing-rails-generators-with-cucumber/" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://gravityblast.com/2009/08/11/testing-rails-generators-with-cucumber/&amp;title=Testing+rails+generators+with+Cucumber" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.netscape.com/submit/?U=http://gravityblast.com/2009/08/11/testing-rails-generators-with-cucumber/&amp;T=Testing+rails+generators+with+Cucumber" rel="nofollow" title="Add to&nbsp;Netscape"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/netscape.png" title="Add to&nbsp;Netscape" alt="Add to&nbsp;Netscape" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://gravityblast.com/2009/08/11/testing-rails-generators-with-cucumber/&amp;title=Testing+rails+generators+with+Cucumber" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://slashdot.org/bookmark.pl?url=http://gravityblast.com/2009/08/11/testing-rails-generators-with-cucumber/&amp;title=Testing+rails+generators+with+Cucumber" rel="nofollow" title="Add to&nbsp;Slashdot"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/slashdot.png" title="Add to&nbsp;Slashdot" alt="Add to&nbsp;Slashdot" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit.php?url=http://gravityblast.com/2009/08/11/testing-rails-generators-with-cucumber/&amp;title=Testing+rails+generators+with+Cucumber" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://gravityblast.com/2009/08/11/testing-rails-generators-with-cucumber/" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://tipd.com/submit.php?url=http://gravityblast.com/2009/08/11/testing-rails-generators-with-cucumber/" rel="nofollow" title="Add to&nbsp;Tip'd"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/tipd.png" title="Add to&nbsp;Tip'd" alt="Add to&nbsp;Tip'd" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+Testing+rails+generators+with+Cucumber+@+http://gravityblast.com/2009/08/11/testing-rails-generators-with-cucumber/" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://gravityblast.com/2009/08/11/testing-rails-generators-with-cucumber/&amp;t=Testing+rails+generators+with+Cucumber" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://gravityblast.com/2009/08/11/testing-rails-generators-with-cucumber/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>2 minutes admin layout with rails and the web-app-theme generator</title>
		<link>http://gravityblast.com/2009/07/30/2-minutes-admin-layout-with-rails-and-the-web-app-theme-generator/</link>
		<comments>http://gravityblast.com/2009/07/30/2-minutes-admin-layout-with-rails-and-the-web-app-theme-generator/#comments</comments>
		<pubDate>Thu, 30 Jul 2009 14:02:19 +0000</pubDate>
		<dc:creator>Andrea Franz</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://gravityblast.com/?p=257</guid>
		<description><![CDATA[
Many people found out a rails generator inside my web-app-theme project and asked me how to use it.
Here an example, starting from scratch with a new rails app that manages music Albums.


rails cool_albums
cd cool_albums
script/generate scaffold Album name:string artist:string date:date
rake db:migrate

After creating the first controller with a scaffold or with your hands, start creating a theme:

script/plugin [...]]]></description>
			<content:encoded><![CDATA[<p>
Many people found out a rails generator inside my <a href="http://github.com/pilu/web-app-theme">web-app-theme</a> project and asked me how to use it.<br />
Here an example, starting from scratch with a new rails app that manages music Albums.
</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">rails cool_albums
<span style="color: #7a0874; font-weight: bold;">cd</span> cool_albums
script<span style="color: #000000; font-weight: bold;">/</span>generate scaffold Album name:string artist:string <span style="color: #c20cb9; font-weight: bold;">date</span>:<span style="color: #c20cb9; font-weight: bold;">date</span>
rake db:migrate</pre></div></div>

<p>After creating the first controller with a scaffold or with your hands, start creating a theme:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">script<span style="color: #000000; font-weight: bold;">/</span>plugin <span style="color: #c20cb9; font-weight: bold;">install</span> git:<span style="color: #000000; font-weight: bold;">//</span>github.com<span style="color: #000000; font-weight: bold;">/</span>pilu<span style="color: #000000; font-weight: bold;">/</span>web-app-theme.git
script<span style="color: #000000; font-weight: bold;">/</span>generate theme application --app_name=<span style="color: #ff0000;">&quot;My Cool Albums&quot;</span> <span style="color: #660033;">--theme</span>=<span style="color: #ff0000;">&quot;drastic-dark&quot;</span></pre></div></div>

<p>The first argument (&#8220;application&#8221;) is the name of the layout that the generator will create (application.html.erb).<br />
The <strong>&#8211;app_name</strong> option specifies the name used as page title, and with the <strong>&#8211;theme</strong> specifies which theme to use among all the <a href="http://pilu.github.com/web-app-theme/" title="Web App Theme Demo">available themes</a> inside the plugin.
</p>
<p>Now remove the default index.html created by rails and the layout created by the scaffold:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">rm</span> app<span style="color: #000000; font-weight: bold;">/</span>views<span style="color: #000000; font-weight: bold;">/</span>layouts<span style="color: #000000; font-weight: bold;">/</span>albums.html.erb 
<span style="color: #c20cb9; font-weight: bold;">rm</span> public<span style="color: #000000; font-weight: bold;">/</span>index.html</pre></div></div>

<p>Add the following line in your <strong>routes.rb</strong> to set the default page of the application:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">map.root :controller =<span style="color: #000000; font-weight: bold;">&gt;</span> :albums</pre></div></div>

<p>Start the server</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">script<span style="color: #000000; font-weight: bold;">/</span>server</pre></div></div>

<p><img src="/wp-content/uploads/2009/07/web-app-theme-example-1.jpg" /></p>
<p>Ok, the layout has been successfully created, but we need to apply a theme for each one of the views generated by the scaffold.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">script<span style="color: #000000; font-weight: bold;">/</span>generate themed albums album <span style="color: #660033;">--layout</span>=application --with_will_paginate</pre></div></div>

<p>
With the first 2 arguments I specified the controller path (albums) and the model used (album).<br />
The <strong>&#8211;layout</strong> options is used by the <strong>themed</strong> generator to know where to add the <strong>Albums</strong> menu link.
</p>
<p>
Since we want to use will paginate (we set the <strong>&#8211;with_will_paginate</strong> option), we need to change one line in our albums controller from:
</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#0066ff; font-weight:bold;">@albums</span> = Album.<span style="color:#9900CC;">all</span></pre></div></div>

<p>to:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#0066ff; font-weight:bold;">@albums</span> = Album.<span style="color:#9900CC;">paginate</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:per_page</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006666;">10</span>, <span style="color:#ff3333; font-weight:bold;">:page</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> params<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:page</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<p>Here a trick to show form error messages inside the auto generated forms, you can add the following lines in your <strong>environment.rb</strong>:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#6666ff; font-weight:bold;">ActionView::Base</span>.<span style="color:#9900CC;">field_error_proc</span> = <span style="color:#CC0066; font-weight:bold;">Proc</span>.<span style="color:#9900CC;">new</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>html_tag, instance<span style="color:#006600; font-weight:bold;">|</span> 
  <span style="color:#9966CC; font-weight:bold;">if</span> html_tag =~ <span style="color:#006600; font-weight:bold;">/&lt;</span>label<span style="color:#006600; font-weight:bold;">/</span>
    <span style="color:#006600; font-weight:bold;">%|&lt;</span>div <span style="color:#9966CC; font-weight:bold;">class</span>=<span style="color:#996600;">&quot;fieldWithErrors&quot;</span><span style="color:#006600; font-weight:bold;">&gt;</span><span style="color:#008000; font-style:italic;">#{html_tag} &lt;span class=&quot;error&quot;&gt;#{[instance.error_message].join(', ')}&lt;/span&gt;&lt;/div&gt;|</span>
  <span style="color:#9966CC; font-weight:bold;">else</span>
    html_tag
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Ok, restart your server and you are done.</p>
<p><img src="/wp-content/uploads/2009/07/web-app-theme-example-2.jpg" /></p>
<p>Feel free to fork the project from <a href="http://github.com/pilu/web-app-theme/tree/master">github</a> to improve the generator or to add a new theme.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>share</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://buzz.yahoo.com/submit?submitUrl=http://gravityblast.com/2009/07/30/2-minutes-admin-layout-with-rails-and-the-web-app-theme-generator/&amp;submitHeadline=2+minutes+admin+layout+with+rails+and+the+web-app-theme+generator&amp;submitSummary=" rel="nofollow" title="Add to&nbsp;Buzz"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/buzz.png" title="Add to&nbsp;Buzz" alt="Add to&nbsp;Buzz" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://gravityblast.com/2009/07/30/2-minutes-admin-layout-with-rails-and-the-web-app-theme-generator/&amp;title=2+minutes+admin+layout+with+rails+and+the+web-app-theme+generator" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://gravityblast.com/2009/07/30/2-minutes-admin-layout-with-rails-and-the-web-app-theme-generator/&amp;title=2+minutes+admin+layout+with+rails+and+the+web-app-theme+generator" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dzone.com/links/add.html?description=2+minutes+admin+layout+with+rails+and+the+web-app-theme+generator&amp;url=http://gravityblast.com/2009/07/30/2-minutes-admin-layout-with-rails-and-the-web-app-theme-generator/&amp;title=2+minutes+admin+layout+with+rails+and+the+web-app-theme+generator" rel="nofollow" title="Add to&nbsp;DZone"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/dzone.png" title="Add to&nbsp;DZone" alt="Add to&nbsp;DZone" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http://gravityblast.com/2009/07/30/2-minutes-admin-layout-with-rails-and-the-web-app-theme-generator/" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://gravityblast.com/2009/07/30/2-minutes-admin-layout-with-rails-and-the-web-app-theme-generator/&amp;title=2+minutes+admin+layout+with+rails+and+the+web-app-theme+generator" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.netscape.com/submit/?U=http://gravityblast.com/2009/07/30/2-minutes-admin-layout-with-rails-and-the-web-app-theme-generator/&amp;T=2+minutes+admin+layout+with+rails+and+the+web-app-theme+generator" rel="nofollow" title="Add to&nbsp;Netscape"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/netscape.png" title="Add to&nbsp;Netscape" alt="Add to&nbsp;Netscape" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://gravityblast.com/2009/07/30/2-minutes-admin-layout-with-rails-and-the-web-app-theme-generator/&amp;title=2+minutes+admin+layout+with+rails+and+the+web-app-theme+generator" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://slashdot.org/bookmark.pl?url=http://gravityblast.com/2009/07/30/2-minutes-admin-layout-with-rails-and-the-web-app-theme-generator/&amp;title=2+minutes+admin+layout+with+rails+and+the+web-app-theme+generator" rel="nofollow" title="Add to&nbsp;Slashdot"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/slashdot.png" title="Add to&nbsp;Slashdot" alt="Add to&nbsp;Slashdot" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit.php?url=http://gravityblast.com/2009/07/30/2-minutes-admin-layout-with-rails-and-the-web-app-theme-generator/&amp;title=2+minutes+admin+layout+with+rails+and+the+web-app-theme+generator" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://gravityblast.com/2009/07/30/2-minutes-admin-layout-with-rails-and-the-web-app-theme-generator/" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://tipd.com/submit.php?url=http://gravityblast.com/2009/07/30/2-minutes-admin-layout-with-rails-and-the-web-app-theme-generator/" rel="nofollow" title="Add to&nbsp;Tip'd"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/tipd.png" title="Add to&nbsp;Tip'd" alt="Add to&nbsp;Tip'd" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+2+minutes+admin+layout+with+rails+and+the+web-app-theme+generator+@+http://gravityblast.com/2009/07/30/2-minutes-admin-layout-with-rails-and-the-web-app-theme-generator/" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://gravityblast.com/2009/07/30/2-minutes-admin-layout-with-rails-and-the-web-app-theme-generator/&amp;t=2+minutes+admin+layout+with+rails+and+the+web-app-theme+generator" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://gravityblast.com/2009/07/30/2-minutes-admin-layout-with-rails-and-the-web-app-theme-generator/feed/</wfw:commentRss>
		<slash:comments>23</slash:comments>
		</item>
		<item>
		<title>Terror the micro aggregator</title>
		<link>http://gravityblast.com/2009/03/17/terror-the-micro-aggregator/</link>
		<comments>http://gravityblast.com/2009/03/17/terror-the-micro-aggregator/#comments</comments>
		<pubDate>Tue, 17 Mar 2009 15:55:54 +0000</pubDate>
		<dc:creator>Andrea Franz</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Sinatra]]></category>

		<guid isPermaLink="false">http://gravityblast.com/?p=120</guid>
		<description><![CDATA[Terror is a micro feed aggregator made with sinatra and bundled as a gem. It&#8217;s very simple to use, just install the gem:

gem sources -a http://gems.github.com
sudo gem install pilu-terror

Create a new project
terror new_aggregator_name
cd new_aggregator_name 
Start the server
thin start -C config/thin.yml
Run the feeds fetcher
rake feeds:fetch # run it as a cron job
You can browse the source [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://github.com/pilu/terror/tree/master" title="Terror the micro feed aggregator">Terror</a> is a micro feed aggregator made with <a href="http://www.sinatrarb.com/" title="Sinatra">sinatra</a> and bundled as a gem. It&#8217;s very simple to use, just install the gem:
</p>
<pre><code>gem sources -a http://gems.github.com
sudo gem install pilu-terror
</code></pre>
<p>Create a new project</p>
<pre><code>terror new_aggregator_name
cd new_aggregator_name </code></pre>
<p>Start the server</p>
<pre><code>thin start -C config/thin.yml</code></pre>
<p>Run the feeds fetcher</p>
<pre><code>rake feeds:fetch # run it as a cron job</code></pre>
<p>You can browse the source and fork it on <a href="http://github.com/pilu/terror/tree/master" title="Terror the micro feed aggregator">github</a>.
</p>
<p>
<img src="http://gravityblast.com/wp-content/uploads/2009/03/terror.jpg" alt="" title="terror" width="500" height="591" class="alignnone size-full wp-image-123" /></p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>share</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://buzz.yahoo.com/submit?submitUrl=http://gravityblast.com/2009/03/17/terror-the-micro-aggregator/&amp;submitHeadline=Terror+the+micro+aggregator&amp;submitSummary=" rel="nofollow" title="Add to&nbsp;Buzz"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/buzz.png" title="Add to&nbsp;Buzz" alt="Add to&nbsp;Buzz" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://gravityblast.com/2009/03/17/terror-the-micro-aggregator/&amp;title=Terror+the+micro+aggregator" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://gravityblast.com/2009/03/17/terror-the-micro-aggregator/&amp;title=Terror+the+micro+aggregator" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dzone.com/links/add.html?description=Terror+the+micro+aggregator&amp;url=http://gravityblast.com/2009/03/17/terror-the-micro-aggregator/&amp;title=Terror+the+micro+aggregator" rel="nofollow" title="Add to&nbsp;DZone"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/dzone.png" title="Add to&nbsp;DZone" alt="Add to&nbsp;DZone" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http://gravityblast.com/2009/03/17/terror-the-micro-aggregator/" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://gravityblast.com/2009/03/17/terror-the-micro-aggregator/&amp;title=Terror+the+micro+aggregator" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.netscape.com/submit/?U=http://gravityblast.com/2009/03/17/terror-the-micro-aggregator/&amp;T=Terror+the+micro+aggregator" rel="nofollow" title="Add to&nbsp;Netscape"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/netscape.png" title="Add to&nbsp;Netscape" alt="Add to&nbsp;Netscape" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://gravityblast.com/2009/03/17/terror-the-micro-aggregator/&amp;title=Terror+the+micro+aggregator" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://slashdot.org/bookmark.pl?url=http://gravityblast.com/2009/03/17/terror-the-micro-aggregator/&amp;title=Terror+the+micro+aggregator" rel="nofollow" title="Add to&nbsp;Slashdot"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/slashdot.png" title="Add to&nbsp;Slashdot" alt="Add to&nbsp;Slashdot" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit.php?url=http://gravityblast.com/2009/03/17/terror-the-micro-aggregator/&amp;title=Terror+the+micro+aggregator" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://gravityblast.com/2009/03/17/terror-the-micro-aggregator/" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://tipd.com/submit.php?url=http://gravityblast.com/2009/03/17/terror-the-micro-aggregator/" rel="nofollow" title="Add to&nbsp;Tip'd"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/tipd.png" title="Add to&nbsp;Tip'd" alt="Add to&nbsp;Tip'd" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+Terror+the+micro+aggregator+@+http://gravityblast.com/2009/03/17/terror-the-micro-aggregator/" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://gravityblast.com/2009/03/17/terror-the-micro-aggregator/&amp;t=Terror+the+micro+aggregator" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://gravityblast.com/2009/03/17/terror-the-micro-aggregator/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Radiant Gallery on Dreamhost with Ruby 1.8.7</title>
		<link>http://gravityblast.com/2009/01/15/radiant-gallery-on-dreamhost-with-ruby-187/</link>
		<comments>http://gravityblast.com/2009/01/15/radiant-gallery-on-dreamhost-with-ruby-187/#comments</comments>
		<pubDate>Thu, 15 Jan 2009 15:49:11 +0000</pubDate>
		<dc:creator>Andrea Franz</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Gor]]></category>
		<category><![CDATA[Radiant]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[dreamhost]]></category>
		<category><![CDATA[gallery]]></category>

		<guid isPermaLink="false">http://gravityblast.com/?p=80</guid>
		<description><![CDATA[Some people in the past had problems using the Gallery extension on Dreamhost. I didn&#8217;t try Dreamhost but someone from the Radiant list solved that problem following these instructions. Check it out if you are on Dreamhost too.


share





















]]></description>
			<content:encoded><![CDATA[<p>Some people in the past had problems using the <a href="http://github.com/pilu/radiant-gallery/tree/master">Gallery extension</a> on <a href="http://www.dreamhost.com/">Dreamhost</a>. I didn&#8217;t try Dreamhost but someone from the Radiant list solved that problem following <a href="http://www.dreamhoststatus.com/2009/01/02/ruby-187-upgrades/#comments">these instructions</a>. Check it out if you are on Dreamhost too.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>share</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://buzz.yahoo.com/submit?submitUrl=http://gravityblast.com/2009/01/15/radiant-gallery-on-dreamhost-with-ruby-187/&amp;submitHeadline=Radiant+Gallery+on+Dreamhost+with+Ruby+1.8.7&amp;submitSummary=" rel="nofollow" title="Add to&nbsp;Buzz"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/buzz.png" title="Add to&nbsp;Buzz" alt="Add to&nbsp;Buzz" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://gravityblast.com/2009/01/15/radiant-gallery-on-dreamhost-with-ruby-187/&amp;title=Radiant+Gallery+on+Dreamhost+with+Ruby+1.8.7" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://gravityblast.com/2009/01/15/radiant-gallery-on-dreamhost-with-ruby-187/&amp;title=Radiant+Gallery+on+Dreamhost+with+Ruby+1.8.7" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dzone.com/links/add.html?description=Radiant+Gallery+on+Dreamhost+with+Ruby+1.8.7&amp;url=http://gravityblast.com/2009/01/15/radiant-gallery-on-dreamhost-with-ruby-187/&amp;title=Radiant+Gallery+on+Dreamhost+with+Ruby+1.8.7" rel="nofollow" title="Add to&nbsp;DZone"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/dzone.png" title="Add to&nbsp;DZone" alt="Add to&nbsp;DZone" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http://gravityblast.com/2009/01/15/radiant-gallery-on-dreamhost-with-ruby-187/" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://gravityblast.com/2009/01/15/radiant-gallery-on-dreamhost-with-ruby-187/&amp;title=Radiant+Gallery+on+Dreamhost+with+Ruby+1.8.7" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.netscape.com/submit/?U=http://gravityblast.com/2009/01/15/radiant-gallery-on-dreamhost-with-ruby-187/&amp;T=Radiant+Gallery+on+Dreamhost+with+Ruby+1.8.7" rel="nofollow" title="Add to&nbsp;Netscape"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/netscape.png" title="Add to&nbsp;Netscape" alt="Add to&nbsp;Netscape" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://gravityblast.com/2009/01/15/radiant-gallery-on-dreamhost-with-ruby-187/&amp;title=Radiant+Gallery+on+Dreamhost+with+Ruby+1.8.7" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://slashdot.org/bookmark.pl?url=http://gravityblast.com/2009/01/15/radiant-gallery-on-dreamhost-with-ruby-187/&amp;title=Radiant+Gallery+on+Dreamhost+with+Ruby+1.8.7" rel="nofollow" title="Add to&nbsp;Slashdot"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/slashdot.png" title="Add to&nbsp;Slashdot" alt="Add to&nbsp;Slashdot" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit.php?url=http://gravityblast.com/2009/01/15/radiant-gallery-on-dreamhost-with-ruby-187/&amp;title=Radiant+Gallery+on+Dreamhost+with+Ruby+1.8.7" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://gravityblast.com/2009/01/15/radiant-gallery-on-dreamhost-with-ruby-187/" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://tipd.com/submit.php?url=http://gravityblast.com/2009/01/15/radiant-gallery-on-dreamhost-with-ruby-187/" rel="nofollow" title="Add to&nbsp;Tip'd"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/tipd.png" title="Add to&nbsp;Tip'd" alt="Add to&nbsp;Tip'd" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+Radiant+Gallery+on+Dreamhost+with+Ruby+1.8.7+@+http://gravityblast.com/2009/01/15/radiant-gallery-on-dreamhost-with-ruby-187/" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://gravityblast.com/2009/01/15/radiant-gallery-on-dreamhost-with-ruby-187/&amp;t=Radiant+Gallery+on+Dreamhost+with+Ruby+1.8.7" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://gravityblast.com/2009/01/15/radiant-gallery-on-dreamhost-with-ruby-187/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Getting Exif data using ImageScience</title>
		<link>http://gravityblast.com/2008/05/02/getting-exif-data-using-imagescience/</link>
		<comments>http://gravityblast.com/2008/05/02/getting-exif-data-using-imagescience/#comments</comments>
		<pubDate>Fri, 02 May 2008 09:39:54 +0000</pubDate>
		<dc:creator>Andrea Franz</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Exif]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://gravityblast.com/2008/05/02/getting-exif-data-using-imagescience/</guid>
		<description><![CDATA[In my current rails project I need to upload photos and save some exif data taken from them. I use attachment_fu as uploading system that let me choose which image processor to use. Using rmagick and mini_magick I can extract exif data with the following code:

# rmagick
image = Magick::ImageList.new&#40;filename&#41;.first
puts image&#91;'EXIF:Model'&#93; # The camera model used [...]]]></description>
			<content:encoded><![CDATA[<p>In my current <a href="http://www.rubyonrails.org/" title="Ruby on Rails">rails</a> project I need to upload photos and save some exif data taken from them. I use <a href="http://github.com/technoweenie/attachment_fu/">attachment_fu</a> as uploading system that let me choose which image processor to use. Using rmagick and mini_magick I can extract exif data with the following code:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;"># rmagick</span>
image = <span style="color:#6666ff; font-weight:bold;">Magick::ImageList</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>filename<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">first</span>
<span style="color:#CC0066; font-weight:bold;">puts</span> image<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'EXIF:Model'</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#008000; font-style:italic;"># The camera model used to take the picture</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># mini_magick</span>
image = <span style="color:#6666ff; font-weight:bold;">MiniMagick::Image</span>.<span style="color:#9900CC;">from_file</span><span style="color:#006600; font-weight:bold;">&#40;</span>filename<span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#CC0066; font-weight:bold;">puts</span> image<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;EXIF:Model&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span></pre></div></div>

<p>The problem is that I can&#8217;t do the same thing with <a href="http://seattlerb.rubyforge.org/ImageScience.html" title="ImageScience">image_science</a>, because it has no methods that return exif data, so I want to add a method to the ImageScience class to do that.<br />
Looking the <a href="http://freeimage.sourceforge.net/">FreeImage</a> <a href="http://freeimage.sourceforge.net/fip/index.html">documentation</a> I found some helpful functions, FreeImage_GetMetadata and FreeImage_TagToString. With these 2 functions I&#8217;m able to get an exif tag and convert it to a readable string. Each one of the available tags belongs to one of the following meta models:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">FI_ENUM<span style="color: #009900;">&#40;</span>FREE_IMAGE_MDMODEL<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  FIMD_NODATA         <span style="color: #339933;">=</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">,</span>
  FIMD_COMMENTS       <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span>	<span style="color: #666666; font-style: italic;">// single comment or keywords</span>
  FIMD_EXIF_MAIN      <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">,</span>	<span style="color: #666666; font-style: italic;">// Exif-TIFF metadata</span>
  FIMD_EXIF_EXIF      <span style="color: #339933;">=</span> <span style="color: #0000dd;">2</span><span style="color: #339933;">,</span>	<span style="color: #666666; font-style: italic;">// Exif-specific metadata</span>
  FIMD_EXIF_GPS       <span style="color: #339933;">=</span> <span style="color: #0000dd;">3</span><span style="color: #339933;">,</span>	<span style="color: #666666; font-style: italic;">// Exif GPS metadata</span>
  FIMD_EXIF_MAKERNOTE <span style="color: #339933;">=</span> <span style="color: #0000dd;">4</span><span style="color: #339933;">,</span>	<span style="color: #666666; font-style: italic;">// Exif maker note metadata</span>
  FIMD_EXIF_INTEROP   <span style="color: #339933;">=</span> <span style="color: #0000dd;">5</span><span style="color: #339933;">,</span>	<span style="color: #666666; font-style: italic;">// Exif interoperability metadata</span>
  FIMD_IPTC           <span style="color: #339933;">=</span> <span style="color: #0000dd;">6</span><span style="color: #339933;">,</span>	<span style="color: #666666; font-style: italic;">// IPTC/NAA metadata</span>
  FIMD_XMP            <span style="color: #339933;">=</span> <span style="color: #0000dd;">7</span><span style="color: #339933;">,</span>	<span style="color: #666666; font-style: italic;">// Abobe XMP metadata</span>
  FIMD_GEOTIFF        <span style="color: #339933;">=</span> <span style="color: #0000dd;">8</span><span style="color: #339933;">,</span>	<span style="color: #666666; font-style: italic;">// GeoTIFF metadata</span>
  FIMD_ANIMATION      <span style="color: #339933;">=</span> <span style="color: #0000dd;">9</span><span style="color: #339933;">,</span>	<span style="color: #666666; font-style: italic;">// Animation metadata</span>
  FIMD_CUSTOM         <span style="color: #339933;">=</span> <span style="color: #0000dd;">10</span>	<span style="color: #666666; font-style: italic;">// Used to attach other metadata types to a dib</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Ok, now I can extract the model of the camera:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">FreeImage_GetMetadata<span style="color: #009900;">&#40;</span>FIMD_EXIF_MAIN<span style="color: #339933;">,</span> bitmap<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;Model&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>tag<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span>FreeImage_TagToString<span style="color: #009900;">&#40;</span>FIMD_EXIF_MAIN<span style="color: #339933;">,</span> tag<span style="color: #339933;">,</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>As you can see, I need to pass the model of the &#8220;Model&#8221; tag. But if I don&#8217;t know which model to use, I can loop through all of them until the returned value of the <strong>FreeImage_GetMetadata</strong> function is not NULL:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>model <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> model <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">11</span><span style="color: #339933;">;</span> model<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>FreeImage_GetMetadata<span style="color: #009900;">&#40;</span>model<span style="color: #339933;">,</span> bitmap<span style="color: #339933;">,</span> tagName<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>tag<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #b1b100;">return</span> rb_str_new2<span style="color: #009900;">&#40;</span>FreeImage_TagToString<span style="color: #009900;">&#40;</span>model<span style="color: #339933;">,</span> tag<span style="color: #339933;">,</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Finally I can write a ruby module that extends ImageScience and adds the ability to get an exif tag:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">module</span> ImageScienceExifData
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#40;</span>key<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#9966CC; font-weight:bold;">if</span> key =~ <span style="color:#006600; font-weight:bold;">/</span>^EXIF:<span style="color:#006600; font-weight:bold;">&#40;</span>\w<span style="color:#006600; font-weight:bold;">+</span><span style="color:#006600; font-weight:bold;">&#41;</span>?<span style="color:#006600; font-weight:bold;">/</span>    
      get_exif<span style="color:#006600; font-weight:bold;">&#40;</span>$<span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  inline <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>builder<span style="color:#006600; font-weight:bold;">|</span>
    <span style="color:#9966CC; font-weight:bold;">if</span> test ?d, <span style="color:#996600;">&quot;/opt/local&quot;</span> <span style="color:#9966CC; font-weight:bold;">then</span>
      builder.<span style="color:#9900CC;">add_compile_flags</span> <span style="color:#996600;">&quot;-I/opt/local/include&quot;</span>
      builder.<span style="color:#9900CC;">add_link_flags</span> <span style="color:#996600;">&quot;-L/opt/local/lib&quot;</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
    builder.<span style="color:#9900CC;">add_link_flags</span> <span style="color:#996600;">&quot;-lfreeimage&quot;</span>
    builder.<span style="color:#9900CC;">add_link_flags</span> <span style="color:#996600;">&quot;-lstdc++&quot;</span> <span style="color:#008000; font-style:italic;"># only needed on PPC for some reason. lame</span>
    builder.<span style="color:#9966CC; font-weight:bold;">include</span> <span style="color:#996600;">'&quot;FreeImage.h&quot;'</span>
&nbsp;
    builder.<span style="color:#9900CC;">prefix</span> <span style="color:#006600; font-weight:bold;">&lt;&lt;-</span><span style="color:#996600;">&quot;END&quot;</span>
      <span style="color:#008000; font-style:italic;">#define GET_BITMAP(name) FIBITMAP *(name); Data_Get_Struct(self, FIBITMAP, (name)); if (!(name)) rb_raise(rb_eTypeError, &quot;Bitmap has already been freed&quot;)</span>
    <span style="color:#9966CC; font-weight:bold;">END</span>
&nbsp;
    builder.<span style="color:#9900CC;">c</span> <span style="color:#006600; font-weight:bold;">&lt;&lt;-</span><span style="color:#996600;">&quot;END&quot;</span>
      VALUE get_exif<span style="color:#006600; font-weight:bold;">&#40;</span>char <span style="color:#006600; font-weight:bold;">*</span>tagName<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span>
        GET_BITMAP<span style="color:#006600; font-weight:bold;">&#40;</span>bitmap<span style="color:#006600; font-weight:bold;">&#41;</span>;
        FITAG <span style="color:#006600; font-weight:bold;">*</span>tag = NULL;
        const char <span style="color:#006600; font-weight:bold;">*</span>value;
        int model;
&nbsp;
        <span style="color:#9966CC; font-weight:bold;">for</span><span style="color:#006600; font-weight:bold;">&#40;</span>model = <span style="color:#006666;">0</span>; model <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#006666;">11</span>; model<span style="color:#006600; font-weight:bold;">++</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span>
          <span style="color:#9966CC; font-weight:bold;">if</span><span style="color:#006600; font-weight:bold;">&#40;</span>FreeImage_GetMetadata<span style="color:#006600; font-weight:bold;">&#40;</span>model, bitmap, tagName, <span style="color:#006600; font-weight:bold;">&amp;</span>tag<span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
            <span style="color:#0000FF; font-weight:bold;">return</span> rb_str_new2<span style="color:#006600; font-weight:bold;">&#40;</span>FreeImage_TagToString<span style="color:#006600; font-weight:bold;">&#40;</span>model, tag, NULL<span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>;
        <span style="color:#006600; font-weight:bold;">&#125;</span>
&nbsp;
        <span style="color:#0000FF; font-weight:bold;">return</span> Qnil;
      <span style="color:#006600; font-weight:bold;">&#125;</span>
    <span style="color:#9966CC; font-weight:bold;">END</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
ImageScience.<span style="color:#9900CC;">send</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:include</span>, ImageScienceExifData<span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
ImageScience.<span style="color:#9900CC;">with_image</span><span style="color:#006600; font-weight:bold;">&#40;</span>filename<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>img<span style="color:#006600; font-weight:bold;">|</span>
  <span style="color:#CC0066; font-weight:bold;">puts</span> img<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;EXIF:Model&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>The output with the picture I used is the following :</p>
<pre>NIKON
COOLPIX S3
2006:12:10 12:09:17</pre>
<p>It doesn&#8217;t work with all the exif names but for now it&#8217;s ok for my needs. The next step is to add the code above in my rails application and use it with attachment_fu. I&#8217;ll write another post about that soon.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>share</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://buzz.yahoo.com/submit?submitUrl=http://gravityblast.com/2008/05/02/getting-exif-data-using-imagescience/&amp;submitHeadline=Getting+Exif+data+using+ImageScience&amp;submitSummary=" rel="nofollow" title="Add to&nbsp;Buzz"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/buzz.png" title="Add to&nbsp;Buzz" alt="Add to&nbsp;Buzz" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://gravityblast.com/2008/05/02/getting-exif-data-using-imagescience/&amp;title=Getting+Exif+data+using+ImageScience" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://gravityblast.com/2008/05/02/getting-exif-data-using-imagescience/&amp;title=Getting+Exif+data+using+ImageScience" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dzone.com/links/add.html?description=Getting+Exif+data+using+ImageScience&amp;url=http://gravityblast.com/2008/05/02/getting-exif-data-using-imagescience/&amp;title=Getting+Exif+data+using+ImageScience" rel="nofollow" title="Add to&nbsp;DZone"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/dzone.png" title="Add to&nbsp;DZone" alt="Add to&nbsp;DZone" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http://gravityblast.com/2008/05/02/getting-exif-data-using-imagescience/" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://gravityblast.com/2008/05/02/getting-exif-data-using-imagescience/&amp;title=Getting+Exif+data+using+ImageScience" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.netscape.com/submit/?U=http://gravityblast.com/2008/05/02/getting-exif-data-using-imagescience/&amp;T=Getting+Exif+data+using+ImageScience" rel="nofollow" title="Add to&nbsp;Netscape"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/netscape.png" title="Add to&nbsp;Netscape" alt="Add to&nbsp;Netscape" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://gravityblast.com/2008/05/02/getting-exif-data-using-imagescience/&amp;title=Getting+Exif+data+using+ImageScience" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://slashdot.org/bookmark.pl?url=http://gravityblast.com/2008/05/02/getting-exif-data-using-imagescience/&amp;title=Getting+Exif+data+using+ImageScience" rel="nofollow" title="Add to&nbsp;Slashdot"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/slashdot.png" title="Add to&nbsp;Slashdot" alt="Add to&nbsp;Slashdot" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit.php?url=http://gravityblast.com/2008/05/02/getting-exif-data-using-imagescience/&amp;title=Getting+Exif+data+using+ImageScience" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://gravityblast.com/2008/05/02/getting-exif-data-using-imagescience/" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://tipd.com/submit.php?url=http://gravityblast.com/2008/05/02/getting-exif-data-using-imagescience/" rel="nofollow" title="Add to&nbsp;Tip'd"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/tipd.png" title="Add to&nbsp;Tip'd" alt="Add to&nbsp;Tip'd" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+Getting+Exif+data+using+ImageScience+@+http://gravityblast.com/2008/05/02/getting-exif-data-using-imagescience/" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://gravityblast.com/2008/05/02/getting-exif-data-using-imagescience/&amp;t=Getting+Exif+data+using+ImageScience" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://gravityblast.com/2008/05/02/getting-exif-data-using-imagescience/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Radiant Newsletter extension has stats</title>
		<link>http://gravityblast.com/2008/03/27/radiant-newsletter-extension-has-stats/</link>
		<comments>http://gravityblast.com/2008/03/27/radiant-newsletter-extension-has-stats/#comments</comments>
		<pubDate>Thu, 27 Mar 2008 21:53:04 +0000</pubDate>
		<dc:creator>Andrea Franz</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Radiant]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://gravityblast.com/2008/03/27/radiant-newsletter-extension-has-stats/</guid>
		<description><![CDATA[Some weeks ago Casper Fabricius sent me a patch for the Radiant Newsletter extension. He added a statistics system to track how many times sent emails are opened. I have finally found the time to apply it and make a commit to my repository. Thank you very very much for your work Casper! I&#8217;ll write [...]]]></description>
			<content:encoded><![CDATA[<p>Some weeks ago <a href="http://casperfabricius.com/blog/">Casper Fabricius</a> sent me a patch for the <a href="http://gravityblast.com/projects/radiant-newsletter-extension/">Radiant Newsletter extension.</a> He added a statistics system to track how many times sent emails are opened. I have finally found the time to apply it and make a commit to my repository. Thank you very very much for your work Casper! I&#8217;ll write an article about this extension as soon as possible.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>share</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://buzz.yahoo.com/submit?submitUrl=http://gravityblast.com/2008/03/27/radiant-newsletter-extension-has-stats/&amp;submitHeadline=Radiant+Newsletter+extension+has+stats&amp;submitSummary=" rel="nofollow" title="Add to&nbsp;Buzz"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/buzz.png" title="Add to&nbsp;Buzz" alt="Add to&nbsp;Buzz" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://gravityblast.com/2008/03/27/radiant-newsletter-extension-has-stats/&amp;title=Radiant+Newsletter+extension+has+stats" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://gravityblast.com/2008/03/27/radiant-newsletter-extension-has-stats/&amp;title=Radiant+Newsletter+extension+has+stats" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dzone.com/links/add.html?description=Radiant+Newsletter+extension+has+stats&amp;url=http://gravityblast.com/2008/03/27/radiant-newsletter-extension-has-stats/&amp;title=Radiant+Newsletter+extension+has+stats" rel="nofollow" title="Add to&nbsp;DZone"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/dzone.png" title="Add to&nbsp;DZone" alt="Add to&nbsp;DZone" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http://gravityblast.com/2008/03/27/radiant-newsletter-extension-has-stats/" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://gravityblast.com/2008/03/27/radiant-newsletter-extension-has-stats/&amp;title=Radiant+Newsletter+extension+has+stats" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.netscape.com/submit/?U=http://gravityblast.com/2008/03/27/radiant-newsletter-extension-has-stats/&amp;T=Radiant+Newsletter+extension+has+stats" rel="nofollow" title="Add to&nbsp;Netscape"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/netscape.png" title="Add to&nbsp;Netscape" alt="Add to&nbsp;Netscape" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://gravityblast.com/2008/03/27/radiant-newsletter-extension-has-stats/&amp;title=Radiant+Newsletter+extension+has+stats" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://slashdot.org/bookmark.pl?url=http://gravityblast.com/2008/03/27/radiant-newsletter-extension-has-stats/&amp;title=Radiant+Newsletter+extension+has+stats" rel="nofollow" title="Add to&nbsp;Slashdot"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/slashdot.png" title="Add to&nbsp;Slashdot" alt="Add to&nbsp;Slashdot" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit.php?url=http://gravityblast.com/2008/03/27/radiant-newsletter-extension-has-stats/&amp;title=Radiant+Newsletter+extension+has+stats" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://gravityblast.com/2008/03/27/radiant-newsletter-extension-has-stats/" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://tipd.com/submit.php?url=http://gravityblast.com/2008/03/27/radiant-newsletter-extension-has-stats/" rel="nofollow" title="Add to&nbsp;Tip'd"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/tipd.png" title="Add to&nbsp;Tip'd" alt="Add to&nbsp;Tip'd" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+Radiant+Newsletter+extension+has+stats+@+http://gravityblast.com/2008/03/27/radiant-newsletter-extension-has-stats/" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://gravityblast.com/2008/03/27/radiant-newsletter-extension-has-stats/&amp;t=Radiant+Newsletter+extension+has+stats" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://gravityblast.com/2008/03/27/radiant-newsletter-extension-has-stats/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Speed up your sortable list with LiteSortable</title>
		<link>http://gravityblast.com/2007/12/17/speed-up-your-sortable-list-with-litesortable/</link>
		<comments>http://gravityblast.com/2007/12/17/speed-up-your-sortable-list-with-litesortable/#comments</comments>
		<pubDate>Mon, 17 Dec 2007 16:32:24 +0000</pubDate>
		<dc:creator>Andrea Franz</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[RIA]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://gravityblast.com/2007/12/17/speed-up-your-sortable-list-with-litesortable/</guid>
		<description><![CDATA[I love to use prototype and scriptaculous to create Rich Internet Application, and I love all the built-in effects and libraries of script.aculo.us.
Today I was working with Sortable.create to provide a simple way to reorder images inside a gallery. I started using the same code used in the SortableListsDemo page of the official wiki. Each [...]]]></description>
			<content:encoded><![CDATA[<p>I love to use <a href="http://prototypejs.org/">prototype</a> and <a href="http://script.aculo.us/">scriptaculous</a> to create Rich Internet Application, and I love all the built-in effects and libraries of script.aculo.us.<br />
Today I was working with <a href="http://wiki.script.aculo.us/scriptaculous/show/Sortable.create">Sortable.create</a> to provide a simple way to reorder images inside a gallery. I started using the same code used in the <a href="http://wiki.script.aculo.us/scriptaculous/show/SortableListsDemo">SortableListsDemo</a> page of the official wiki. Each time the list is updated, the serialized list is sent to the server. The server receives the list and updates all the images positions. It&#8217;s pretty simple and works fine, but the problem is that the server executes a query for each image in the gallery. This means that if I have 100 images, 100 queries will be run. It&#8217;s a hell for my server! The best way to improve this action is to send to the server more detailed information, such as the dragged image, the old position and the new position. In this way I can execute only 2 queries for each movement. To do that I wrote a simple javascript class called LiteSortable that acts like the Sortable.create method. It receives the same parameters, and the same callbacks: onUpdate, onChange. The only change is that these 2 callbacks will receive more information about the movement, and I can improve the previous client side code with:</p>
<pre><code>function sort(list, element, id, old_position, new_position) {
  new Ajax.Request('/admin/gallery_item/sort/', {
    evalScripts:true,
    parameters: {
      id: id,
      old_position: old_position,
      new_position: new_position
    }
  });
}

document.observe('dom:loaded', function() {
  new LiteSortable('list', {
    onUpdate: sort
  });
});</code></pre>
<p>And the server code become like the following:</p>
<pre><code>def sort
  old_position, new_position = params[:old_position].to_i, params[:new_position].to_i
  @item = GalleryItem.find(:first, :conditions =&gt; ["id = ? AND position = ?", params[:id], old_position])
  if @item
    x, y, z = old_position &lt; new_position ? ["-", "&lt;", "&gt;"] : ["+", "&gt;", "&lt;"]
    GalleryItem.update_all("position = (position #{x} 1)", ["parent_id IS NULL AND gallery_id = ? AND position #{y}= ? AND position #{z}= ?", @item.gallery_id, new_position, old_position])
    @item.update_attribute('position', new_position)
  else
    @error = true
  end
end</code></pre>
<p>If @error is true, it means that the dragged image it&#8217;s been deleted or moved by somone else.<br />
If you want to use LiteSortable you can check out the entire project with:</p>
<pre><code>svn co http://dev.gravityblast.com/svn/projects/js/LiteSortable/</code></pre>
<p>&#8230;or save download the lite_sortable.js file from <a href="http://dev.gravityblast.com/svn/projects/js/LiteSortable/src/lite_sortable.js">here</a>.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>share</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://buzz.yahoo.com/submit?submitUrl=http://gravityblast.com/2007/12/17/speed-up-your-sortable-list-with-litesortable/&amp;submitHeadline=Speed+up+your+sortable+list+with+LiteSortable&amp;submitSummary=" rel="nofollow" title="Add to&nbsp;Buzz"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/buzz.png" title="Add to&nbsp;Buzz" alt="Add to&nbsp;Buzz" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://gravityblast.com/2007/12/17/speed-up-your-sortable-list-with-litesortable/&amp;title=Speed+up+your+sortable+list+with+LiteSortable" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://gravityblast.com/2007/12/17/speed-up-your-sortable-list-with-litesortable/&amp;title=Speed+up+your+sortable+list+with+LiteSortable" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dzone.com/links/add.html?description=Speed+up+your+sortable+list+with+LiteSortable&amp;url=http://gravityblast.com/2007/12/17/speed-up-your-sortable-list-with-litesortable/&amp;title=Speed+up+your+sortable+list+with+LiteSortable" rel="nofollow" title="Add to&nbsp;DZone"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/dzone.png" title="Add to&nbsp;DZone" alt="Add to&nbsp;DZone" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http://gravityblast.com/2007/12/17/speed-up-your-sortable-list-with-litesortable/" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://gravityblast.com/2007/12/17/speed-up-your-sortable-list-with-litesortable/&amp;title=Speed+up+your+sortable+list+with+LiteSortable" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.netscape.com/submit/?U=http://gravityblast.com/2007/12/17/speed-up-your-sortable-list-with-litesortable/&amp;T=Speed+up+your+sortable+list+with+LiteSortable" rel="nofollow" title="Add to&nbsp;Netscape"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/netscape.png" title="Add to&nbsp;Netscape" alt="Add to&nbsp;Netscape" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://gravityblast.com/2007/12/17/speed-up-your-sortable-list-with-litesortable/&amp;title=Speed+up+your+sortable+list+with+LiteSortable" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://slashdot.org/bookmark.pl?url=http://gravityblast.com/2007/12/17/speed-up-your-sortable-list-with-litesortable/&amp;title=Speed+up+your+sortable+list+with+LiteSortable" rel="nofollow" title="Add to&nbsp;Slashdot"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/slashdot.png" title="Add to&nbsp;Slashdot" alt="Add to&nbsp;Slashdot" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit.php?url=http://gravityblast.com/2007/12/17/speed-up-your-sortable-list-with-litesortable/&amp;title=Speed+up+your+sortable+list+with+LiteSortable" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://gravityblast.com/2007/12/17/speed-up-your-sortable-list-with-litesortable/" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://tipd.com/submit.php?url=http://gravityblast.com/2007/12/17/speed-up-your-sortable-list-with-litesortable/" rel="nofollow" title="Add to&nbsp;Tip'd"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/tipd.png" title="Add to&nbsp;Tip'd" alt="Add to&nbsp;Tip'd" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+Speed+up+your+sortable+list+with+LiteSortable+@+http://gravityblast.com/2007/12/17/speed-up-your-sortable-list-with-litesortable/" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://gravityblast.com/2007/12/17/speed-up-your-sortable-list-with-litesortable/&amp;t=Speed+up+your+sortable+list+with+LiteSortable" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://gravityblast.com/2007/12/17/speed-up-your-sortable-list-with-litesortable/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Subversion Support for Gallery Extension</title>
		<link>http://gravityblast.com/2007/12/05/subversion-for-the-gallery-extension/</link>
		<comments>http://gravityblast.com/2007/12/05/subversion-for-the-gallery-extension/#comments</comments>
		<pubDate>Wed, 05 Dec 2007 17:46:56 +0000</pubDate>
		<dc:creator>Andrea Franz</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Gor]]></category>
		<category><![CDATA[Radiant]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://gravityblast.com/2007/12/05/subversion-for-the-gallery-extension/</guid>
		<description><![CDATA[I&#8217;m going to move all my projects to subversion. Now I&#8217;m moving the Gallery extension.The subversion repository is here:
http://dev.gravityblast.com/svn/projects/radiant/extensions/gallery/
You can check it out with
svn co http://dev.gravityblast.com/svn/projects/radiant/extensions/gallery/
The new version uses attachment_fu, and the filesystem organization is changed. In order to use the new version with galleries created by old versions of the Gallery extension you must [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m going to move all my projects to subversion. Now I&#8217;m moving the <a href="http://gravityblast.com/projects/radiant-gallery-extension/" title="Radiant Gallery extension">Gallery extension</a>.The subversion repository is here:</p>
<pre><code>http://dev.gravityblast.com/svn/projects/radiant/extensions/gallery/</code></pre>
<p>You can check it out with</p>
<pre><code>svn co http://dev.gravityblast.com/svn/projects/radiant/extensions/gallery/</code></pre>
<p>The new version uses <a href="http://svn.techno-weenie.net/projects/plugins/attachment_fu/" title="AttachmentFu">attachment_fu</a>, and the filesystem organization is changed. In order to use the new version with galleries created by old versions of the Gallery extension you must  run this rake task:</p>
<pre><code>rake RAILS_ENV="production" radiant:extensions:gallery:version_0_7_0:upgrade_filesystem_structure</code></pre>
<p>I suggest making a backup of all your pictures before running the above rake task. Let me know if everything works correctly!</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>share</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://buzz.yahoo.com/submit?submitUrl=http://gravityblast.com/2007/12/05/subversion-for-the-gallery-extension/&amp;submitHeadline=Subversion+Support+for+Gallery+Extension&amp;submitSummary=" rel="nofollow" title="Add to&nbsp;Buzz"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/buzz.png" title="Add to&nbsp;Buzz" alt="Add to&nbsp;Buzz" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://gravityblast.com/2007/12/05/subversion-for-the-gallery-extension/&amp;title=Subversion+Support+for+Gallery+Extension" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://gravityblast.com/2007/12/05/subversion-for-the-gallery-extension/&amp;title=Subversion+Support+for+Gallery+Extension" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dzone.com/links/add.html?description=Subversion+Support+for+Gallery+Extension&amp;url=http://gravityblast.com/2007/12/05/subversion-for-the-gallery-extension/&amp;title=Subversion+Support+for+Gallery+Extension" rel="nofollow" title="Add to&nbsp;DZone"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/dzone.png" title="Add to&nbsp;DZone" alt="Add to&nbsp;DZone" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http://gravityblast.com/2007/12/05/subversion-for-the-gallery-extension/" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://gravityblast.com/2007/12/05/subversion-for-the-gallery-extension/&amp;title=Subversion+Support+for+Gallery+Extension" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.netscape.com/submit/?U=http://gravityblast.com/2007/12/05/subversion-for-the-gallery-extension/&amp;T=Subversion+Support+for+Gallery+Extension" rel="nofollow" title="Add to&nbsp;Netscape"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/netscape.png" title="Add to&nbsp;Netscape" alt="Add to&nbsp;Netscape" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://gravityblast.com/2007/12/05/subversion-for-the-gallery-extension/&amp;title=Subversion+Support+for+Gallery+Extension" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://slashdot.org/bookmark.pl?url=http://gravityblast.com/2007/12/05/subversion-for-the-gallery-extension/&amp;title=Subversion+Support+for+Gallery+Extension" rel="nofollow" title="Add to&nbsp;Slashdot"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/slashdot.png" title="Add to&nbsp;Slashdot" alt="Add to&nbsp;Slashdot" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit.php?url=http://gravityblast.com/2007/12/05/subversion-for-the-gallery-extension/&amp;title=Subversion+Support+for+Gallery+Extension" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://gravityblast.com/2007/12/05/subversion-for-the-gallery-extension/" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://tipd.com/submit.php?url=http://gravityblast.com/2007/12/05/subversion-for-the-gallery-extension/" rel="nofollow" title="Add to&nbsp;Tip'd"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/tipd.png" title="Add to&nbsp;Tip'd" alt="Add to&nbsp;Tip'd" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+Subversion+Support+for+Gallery+Extension+@+http://gravityblast.com/2007/12/05/subversion-for-the-gallery-extension/" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://gravityblast.com/2007/12/05/subversion-for-the-gallery-extension/&amp;t=Subversion+Support+for+Gallery+Extension" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://gravityblast.com/2007/12/05/subversion-for-the-gallery-extension/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>
