<?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>Jetpack Flight Log &#187; lib-notify</title>
	<atom:link href="http://jetpackweb.com/blog/tags/lib-notify/feed/" rel="self" type="application/rss+xml" />
	<link>http://jetpackweb.com/blog</link>
	<description>Rock{et}ing the interweb</description>
	<lastBuildDate>Sun, 12 Jun 2011 17:51:53 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Autotest notifications on Ubuntu using lib-notify</title>
		<link>http://jetpackweb.com/blog/2009/09/01/autotest-notifications-on-ubuntu-using-lib-notify/</link>
		<comments>http://jetpackweb.com/blog/2009/09/01/autotest-notifications-on-ubuntu-using-lib-notify/#comments</comments>
		<pubDate>Tue, 01 Sep 2009 18:39:49 +0000</pubDate>
		<dc:creator>Brian Racer</dc:creator>
				<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[autotest]]></category>
		<category><![CDATA[bdd]]></category>
		<category><![CDATA[lib-notify]]></category>
		<category><![CDATA[tdd]]></category>

		<guid isPermaLink="false">http://jetpackweb.com/blog/?p=289</guid>
		<description><![CDATA[At Jetpack we are big fans of Test Driven Development(TDD), and specifically Behavior Driven Development(BDD) using excellent testing frameworks like RSpec and Cucumber. When you are using ZenTest&#8217;s autotest or autospec, it&#8217;s nice to have unobtrusive notifications of passing/failing tests while you work. Mac users can integrate autotest with the excellent Growl, but what about [...]]]></description>
			<content:encoded><![CDATA[<p>At Jetpack we are big fans of Test Driven Development(TDD), and specifically Behavior Driven Development(BDD) using excellent testing frameworks like RSpec and Cucumber. When you are using <a href="http://www.zenspider.com/ZSS/Products/ZenTest/" target="_blank">ZenTest&#8217;s</a> autotest or autospec, it&#8217;s nice to have unobtrusive notifications of passing/failing tests while you work. Mac users can integrate autotest with the excellent <a href="http://growl.info/" target="_blank">Growl</a>, but what about us Linux users? Well be can use a library called <strong>lib-notify</strong>. </p>
<p>First lets play with the lib-notify binary. Install it:</p>

<div class="wp_syntax"><div class="code"><pre class="bash"><span class="kw2">sudo</span> <span class="kw2">apt-get</span> <span class="kw2">install</span> libnotify-bin</pre></div></div>

<p>To make sure it is working, try this:</p>

<div class="wp_syntax"><div class="code"><pre class="bash">notify-send <span class="st0">&quot;Hello World!&quot;</span></pre></div></div>

<p>You should see the notification appear! Now lets edit our <b>~/.autotest</b> file to use that notification:</p>

<div class="wp_syntax"><div class="code"><pre class="bash"><span class="kw2">vi</span> ~<span class="sy0">/</span>.autotest</pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="ruby"><span class="kw1">module</span> <span class="re2">Autotest::GnomeNotify</span>
&nbsp;
  <span class="co1"># Time notification will be displayed before disappearing automatically</span>
  EXPIRATION_IN_SECONDS = <span class="nu0">2</span>
  ERROR_STOCK_ICON = <span class="st0">&quot;gtk-dialog-error&quot;</span>
  SUCCESS_STOCK_ICON = <span class="st0">&quot;gtk-dialog-info&quot;</span>
&nbsp;
  <span class="co1"># Convenience method to send an error notification message</span>
  <span class="co1">#</span>
  <span class="co1"># [stock_icon]   Stock icon name of icon to display</span>
  <span class="co1"># [title]        Notification message title</span>
  <span class="co1"># [message]      Core message for the notification</span>
  <span class="kw1">def</span> <span class="kw2">self</span>.<span class="me1">notify</span> stock_icon, title, message
    options = <span class="st0">&quot;-t #{EXPIRATION_IN_SECONDS * 1000} -i #{stock_icon}&quot;</span>
    <span class="kw3">system</span> <span class="st0">&quot;notify-send #{options} '#{title}' '#{message}'&quot;</span>
  <span class="kw1">end</span>
&nbsp;
  Autotest.<span class="me1">add_hook</span> <span class="re3">:red</span> <span class="kw1">do</span> <span class="sy0">|</span>at<span class="sy0">|</span>
    notify ERROR_STOCK_ICON, <span class="st0">&quot;Tests failed&quot;</span>, <span class="st0">&quot;#{at.files_to_test.size} tests failed&quot;</span>
  <span class="kw1">end</span>
&nbsp;
  Autotest.<span class="me1">add_hook</span> <span class="re3">:green</span> <span class="kw1">do</span> <span class="sy0">|</span>at<span class="sy0">|</span>
    notify SUCCESS_STOCK_ICON, <span class="st0">&quot;All tests passed, good job!&quot;</span>, <span class="st0">&quot;&quot;</span>
  <span class="kw1">end</span>
&nbsp;
<span class="kw1">end</span></pre></div></div>

<p>Although not quite as pretty as Growl yet, it works! If you are happy with that you can stop there. If you want something that looks a little bit nicer, read on!</p>
<p>The next few steps are going to require a few development libraries and gems, so install the following packages to make sure we are on the same page:</p>

<div class="wp_syntax"><div class="code"><pre class="bash"><span class="kw2">apt-get</span> <span class="kw2">install</span>  libinotify-ruby libgtk2-ruby  libnotify-dev
<span class="kw2">sudo</span> gem <span class="kw2">install</span> zentest autotest autotest-rails red-green launchy</pre></div></div>

<p>Unfortunately the <a href="http://ruby-libnotify.rubyforge.org/index.html" target="_blank">libnotify ruby library</a> isn&#8217;t included in Ubuntu 9.04 Jaunty, so we will have to build that ourselves:</p>

<div class="wp_syntax"><div class="code"><pre class="bash"><span class="kw2">wget</span> http:<span class="sy0">//</span>rubyforge.org<span class="sy0">/</span>frs<span class="sy0">/</span>download.php<span class="sy0">/</span><span class="nu0">27134</span><span class="sy0">/</span>ruby-libnotify-0.3.3.tar.bz2
<span class="kw2">tar</span> <span class="re5">-xvjpf</span> ruby-libnotify-0.3.3.tar.bz2
<span class="kw3">cd</span>  ruby-libnotify-0.3.3
ruby extconf.rb
<span class="kw2">make</span>
<span class="kw2">sudo</span> <span class="kw2">make</span> <span class="kw2">install</span></pre></div></div>

<p>Next put the following <a href="http://thelucid.com/2007/07/30/autotest-growl-fail-pass-smilies/" target="_blank">pretty images</a> in your <b>~./autotest_images</b> directory:</p>

<a href='http://jetpackweb.com/blog/2009/09/01/autotest-notifications-on-ubuntu-using-lib-notify/fail/' title='fail'><img width="150" height="150" src="http://jetpackweb.com/blog/wp-content/uploads/2009/09/fail-150x150.png" class="attachment-thumbnail" alt="fail" title="fail" /></a>
<a href='http://jetpackweb.com/blog/2009/09/01/autotest-notifications-on-ubuntu-using-lib-notify/pass/' title='pass'><img width="150" height="150" src="http://jetpackweb.com/blog/wp-content/uploads/2009/09/pass-150x150.png" class="attachment-thumbnail" alt="pass" title="pass" /></a>
<a href='http://jetpackweb.com/blog/2009/09/01/autotest-notifications-on-ubuntu-using-lib-notify/pending/' title='pending'><img width="150" height="150" src="http://jetpackweb.com/blog/wp-content/uploads/2009/09/pending-150x150.png" class="attachment-thumbnail" alt="pending" title="pending" /></a>

<p>Now we can use a modified version of <a href="http://www.lindenlan.net/2008/03/03/rspec-autotest-and-ruby-libnotify/" target=_blank">Linden LAN&#8217;s</a> .autotest:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby"><span class="kw3">require</span> <span class="st0">'rnotify'</span>
<span class="kw3">require</span> <span class="st0">'launchy'</span>
<span class="kw3">require</span> <span class="st0">'gtk2'</span>
&nbsp;
<span class="kw1">module</span> <span class="re2">Autotest::RNotify</span>
  <span class="kw1">class</span> Notification
    attr_accessor <span class="re3">:verbose</span>, <span class="re3">:image_root</span>, <span class="re3">:tray_icon</span>, <span class="re3">:notification</span>,
                  <span class="re3">:image_pass</span>, <span class="re3">:image_pending</span>, <span class="re3">:image_fail</span>,
                  <span class="re3">:image_file_pass</span>, <span class="re3">:image_file_pending</span>, <span class="re3">:image_file_fail</span>,
                  <span class="re3">:status_image_pass</span>, <span class="re3">:status_image_pending</span>, <span class="re3">:status_image_fail</span>
&nbsp;
    <span class="kw1">def</span> initialize<span class="br0">&#40;</span>timeout = <span class="nu0">5000</span>,
                   image_root = <span class="st0">&quot;#{ENV['HOME']}/.autotest_images&quot;</span> ,
                   report_url = <span class="st0">&quot;doc/spec/report.html&quot;</span>,
                   verbose = <span class="kw2">false</span><span class="br0">&#41;</span>
      <span class="kw2">self</span>.<span class="me1">verbose</span> = verbose
      <span class="kw2">self</span>.<span class="me1">image_root</span> = image_root
      <span class="kw2">self</span>.<span class="me1">image_file_pass</span> = <span class="st0">&quot;#{image_root}/pass.png&quot;</span>
      <span class="kw2">self</span>.<span class="me1">image_file_pending</span> = <span class="st0">&quot;#{image_root}/pending.png&quot;</span>
      <span class="kw2">self</span>.<span class="me1">image_file_fail</span> = <span class="st0">&quot;#{image_root}/fail.png&quot;</span>
&nbsp;
      <span class="kw3">raise</span><span class="br0">&#40;</span><span class="st0">&quot;#{image_file_pass} not found&quot;</span><span class="br0">&#41;</span> <span class="kw1">unless</span> <span class="kw4">File</span>.<span class="me1">exists</span>?<span class="br0">&#40;</span>image_file_pass<span class="br0">&#41;</span>
      <span class="kw3">raise</span><span class="br0">&#40;</span><span class="st0">&quot;#{image_file_pending} not found&quot;</span><span class="br0">&#41;</span> <span class="kw1">unless</span> <span class="kw4">File</span>.<span class="me1">exists</span>?<span class="br0">&#40;</span>image_file_pending<span class="br0">&#41;</span>
      <span class="kw3">raise</span><span class="br0">&#40;</span><span class="st0">&quot;#{image_file_fail} not found&quot;</span><span class="br0">&#41;</span> <span class="kw1">unless</span> <span class="kw4">File</span>.<span class="me1">exists</span>?<span class="br0">&#40;</span>image_file_fail<span class="br0">&#41;</span>
&nbsp;
      <span class="kw3">puts</span> <span class="st0">'Autotest Hook: loading Notify'</span> <span class="kw1">if</span> verbose
      Notify.<span class="me1">init</span><span class="br0">&#40;</span><span class="st0">'Autotest'</span><span class="br0">&#41;</span> <span class="sy0">||</span> <span class="kw3">raise</span><span class="br0">&#40;</span><span class="st0">'Failed to initialize Notify'</span><span class="br0">&#41;</span>
&nbsp;
      <span class="kw3">puts</span> <span class="st0">'Autotest Hook: initializing tray icon'</span> <span class="kw1">if</span> verbose
      <span class="kw2">self</span>.<span class="me1">tray_icon</span> = <span class="re2">Gtk::StatusIcon</span>.<span class="me1">new</span>
      tray_icon.<span class="me1">pixbuf</span> = <span class="re2">Gdk::Pixbuf</span>.<span class="me1">new</span><span class="br0">&#40;</span>image_file_pending,<span class="nu0">22</span>,<span class="nu0">22</span><span class="br0">&#41;</span>
      tray_icon.<span class="me1">tooltip</span> = <span class="st0">'RSpec Autotest'</span>
&nbsp;
      <span class="kw3">puts</span> <span class="st0">'Autotest Hook: Creating Notifier'</span> <span class="kw1">if</span> verbose
      <span class="kw2">self</span>.<span class="me1">notification</span> = <span class="re2">Notify::Notification</span>.<span class="me1">new</span><span class="br0">&#40;</span><span class="st0">'X'</span>, <span class="kw2">nil</span>, <span class="kw2">nil</span>, tray_icon<span class="br0">&#41;</span>
&nbsp;
      notification.<span class="me1">timeout</span> = timeout
&nbsp;
      <span class="kw3">puts</span> <span class="st0">'Autotest Hook: Connecting mouse click event'</span> <span class="kw1">if</span> verbose
      tray_icon.<span class="me1">signal_connect</span><span class="br0">&#40;</span><span class="st0">&quot;activate&quot;</span><span class="br0">&#41;</span> <span class="kw1">do</span>
        <span class="re2">Launchy::Browser</span>.<span class="me1">new</span>.<span class="me1">visit</span><span class="br0">&#40;</span>report_url<span class="br0">&#41;</span>
      <span class="kw1">end</span>
&nbsp;
      <span class="kw4">Thread</span>.<span class="me1">new</span> <span class="br0">&#123;</span> Gtk.<span class="me1">main</span> <span class="br0">&#125;</span>
      <span class="kw3">sleep</span> <span class="nu0">1</span>
      tray_icon.<span class="me1">embedded</span>? <span class="sy0">||</span> <span class="kw3">raise</span><span class="br0">&#40;</span><span class="st0">'Failed to set up tray icon'</span><span class="br0">&#41;</span>
    <span class="kw1">end</span>
&nbsp;
    <span class="kw1">def</span> notify<span class="br0">&#40;</span>icon, tray, title, message<span class="br0">&#41;</span>
      notification.<span class="me1">update</span><span class="br0">&#40;</span>title, message, <span class="kw2">nil</span><span class="br0">&#41;</span>
      notification.<span class="me1">pixbuf_icon</span> = icon
      tray_icon.<span class="me1">tooltip</span> = <span class="st0">&quot;Last Result: #{message}&quot;</span>
      tray_icon.<span class="me1">pixbuf</span> = tray
      notification.<span class="me1">show</span>
    <span class="kw1">end</span>
&nbsp;
    <span class="kw1">def</span> passed<span class="br0">&#40;</span>title, message<span class="br0">&#41;</span>
      <span class="kw2">self</span>.<span class="me1">image_pass</span> <span class="sy0">||</span>= <span class="re2">Gdk::Pixbuf</span>.<span class="me1">new</span><span class="br0">&#40;</span>image_file_pass, <span class="nu0">48</span>, <span class="nu0">48</span><span class="br0">&#41;</span>
      <span class="kw2">self</span>.<span class="me1">status_image_pass</span> <span class="sy0">||</span>= <span class="re2">Gdk::Pixbuf</span>.<span class="me1">new</span><span class="br0">&#40;</span>image_file_pass, <span class="nu0">22</span>, <span class="nu0">22</span><span class="br0">&#41;</span>
      notify<span class="br0">&#40;</span>image_pass, status_image_pass, title, message<span class="br0">&#41;</span>
    <span class="kw1">end</span>
&nbsp;
    <span class="kw1">def</span> pending<span class="br0">&#40;</span>title, message<span class="br0">&#41;</span>
      <span class="kw2">self</span>.<span class="me1">image_pending</span> <span class="sy0">||</span>= <span class="re2">Gdk::Pixbuf</span>.<span class="me1">new</span><span class="br0">&#40;</span>image_file_pending, <span class="nu0">48</span>, <span class="nu0">48</span><span class="br0">&#41;</span>
      <span class="kw2">self</span>.<span class="me1">status_image_pending</span> <span class="sy0">||</span>= <span class="re2">Gdk::Pixbuf</span>.<span class="me1">new</span><span class="br0">&#40;</span>image_file_pending, <span class="nu0">22</span>, <span class="nu0">22</span><span class="br0">&#41;</span>
      notify<span class="br0">&#40;</span>image_pending, status_image_pending, title, message<span class="br0">&#41;</span>
    <span class="kw1">end</span>
&nbsp;
    <span class="kw1">def</span> failed<span class="br0">&#40;</span>title, message<span class="br0">&#41;</span>
      <span class="kw2">self</span>.<span class="me1">image_fail</span> <span class="sy0">||</span>= <span class="re2">Gdk::Pixbuf</span>.<span class="me1">new</span><span class="br0">&#40;</span>image_file_fail, <span class="nu0">48</span>, <span class="nu0">48</span><span class="br0">&#41;</span>
      <span class="kw2">self</span>.<span class="me1">status_image_fail</span> <span class="sy0">||</span>= <span class="re2">Gdk::Pixbuf</span>.<span class="me1">new</span><span class="br0">&#40;</span>image_file_fail, <span class="nu0">22</span>, <span class="nu0">22</span><span class="br0">&#41;</span>
      notify<span class="br0">&#40;</span>image_fail, status_image_fail, title, message<span class="br0">&#41;</span>
    <span class="kw1">end</span>
&nbsp;
    <span class="kw1">def</span> quit
      <span class="kw3">puts</span> <span class="st0">'Autotest Hook: Shutting Down...'</span> <span class="kw1">if</span> verbose
      <span class="co1">#Notify.uninit</span>
      Gtk.<span class="me1">main_quit</span>
    <span class="kw1">end</span>
  <span class="kw1">end</span>
&nbsp;
  Autotest.<span class="me1">add_hook</span> <span class="re3">:initialize</span> <span class="kw1">do</span> <span class="sy0">|</span>at<span class="sy0">|</span>
    <span class="re1">@notify</span> = Notification.<span class="me1">new</span>
  <span class="kw1">end</span>
&nbsp;
  Autotest.<span class="me1">add_hook</span> <span class="re3">:ran_command</span> <span class="kw1">do</span> <span class="sy0">|</span>at<span class="sy0">|</span>
    results = at.<span class="me1">results</span>.<span class="me1">last</span>
&nbsp;
    <span class="kw1">unless</span> results.<span class="kw2">nil</span>?
      output = results<span class="br0">&#91;</span><span class="sy0">/</span><span class="br0">&#40;</span>\d<span class="sy0">+</span><span class="br0">&#41;</span>\s<span class="sy0">+</span>examples?,\s<span class="sy0">*</span><span class="br0">&#40;</span>\d<span class="sy0">+</span><span class="br0">&#41;</span>\s<span class="sy0">+</span>failures?<span class="br0">&#40;</span>,\s<span class="sy0">*</span><span class="br0">&#40;</span>\d<span class="sy0">+</span><span class="br0">&#41;</span>\s<span class="sy0">+</span>pending<span class="br0">&#41;</span>?<span class="sy0">/</span><span class="br0">&#93;</span>
      <span class="kw1">if</span> output
        failures = $~<span class="br0">&#91;</span><span class="nu0">2</span><span class="br0">&#93;</span>.<span class="me1">to_i</span>
        pending = $~<span class="br0">&#91;</span><span class="nu0">4</span><span class="br0">&#93;</span>.<span class="me1">to_i</span>
      <span class="kw1">end</span>
&nbsp;
      <span class="kw1">if</span> failures <span class="sy0">&gt;</span> <span class="nu0">0</span>
        <span class="re1">@notify</span>.<span class="me1">failed</span><span class="br0">&#40;</span><span class="st0">&quot;Tests Failed&quot;</span>, output<span class="br0">&#41;</span>
      <span class="kw1">elsif</span> pending <span class="sy0">&gt;</span> <span class="nu0">0</span>
        <span class="re1">@notify</span>.<span class="me1">pending</span><span class="br0">&#40;</span><span class="st0">&quot;Tests Pending&quot;</span>, output<span class="br0">&#41;</span>
      <span class="kw1">else</span>
        <span class="kw1">unless</span> at.<span class="me1">tainted</span>
          <span class="re1">@notify</span>.<span class="me1">passed</span><span class="br0">&#40;</span><span class="st0">&quot;All Tests Passed&quot;</span>, output<span class="br0">&#41;</span>
        <span class="kw1">else</span>
          <span class="re1">@notify</span>.<span class="me1">passed</span><span class="br0">&#40;</span><span class="st0">&quot;Tests Passed&quot;</span>, output<span class="br0">&#41;</span>
        <span class="kw1">end</span>
      <span class="kw1">end</span>
    <span class="kw1">end</span>
  <span class="kw1">end</span>
&nbsp;
  Autotest.<span class="me1">add_hook</span> <span class="re3">:quit</span> <span class="kw1">do</span> <span class="sy0">|</span>at<span class="sy0">|</span>
    <span class="re1">@notify</span>.<span class="me1">quit</span>
  <span class="kw1">end</span>
<span class="kw1">end</span></pre></div></div>

<p>This should leave you with a pretty good base if you want to further customize the script!</p>
]]></content:encoded>
			<wfw:commentRss>http://jetpackweb.com/blog/2009/09/01/autotest-notifications-on-ubuntu-using-lib-notify/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
	</channel>
</rss>

