<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.developwithpassion.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">

  <title><![CDATA[Develop With Passion®]]></title>
  
  <link href="http://blog.developwithpassion.com/" />
  <updated>2012-04-26T09:17:46-06:00</updated>
  <id>http://blog.developwithpassion.com/</id>
  <author>
    <name><![CDATA[Develop With Passion®]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.developwithpassion.com/JPBoodhoo" /><feedburner:info uri="jpboodhoo" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by/2.0/" /><logo>http://www.feedburner.com/fb/images/pub/fb_pwrd.gif</logo><feedburner:emailServiceId>JPBoodhoo</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><entry>
    <title type="html"><![CDATA[Screencast - Creating Linked Clones With VMWare Fusion]]></title>
    <link href="http://feeds.developwithpassion.com/~r/JPBoodhoo/~3/aQj3vDhsJlo/" />
    <updated>2012-04-17T09:27:00-06:00</updated>
    <id>http://blog.developwithpassion.com/2012/04/17/screencast-creating-linked-clones-with-vmware-fusion</id>
    <content type="html">&lt;p&gt;This is a short 11 minute video that walks you through the process of creating linked clones using VMWare Fusion.&lt;/p&gt;

&lt;p&gt;VMWare Fusion fully supports linked clones;unlike VMWare Workstation it does not yet have a UI to create and manage them.&lt;/p&gt;

&lt;p&gt;This video covers the main points:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How I organize and separate my vms from the vmdks.&lt;/li&gt;
&lt;li&gt;Creating linked clones&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;strong&gt;Shamless Plug&lt;/strong&gt; - Aside from the first click, no other mouse usage occured during the course of this video, courtesy of &lt;a href="http://keymando.com"&gt;keymando&lt;/a&gt;.&lt;/p&gt;

&lt;iframe src="http://player.vimeo.com/video/40497134 " width='400' height='255' frameborder='0' webKitAllowFullScreen mozillallowfullscreen allowFullScreen&gt;&lt;/iframe&gt;


&lt;p&gt;&lt;a href="http://www.developwithpassion.com"&gt;Develop With Passion®&lt;/a&gt;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=aQj3vDhsJlo:qn2-8ZYWClk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=aQj3vDhsJlo:qn2-8ZYWClk:XQ266DUsA9M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=XQ266DUsA9M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=aQj3vDhsJlo:qn2-8ZYWClk:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JPBoodhoo/~4/aQj3vDhsJlo" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.developwithpassion.com/2012/04/17/screencast-creating-linked-clones-with-vmware-fusion/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Fixing header file missing warnings on OSX with native gem compilation]]></title>
    <link href="http://feeds.developwithpassion.com/~r/JPBoodhoo/~3/pJdmJ3CV_Fc/" />
    <updated>2012-04-13T18:29:00-06:00</updated>
    <id>http://blog.developwithpassion.com/2012/04/13/fixing-header-file-missing-warnings-on-osx-with-native-gem-compilation</id>
    <content type="html">&lt;p&gt;Wiped away my install of XCode this evening to install the new version of Xcode (which I installed straight to /Applications!).&lt;/p&gt;

&lt;p&gt;Prior to doing this I also completely deleted the /Developer folder.&lt;/p&gt;

&lt;p&gt;Upon successfully reinstalling &lt;a href="http://beginrescueend.com"&gt;RVM&lt;/a&gt; and &lt;a href="https://github.com/mxcl/homebrew"&gt;homebrew&lt;/a&gt; using the &lt;a href="http://github.com/developwithpassion/devtools"&gt;devtools&lt;/a&gt;, I cd&amp;#8217;d into a rvm managed folder and did the standard bundle install, upon which time I eventually received this error:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;Error - error.sh  &lt;/span&gt;&lt;/figcaption&gt;
 &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='sh'&gt;&lt;span class='line'&gt;: fatal error: &lt;span class="s1"&gt;&amp;#39;stdio.h&amp;#39;&lt;/span&gt; file not found
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;I had installed the Command Line Tools for Xcode, but I had not yet switched where it should resolve those tools. Running the following command fixed the issue:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;Fix the missing header issue - fix.sh  &lt;/span&gt;&lt;/figcaption&gt;
 &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='sh'&gt;&lt;span class='line'&gt;sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;&lt;a href="http://www.developwithpassion.com"&gt;Develop With Passion®&lt;/a&gt;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=pJdmJ3CV_Fc:pI_M1hEj80Q:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=pJdmJ3CV_Fc:pI_M1hEj80Q:XQ266DUsA9M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=XQ266DUsA9M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=pJdmJ3CV_Fc:pI_M1hEj80Q:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JPBoodhoo/~4/pJdmJ3CV_Fc" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.developwithpassion.com/2012/04/13/fixing-header-file-missing-warnings-on-osx-with-native-gem-compilation/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Installing RVM with Cygwin On Windows]]></title>
    <link href="http://feeds.developwithpassion.com/~r/JPBoodhoo/~3/YCgLBw0VwEw/" />
    <updated>2012-03-30T18:19:00-06:00</updated>
    <id>http://blog.developwithpassion.com/2012/03/30/installing-rvm-with-cygwin-on-windows</id>
    <content type="html">&lt;p&gt;A couple of people have asked me how to get rvm working successfully on windows with cygwin.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ll write another post later about how I use &lt;a href="http://github.com/developwithpassion/devtools"&gt;devtools&lt;/a&gt; to successfully run msys and cygwin side by side from the same set of dotfiles (customized per environment)!&lt;/p&gt;

&lt;p&gt;I started with a brand new vm image with the software installed according to the post &lt;a href="http://blog.developwithpassion.com/2012/03/12/repaving-a-new-window-7-vm/"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you don&amp;#8217;t wish to read that previous post just know I installed cygwin to C:\utils\cygwin (for the purpose of this post it you are following along, I would suggest installing to that path also). I also included the following packages (some of these are not necessary for ruby compilation, but they have become my base for a cygwin install):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Archive

&lt;ul&gt;
&lt;li&gt;unzip - Unzipping zip files&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Net

&lt;ul&gt;
&lt;li&gt;openssl - bin and sources&lt;/li&gt;
&lt;li&gt;openssh - Only if you are not going to compile openssh yourself&lt;/li&gt;
&lt;li&gt;curl - download internet resources&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Devl

&lt;ul&gt;
&lt;li&gt;colorgcc&lt;/li&gt;
&lt;li&gt;gcc&lt;/li&gt;
&lt;li&gt;gcc-core - compiler&lt;/li&gt;
&lt;li&gt;git&lt;/li&gt;
&lt;li&gt;git-completion&lt;/li&gt;
&lt;li&gt;git-gui&lt;/li&gt;
&lt;li&gt;git-svn&lt;/li&gt;
&lt;li&gt;gitk&lt;/li&gt;
&lt;li&gt;libtool - Shared library generation tool. You&amp;#8217;ll need it when trying to compile rubies&lt;/li&gt;
&lt;li&gt;libncurses-devel - Used when compiling several other tools I use&lt;/li&gt;
&lt;li&gt;make&lt;/li&gt;
&lt;li&gt;mercurial&lt;/li&gt;
&lt;li&gt;openssl-devel - Required for compiling openssh (not necessarily required for rvm, but I always install it to compile openssh myself)&lt;/li&gt;
&lt;li&gt;readline&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Libs

&lt;ul&gt;
&lt;li&gt;zlib&lt;/li&gt;
&lt;li&gt;zlib-devel&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Utils

&lt;ul&gt;
&lt;li&gt;ncurses - Enabling better handling of terminal&lt;/li&gt;
&lt;li&gt;patch - Apply a diff file to an original. Again, you&amp;#8217;ll need it when rvm is trying to patch the ruby installs&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Once the cygwin install completes we can continue.&lt;/p&gt;

&lt;h2&gt;Setting Up&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Open up a new cygwin session (C:\utils\cygwin\cygwin.bat).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Issue the following commands in the cygwin session:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;Get The devtools - devtools.sh &lt;/span&gt;&lt;/figcaption&gt;
 &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='sh'&gt;&lt;span class='line'&gt;mkdir repositories
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;repositories
&lt;/span&gt;&lt;span class='line'&gt;mkdir developwithpassion
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;developwithpassion
&lt;/span&gt;&lt;span class='line'&gt;git clone git://github.com/developwithpassion/devtools
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;devtools
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;  The results should look as follows:&lt;/p&gt;

&lt;p&gt;&lt;img class="centered" src="https://img.skitch.com/20120415-8sw3uup1pamxd4gbr934s3hshd.jpg"&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You should now be sitting in the devtools folder so you can now run the kick_off_script:&lt;/li&gt;
&lt;/ul&gt;


&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;Prep - kick_off.sh &lt;/span&gt;&lt;/figcaption&gt;
 &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='sh'&gt;&lt;span class='line'&gt;./osx_or_cygwin_kick_off
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Repeat the above step(the first time you run it, it creates a settings file for your user that can be edited further if you are going to make further use of &lt;a href="http://github.com/developwithpassion/devtools"&gt;devtools&lt;/a&gt; later on)&lt;/p&gt;

&lt;p&gt;For the curious, the script is &lt;a href="https://raw.github.com/developwithpassion/devtools/master/osx_or_cygwin_kick_off"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The script does the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;kicks off an rvm installation script&lt;/li&gt;
&lt;li&gt;updates to the latest rvm&lt;/li&gt;
&lt;li&gt;installs a couple of rubies and sets 1.9.3 as the default ruby&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;The last step takes a little time to complete, but the end result is definitely worth it!!:&lt;/p&gt;

&lt;p&gt;&lt;img class="centered" src="https://img.skitch.com/20120331-1ix7mmijphenimhb4jui3cic45.jpg"&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.developwithpassion.com"&gt;Develop With Passion®&lt;/a&gt;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=YCgLBw0VwEw:-RGVKuC3ES8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=YCgLBw0VwEw:-RGVKuC3ES8:XQ266DUsA9M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=XQ266DUsA9M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=YCgLBw0VwEw:-RGVKuC3ES8:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JPBoodhoo/~4/YCgLBw0VwEw" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.developwithpassion.com/2012/03/30/installing-rvm-with-cygwin-on-windows/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Webinar - devtools - An walkthrough of my devtools setup]]></title>
    <link href="http://feeds.developwithpassion.com/~r/JPBoodhoo/~3/KCcfIY5-buU/" />
    <updated>2012-03-28T09:19:00-06:00</updated>
    <id>http://blog.developwithpassion.com/2012/03/28/webinar-devtools-an-walkthrough-of-my-devtools-setup</id>
    <content type="html">&lt;p&gt;Today I will be hosting a 1 hour webinar showing you how to get started with my &lt;a href="https://github.com/developwithpassion/devtools"&gt;devtools&lt;/a&gt; utilities.&lt;/p&gt;

&lt;p&gt;Here is the information for the webinar:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www1.gotomeeting.com/register/493822104"&gt;Reserve your Webinar seat now at:&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This webinar will be an opportunity for people to get an understanding of how I structure my devtools folder and how it is leveraged to facilitate working effectively between osx and windows.&lt;/p&gt;

&lt;p&gt;Title:  Develop With Passion® - devtools
Date:   Wednesday, March 28, 2012
Time:   12:00 PM - 1:00 PM MDT&lt;/p&gt;

&lt;p&gt;After registering you will receive a confirmation email containing information about joining the Webinar.&lt;/p&gt;

&lt;p&gt;System Requirements
* PC-based attendees
* Required: Windows® 7, Vista, XP or 2003 Server
* Macintosh®-based attendees
* Required: Mac OS® X 10.5 or newer&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.developwithpassion.com"&gt;Develop With Passion®&lt;/a&gt;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=KCcfIY5-buU:gCRt1-Jzk3Y:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=KCcfIY5-buU:gCRt1-Jzk3Y:XQ266DUsA9M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=XQ266DUsA9M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=KCcfIY5-buU:gCRt1-Jzk3Y:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JPBoodhoo/~4/KCcfIY5-buU" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.developwithpassion.com/2012/03/28/webinar-devtools-an-walkthrough-of-my-devtools-setup/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[April Brussels Course: Rescheduled]]></title>
    <link href="http://feeds.developwithpassion.com/~r/JPBoodhoo/~3/hKNFND-vhH8/" />
    <updated>2012-03-28T04:52:00-06:00</updated>
    <id>http://blog.developwithpassion.com/2012/03/28/april-brussels-course-postponed</id>
    <content type="html">&lt;p&gt;I am sorry to announce that next month&amp;#8217;s .Net Software Craftmanship BootCamp in Brussels, has been rescheduled until the week of September 17th.&lt;/p&gt;

&lt;p&gt;Being our first time in Brussels, we are hoping that pushing back the date will provide more people with an opportunity to convince their bosses that the course is a good investment!&lt;/p&gt;

&lt;p&gt;I apologize for any inconvienience this may cause.&lt;/p&gt;

&lt;p&gt;God Bless You.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.developwithpassion.com"&gt;Develop With Passion®&lt;/a&gt;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=hKNFND-vhH8:rRpkbB0IJco:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=hKNFND-vhH8:rRpkbB0IJco:XQ266DUsA9M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=XQ266DUsA9M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=hKNFND-vhH8:rRpkbB0IJco:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JPBoodhoo/~4/hKNFND-vhH8" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.developwithpassion.com/2012/03/28/april-brussels-course-postponed/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[April UK Course Rescheduled Until The Week of September 10th]]></title>
    <link href="http://feeds.developwithpassion.com/~r/JPBoodhoo/~3/69PmAvgTDSY/" />
    <updated>2012-03-28T04:46:00-06:00</updated>
    <id>http://blog.developwithpassion.com/2012/03/28/april-uk-course-postponed-until-the-week-of-september-10th</id>
    <content type="html">&lt;p&gt;I am sorry to announce that next month&amp;#8217;s .Net Software Craftmanship BootCamp in the UK, has been rescheduled until the week of September 10th.&lt;/p&gt;

&lt;p&gt;Since we only come to the UK once a year, we are hoping that pushing back the date will provide more people with an opportunity to convince their bosses that the course is a good investment!&lt;/p&gt;

&lt;p&gt;I apologize for any inconvienience this may cause.&lt;/p&gt;

&lt;p&gt;God Bless You.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.developwithpassion.com"&gt;Develop With Passion®&lt;/a&gt;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=69PmAvgTDSY:8zGVbBqcjVM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=69PmAvgTDSY:8zGVbBqcjVM:XQ266DUsA9M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=XQ266DUsA9M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=69PmAvgTDSY:8zGVbBqcjVM:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JPBoodhoo/~4/69PmAvgTDSY" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.developwithpassion.com/2012/03/28/april-uk-course-postponed-until-the-week-of-september-10th/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[New Feature: fakes-rspec - multiple args sets captured on ignored/unexpected methods]]></title>
    <link href="http://feeds.developwithpassion.com/~r/JPBoodhoo/~3/rI02aVtzGEE/" />
    <updated>2012-03-27T23:02:00-06:00</updated>
    <id>http://blog.developwithpassion.com/2012/03/27/new-feature-fakes-rspec-multiple-args-sets-captured-on-ignored-slash-unexpected-methods</id>
    <content type="html">&lt;p&gt;Just added a new feature to fakes-rspec to handle a scenario I ran into. The following test will hopefully explain it:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;Interrogating Multiple Argument Sets on the same ignored method - ignored.rb &lt;/span&gt;&lt;/figcaption&gt;
 &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;span class='line-number'&gt;17&lt;/span&gt;
&lt;span class='line-number'&gt;18&lt;/span&gt;
&lt;span class='line-number'&gt;19&lt;/span&gt;
&lt;span class='line-number'&gt;20&lt;/span&gt;
&lt;span class='line-number'&gt;21&lt;/span&gt;
&lt;span class='line-number'&gt;22&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='rb'&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;when expanding all of the items&amp;quot;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;let&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:folder&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;item&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;let&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:target&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;blah&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;let&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:sources&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;let&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:args&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;&lt;span class="ss"&gt;:sources&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;sources&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="ss"&gt;:shell&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;fake&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;#this syntax is incorrect, but the formatting was getting garbled&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="no"&gt;Copy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;before&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:each&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="sx"&gt;%w[1 2 3]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;each&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;sources&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;before&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:each&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="n"&gt;subject&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;expand_all_items&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;should copy each of the sources to the target&amp;quot;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="n"&gt;sources&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;      &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;cp -rf &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;      &lt;span class="n"&gt;shell&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;should&lt;/span&gt; &lt;span class="n"&gt;have_received&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:run&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;The following line:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;Verifying a Call - verify.rb &lt;/span&gt;&lt;/figcaption&gt;
 &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='rb'&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;shell&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;should&lt;/span&gt; &lt;span class="n"&gt;have_received&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:run&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;I am testing to see whether the run method (which was never set up to get explicitly called), was actually called 3 different times, and am also verifying that each time it was called it was called with a specific set of arguments.&lt;/p&gt;

&lt;p&gt;In the test above I am verifying that for each &amp;#8220;source&amp;#8221;, a call was made to do a recursive, forced copy, to the &amp;#8220;target&amp;#8221; location.&lt;/p&gt;

&lt;p&gt;Not needing to specify the call while also being able to verify each of the argument sets on each of the 3 invocations of the same method is handy, and introduced solely so I could support this feature that I was working on.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.developwithpassion.com"&gt;Develop With Passion®&lt;/a&gt;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=rI02aVtzGEE:CN_juwHM0NQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=rI02aVtzGEE:CN_juwHM0NQ:XQ266DUsA9M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=XQ266DUsA9M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=rI02aVtzGEE:CN_juwHM0NQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JPBoodhoo/~4/rI02aVtzGEE" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.developwithpassion.com/2012/03/27/new-feature-fakes-rspec-multiple-args-sets-captured-on-ignored-slash-unexpected-methods/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Introducing: fakes-rspec]]></title>
    <link href="http://feeds.developwithpassion.com/~r/JPBoodhoo/~3/Li9NbkG9kYY/" />
    <updated>2012-03-26T17:44:00-06:00</updated>
    <id>http://blog.developwithpassion.com/2012/03/26/introducing-fakes-rspec</id>
    <content type="html">&lt;p&gt;This is a library to aid in the usage of &lt;a href="http://github.com/developwithpassion/fakes"&gt;fakes&lt;/a&gt; when using &lt;a href="https://github.com/rspec/rspec"&gt;RSpec&lt;/a&gt;. It adds a bunch of convienience methods and matchers to aid in the usage of the heavily AAA style isolation library.&lt;/p&gt;

&lt;h2&gt;Installation&lt;/h2&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;Installing - install.sh &lt;/span&gt;&lt;/figcaption&gt;
 &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='sh'&gt;&lt;span class='line'&gt;gem install fakes-rspec
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Or (preferably using bundler), in your gemfile:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;Bundler - gemfile.rb &lt;/span&gt;&lt;/figcaption&gt;
 &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='rb'&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;source&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;http://rubygems.org&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;fakes-rspec&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;When you install the gem it will install the rspec gem also, so you will immediately ready to go.&lt;/p&gt;

&lt;h2&gt;Usage&lt;/h2&gt;

&lt;h2&gt;Creating a fake&lt;/h2&gt;

&lt;h3&gt;Using a let block&lt;/h3&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;Let Initialization - let.rb &lt;/span&gt;&lt;/figcaption&gt;
 &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='rb'&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;describe&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Some Feature&amp;quot;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;let&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:my_fake&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;&lt;span class="n"&gt;fake&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;h3&gt;Inline&lt;/h3&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;Inline Initialization - inline.rb &lt;/span&gt;&lt;/figcaption&gt;
 &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='rb'&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;describe&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Some Feature&amp;quot;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;should be able to create a fake&amp;quot;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fake&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;h2&gt;Configuring a fake with return values for calls&lt;/h2&gt;

&lt;h3&gt;Irrespective of arguments:&lt;/h3&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;Faking Return Values Regardless Of Arguments - code.rb &lt;/span&gt;&lt;/figcaption&gt;
 &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='rb'&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;should be able to setup a fakes return values&amp;quot;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;the_fake&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fake&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;fake&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:hello&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;and_return&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;World&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;fake&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hello&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;should&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;World&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;fake&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;There&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;should&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;World&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;h3&gt;Caring about arguments:&lt;/h3&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;Faking Return Values With Specific Sets Of Arguments - specific_arguments.rb &lt;/span&gt;&lt;/figcaption&gt;
 &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='rb'&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;should be able to setup a fakes return values&amp;quot;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;the_fake&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fake&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;fake&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:hello&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;with&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;There&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;and_return&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;World&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;fake&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:hello&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;with&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;You&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;and_return&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Again&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;fake&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:hello&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;and_return&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Does Not Matter&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# when you use the catch_all, make sure that it is the last step used for a particular method (as above)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;fake&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;There&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;should&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;World&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;fake&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;You&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;should&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Again&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;fake&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hello&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;should&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Does Not Matter&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;h2&gt;Determining whether a call was made&lt;/h2&gt;

&lt;p&gt;One of the big strengths of this library compared to some of the other ruby isolation libraries is the ability to let you make assertions against the fake after the [subject] has run its code. The following examples demonstrate some typical usage scenarios:&lt;/p&gt;

&lt;h3&gt;Irrespective of arguments:&lt;/h3&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;Verifying Call Made Ignoring Arguments - call_verify_ignoring_arguments.rb &lt;/span&gt;&lt;/figcaption&gt;
 &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='rb'&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;should be able to determine if a call was made on a fake&amp;quot;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;the_fake&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fake&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;fake&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;World&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;fake&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;should&lt;/span&gt; &lt;span class="n"&gt;have_received&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:hello&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;#true&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;h3&gt;With a specific set of arguments:&lt;/h3&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;Verifying Calls Made With Specific Arguments - verifying_calls_made_with_specific_arguments.rb &lt;/span&gt;&lt;/figcaption&gt;
 &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='rb'&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;should be able to determine if a call was made on a fake&amp;quot;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;the_fake&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fake&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;fake&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;World&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;fake&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;should&lt;/span&gt; &lt;span class="n"&gt;have_received&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:hello&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;World&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;#true&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;fake&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;should&lt;/span&gt; &lt;span class="n"&gt;have_received&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:hello&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Other&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;#false&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Remember, that because it is just a matcher, to negate the matcher you can use the should_not qualifier to do the opposite:&lt;/p&gt;

&lt;h3&gt;Determine whether a call was not made with a specific set of arguments:&lt;/h3&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;Verifying A Call Was Not Made With A Specific Set Of Arguments - not_made_with_specific_arguments.rb &lt;/span&gt;&lt;/figcaption&gt;
 &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='rb'&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;should be able to determine if a call was not made on a fake&amp;quot;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;the_fake&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fake&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;fake&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;World&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;fake&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;should_not&lt;/span&gt; &lt;span class="n"&gt;have_received&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:hello&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Other&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;#true&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;h2&gt;Determining that a call was made a certain number of times&lt;/h2&gt;

&lt;h3&gt;Irrespective of arguments:&lt;/h3&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;Verifying Occurences Of A Call Ignoring Arguments - verifying_occurences_ignoring_arguments.rb &lt;/span&gt;&lt;/figcaption&gt;
 &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='rb'&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;should be able to determine if a call was made on a fake&amp;quot;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;the_fake&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fake&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;fake&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;World&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;fake&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;should&lt;/span&gt; &lt;span class="n"&gt;have_received&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:hello&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;once&lt;/span&gt; &lt;span class="c1"&gt;#true&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;h3&gt;Caring about arguments:&lt;/h3&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;Verifying Occurences Of A Call Including Arguments - verifying_occurences_including_arguments.rb &lt;/span&gt;&lt;/figcaption&gt;
 &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='rb'&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;should be able to determine if a call was made on a fake&amp;quot;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;the_fake&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fake&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;fake&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;World&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;fake&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;should&lt;/span&gt; &lt;span class="n"&gt;have_received&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:hello&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;World&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;once&lt;/span&gt; &lt;span class="c1"&gt;#true&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;fake&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;should&lt;/span&gt; &lt;span class="n"&gt;have_received&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:hello&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Earth&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;once&lt;/span&gt; &lt;span class="c1"&gt;#false&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Remember, that because it is just a matcher, to negate the matcher you can use the should_not qualifier to do the opposite:&lt;/p&gt;

&lt;h3&gt;Determine whether a call was not made a specific number of times with a specific set of arguments:&lt;/h3&gt;

&lt;figure class='code'&gt; &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;should be able to determine if a call was made on a fake&amp;quot;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;the_fake&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fake&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;fake&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;World&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;fake&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;should_not&lt;/span&gt; &lt;span class="n"&gt;have_received&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:hello&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;World&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;twice&lt;/span&gt; &lt;span class="c1"&gt;#true&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;fake&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;should_not&lt;/span&gt; &lt;span class="n"&gt;have_received&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:hello&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;twice&lt;/span&gt; &lt;span class="c1"&gt;#true&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;After calling have_received, you can specify occurences using one of the following methods:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;once&lt;/li&gt;
&lt;li&gt;twice&lt;/li&gt;
&lt;li&gt;at_least_once&lt;/li&gt;
&lt;li&gt;at_least_twice&lt;/li&gt;
&lt;li&gt;at_most_once&lt;/li&gt;
&lt;li&gt;at_most_twice&lt;/li&gt;
&lt;li&gt;at_least(times)&lt;/li&gt;
&lt;li&gt;at_most(times)&lt;/li&gt;
&lt;li&gt;exactly(times)&lt;/li&gt;
&lt;li&gt;occurs(match_block) - Where match_block is a proc/lambda that matches the signature lambda{|number| bool}&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;An example of using the occurs method would be as follows:&lt;/p&gt;

&lt;h3&gt;Determine whether a call was not made between a certain number of times&lt;/h3&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;Verifying Calls Using Occurs - occurs.rb &lt;/span&gt;&lt;/figcaption&gt;
 &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='rb'&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;should be able to determine if a call was made on a fake&amp;quot;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;the_fake&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fake&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;fake&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;World&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;fake&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Again&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;fake&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;should&lt;/span&gt; &lt;span class="n"&gt;have_received&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:hello&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;occurs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;lambda&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="c1"&gt;#true&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;h2&gt;Contributing&lt;/h2&gt;

&lt;p&gt;Feel free to &lt;a href="https://github.com/developwithpassion/fakes-rspec/fork_select"&gt;fork&lt;/a&gt; this codebase and submit any pull requests you think would be useful.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.developwithpassion.com"&gt;Develop With Passion®&lt;/a&gt;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=Li9NbkG9kYY:xj8gO_GNnuI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=Li9NbkG9kYY:xj8gO_GNnuI:XQ266DUsA9M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=XQ266DUsA9M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=Li9NbkG9kYY:xj8gO_GNnuI:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JPBoodhoo/~4/Li9NbkG9kYY" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.developwithpassion.com/2012/03/26/introducing-fakes-rspec/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Screencast: Freeing Up System Memory on OSX]]></title>
    <link href="http://feeds.developwithpassion.com/~r/JPBoodhoo/~3/FaklZy12lJw/" />
    <updated>2012-03-15T09:01:00-06:00</updated>
    <id>http://blog.developwithpassion.com/2012/03/15/screencast-freeing-up-system-memory-on-osx</id>
    <content type="html">&lt;p&gt;In this quick video I show you how to use the purge command to quickly free up virtual memory on your machine.&lt;/p&gt;

&lt;p&gt;Because I run a fair amount of vms on my machine, at any point in the day I can look at my memory usage and realize that I have almost no memory availabe.&lt;/p&gt;

&lt;p&gt;For those that don&amp;#8217;t want to watch the video (it&amp;#8217;s only 2 minutes), I start the video having almost 6.81GB inactive and only 284.7GB available (and this is a 16GB machine.)&lt;/p&gt;

&lt;p&gt;The long and short is I run the following command:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;Free Up Your Memory - purge_memory.sh  &lt;/span&gt;&lt;/figcaption&gt;
 &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='sh'&gt;&lt;span class='line'&gt;purge
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;After the command finished running, I had only 138.6MB of inactive memory and 9.56GB of free memory!!&lt;/p&gt;

&lt;p&gt;Here is the video:&lt;/p&gt;

&lt;iframe src="http://player.vimeo.com/video/38572779 " width='400' height='255' frameborder='0' webKitAllowFullScreen mozillallowfullscreen allowFullScreen&gt;&lt;/iframe&gt;


&lt;p&gt;&lt;a href="http://www.developwithpassion.com"&gt;Develop With Passion®&lt;/a&gt;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=FaklZy12lJw:KBTPPlAqo74:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=FaklZy12lJw:KBTPPlAqo74:XQ266DUsA9M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=XQ266DUsA9M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=FaklZy12lJw:KBTPPlAqo74:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JPBoodhoo/~4/FaklZy12lJw" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.developwithpassion.com/2012/03/15/screencast-freeing-up-system-memory-on-osx/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Repaving a new Windows 7 VM]]></title>
    <link href="http://feeds.developwithpassion.com/~r/JPBoodhoo/~3/6q1bKkKKGqI/" />
    <updated>2012-03-12T09:15:00-06:00</updated>
    <id>http://blog.developwithpassion.com/2012/03/12/repaving-a-new-window-7-vm</id>
    <content type="html">&lt;p&gt;On Thurday my windows vm image died along with my backup of it!!&lt;/p&gt;

&lt;p&gt;I thought this was a good opportunity to repave a brand new vm that I can also create linked clones from to quickly scaffold new vm&amp;#8217;s moving forward.&lt;/p&gt;

&lt;p&gt;This post is mostly to help me remember the install process and the base tools that I install on a fresh windows 7 vm, as this is not something I do very often!! I included screenshots of most of the install steps, just so I can both remind myself what my defaults are, as well as for your benefit if you wish to copy this setup.&lt;/p&gt;

&lt;h2&gt;Base Tools Install&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="http://www.ntwind.com/software/vistaswitcher/download.html"&gt;Vista Switcher&lt;/a&gt;
 &lt;img class="centered" src="http://img.skitch.com/20120312-1xpe8rkihtbti8bi7ny7m17sc3.jpg"&gt;
 &lt;img class="centered" src="https://img.skitch.com/20120312-dusptjfftx1w4u363eqbjbwgn6.jpg"&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://rubyinstaller.org/downloads/"&gt;Ruby&lt;/a&gt;
 &lt;img class="centered" src="https://img.skitch.com/20120417-8eg1kmdq7medirmy7ssi9f1i6d.jpg"&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://sourceforge.net/projects/mingw/files/Installer/"&gt;MinGW&lt;/a&gt;
 &lt;img class="centered" src="https://img.skitch.com/20120312-tdxfh2jm2g6a4j9c56jjscffwa.jpg"&gt;
 &lt;img class="centered" src="https://img.skitch.com/20120312-qxe4ktaj9gb3njbs9kxe4k4815.jpg"&gt;
 &lt;img class="centered" src="https://img.skitch.com/20120312-qr4263hkwifxhc949jay5r9d5m.jpg"&gt;
 &lt;img class="centered" src="https://img.skitch.com/20120312-8fqc842ijwnyx5as7dkfpdihum.jpg"&gt;
 &lt;img class="centered" src="https://img.skitch.com/20120312-jxgg9ihgj4ggxjep4upxsc6jtx.jpg"&gt;&lt;/li&gt;
&lt;li&gt;Autohotkey
 &lt;img class="centered" src="http://img.skitch.com/20120312-f3ehi51ir2mqqx5i3x1pewpe3m.jpg"&gt;
 &lt;img class="centered" src="http://img.skitch.com/20120312-g3rkx6ihgfr35pmfuw7ubpnc4x.jpg"&gt;
 &lt;img class="centered" src="http://img.skitch.com/20120312-cghgifmy7dsq3ige5k793jy3pd.jpg"&gt;&lt;/li&gt;
&lt;li&gt;Copy the contents of /to_backup/new_windows_install/startup_software/utils to /c/utils. This folder contains:

&lt;ul&gt;
&lt;li&gt;sysinternals&lt;/li&gt;
&lt;li&gt;myuninstaller&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.scootersoftware.com/download.php"&gt;Beyond Compare&lt;/a&gt;
 &lt;img class="centered" src="http://img.skitch.com/20120312-ka9bmr2kndp22tup6dctd1ybrt.jpg"&gt;
 &lt;img class="centered" src="http://img.skitch.com/20120312-tftdp5xk875g73q9shnewy7bek.jpg"&gt;
 &lt;img class="centered" src="http://img.skitch.com/20120312-ex7nfxha9aya4jyerkhstjmuec.jpg"&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.1space.dk/executor/download.html"&gt;Executor&lt;/a&gt;
 &lt;img class="centered" src="http://img.skitch.com/20120312-nqdearkgwdx8q77rnhpdhnyc81.jpg"&gt;
 &lt;img class="centered" src="http://img.skitch.com/20120312-tdwp3ukimbpsrtrsa3p6x8jb7h.jpg"&gt;
 &lt;img class="centered" src="http://img.skitch.com/20120312-c9knb43uq9ep2erx3qdmi3kgse.jpg"&gt;
 &lt;img class="centered" src="http://img.skitch.com/20120312-8pb625hra27aaup5s5ywgwjyg2.jpg"&gt;
 &lt;img class="centered" src="http://img.skitch.com/20120312-grjegt4fjxur83wpcpbpjr1s6n.jpg"&gt;
 &lt;img class="centered" src="http://img.skitch.com/20120312-egr8u1fbkpsh4k6m8fcp93e5f2.jpg"&gt;
 &lt;img class="centered" src="http://img.skitch.com/20120312-jypj1a6aapd9e41ahdg2kpyda1.jpg"&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.emptyloop.com/unlocker/"&gt;Unlocker&lt;/a&gt;
 &lt;img class="centered" src="http://img.skitch.com/20120312-8s84c89cy5gnn83812cwm5g8sh.jpg"&gt;
 &lt;img class="centered" src="http://img.skitch.com/20120312-mgwcr5ynb43167fxeqymfkh7cs.jpg"&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://code.google.com/p/msysgit/downloads/list"&gt;msysgit&lt;/a&gt;
 &lt;img class="centered" src="http://img.skitch.com/20120312-c4sn9mehad9kdp1nyqkitenbke.jpg"&gt;
 &lt;img class="centered" src="http://img.skitch.com/20120312-ndn2rt75g27gfhnex5cks4x4tf.jpg"&gt;
 &lt;img class="centered" src="http://img.skitch.com/20120312-rqw8g91j95y4357sd4k3bxibri.jpg"&gt;
 &lt;img class="centered" src="https://img.skitch.com/20120417-xk9b2q7rdf297p3npx5k1s1g73.jpg"&gt;
 &lt;img class="centered" src="http://img.skitch.com/20120312-t3rh2n9gfpb6mimjfipk7kgndh.jpg"&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="ftp://ftp.vim.org/pub/vim/pc/gvim73_46.exe"&gt;gvim&lt;/a&gt;
&lt;img class="centered" src="http://img.skitch.com/20120312-dq3n1ab22mq6nw72p2r2qmjec2.jpg"&gt;
&lt;img class="centered" src="http://img.skitch.com/20120312-cuds5yn1jxuet4nd9gm49ud79p.jpg"&gt;
&lt;img class="centered" src="http://img.skitch.com/20120312-qbitgimwn6tsqak5hyufktcpyj.jpg"&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://www.cygwin.com/"&gt;cygwin&lt;/a&gt;
&lt;img class="centered" src="https://img.skitch.com/20120417-kn8tdfutqnih5yfw8r645xeihy.jpg"&gt;
&lt;img class="centered" src="https://img.skitch.com/20120417-xxc1s4hwgtgih3438eattc3bc9.jpg"&gt;
&lt;img class="centered" src="https://img.skitch.com/20120417-g4xuuy9pmxc42hjsbaswj15km4.jpg"&gt;
&lt;img class="centered" src="https://img.skitch.com/20120417-d5sa1uymet4u3h17mqjwi3q6cf.jpg"&gt;
&lt;img class="centered" src="https://img.skitch.com/20120417-cybastr9d32gtc172gey8u7fup.jpg"&gt;
Install the following packages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Archive

&lt;ul&gt;
&lt;li&gt;unzip - Unzipping zip files&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Net

&lt;ul&gt;
&lt;li&gt;openssl - bin and sources&lt;/li&gt;
&lt;li&gt;openssh - Only if you are not going to compile openssh yourself&lt;/li&gt;
&lt;li&gt;curl - download internet resources&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Devl

&lt;ul&gt;
&lt;li&gt;colorgcc&lt;/li&gt;
&lt;li&gt;gcc&lt;/li&gt;
&lt;li&gt;gcc-core - compiler&lt;/li&gt;
&lt;li&gt;git&lt;/li&gt;
&lt;li&gt;git-completion&lt;/li&gt;
&lt;li&gt;git-gui&lt;/li&gt;
&lt;li&gt;git-svn&lt;/li&gt;
&lt;li&gt;gitk&lt;/li&gt;
&lt;li&gt;libtool - Shared library generation tool. You&amp;#8217;ll need it when trying to compile rubies&lt;/li&gt;
&lt;li&gt;libncurses-devel - Used when compiling several other tools I use&lt;/li&gt;
&lt;li&gt;make&lt;/li&gt;
&lt;li&gt;mercurial&lt;/li&gt;
&lt;li&gt;openssl-devel - Required for compiling openssh (not necessarily required for rvm, but I always install it to compile openssh myself)&lt;/li&gt;
&lt;li&gt;readline&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Utils

&lt;ul&gt;
&lt;li&gt;ncurses - Enabling better handling of terminal&lt;/li&gt;
&lt;li&gt;patch - Apply a diff file to an original. Again, you&amp;#8217;ll need it when rvm is trying to patch the ruby installs&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;img class="centered" src="https://img.skitch.com/20120417-xg7ygk74y94j11rn1hgu2p6epi.jpg"&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;Along with the tools outlined above I also manually compiled the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://github.com/developwithpassion/dvtm"&gt;dvtm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.vim.org"&gt;vim&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="git://git.savannah.gnu.org/screen.git"&gt;screen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="git://zsh.git.sf.net/gitroot/zsh/zsh"&gt;zsh&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Well that&amp;#8217;s it for the base tool install!! There are a couple of other steps I do to configure msys and cygwin to play nice together, but that&amp;#8217;s another post!! Outside of that, this is what constitutes my bare minimum for a usable windows vm. From this base image, I can create &lt;a href="http://blog.developwithpassion.com/2012/04/17/screencast-creating-linked-clones-with-vmware-fusion/"&gt;linked clones&lt;/a&gt; that allow me to create project specific vm&amp;#8217;s that have further tools installed (such as vs, vs.net etc) specific to the contract/project I am working on.&lt;/p&gt;

&lt;h2&gt;Still To Come&lt;/h2&gt;

&lt;p&gt;In a follow up post I&amp;#8217;ll detail a set of tools, scripts and code that allows me to configure this entire toolset, so that I can have a seamless environment that supports :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vim with a host of my favourite plugins&lt;/li&gt;
&lt;li&gt;An organized eaash environment with well partitioned dotfiles etc&lt;/li&gt;
&lt;li&gt;Simple, plugin style automation tasks&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Most importantly, the bash/vim/automation setup I have allows me to share all of the important scripts such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;dotfiles&lt;/li&gt;
&lt;li&gt;automation scripts&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;On all three of the main environments I work in :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OSX&lt;/li&gt;
&lt;li&gt;Ubuntu&lt;/li&gt;
&lt;li&gt;Windows (cygwin and mingw)&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Until next time!!&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.developwithpassion.com"&gt;Develop With Passion®&lt;/a&gt;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=6q1bKkKKGqI:ulxy_RiCW8Y:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=6q1bKkKKGqI:ulxy_RiCW8Y:XQ266DUsA9M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=XQ266DUsA9M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=6q1bKkKKGqI:ulxy_RiCW8Y:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JPBoodhoo/~4/6q1bKkKKGqI" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.developwithpassion.com/2012/03/12/repaving-a-new-window-7-vm/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Keymando vNext - Automate Your OSX World]]></title>
    <link href="http://feeds.developwithpassion.com/~r/JPBoodhoo/~3/q-wKdZjOBjE/" />
    <updated>2012-02-27T09:00:00-07:00</updated>
    <id>http://blog.developwithpassion.com/2012/02/27/keymando-vnext-automate-your-osx-world</id>
    <content type="html">&lt;p&gt;Between working full time jobs and lots of other responsibilities, Kevin and I are putting the final touches on the next release of &lt;a href="http://keymando.com"&gt;Keymando&lt;/a&gt;!!&lt;/p&gt;

&lt;p&gt;For a long time, we have observed that a large majority of Keymando users are using the tool for just basic shortcut remapping. Since we both use this tool all the time, it is now time to show off some of things it can do, and believe me when I say, that using it for jusk key remapping is a big waste of its potential.&lt;/p&gt;

&lt;p&gt;Over the course of the next couple of weeks, I am going to be giving presentations to existing, and hopefully some new users, to show them what they can do with this tool, and the infinite customizations that are now possible with a bit of Ruby magic!!&lt;/p&gt;

&lt;p&gt;If you take a look at my current &lt;a href="https://github.com/developwithpassion/keymando_files"&gt;Keymando Configuration Scripts&lt;/a&gt; you can see how &amp;#8220;basic&amp;#8221; my regular shortcut mapping is:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;keymandorc.rb &lt;/span&gt;&lt;/figcaption&gt;
 &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;span class='line-number'&gt;17&lt;/span&gt;
&lt;span class='line-number'&gt;18&lt;/span&gt;
&lt;span class='line-number'&gt;19&lt;/span&gt;
&lt;span class='line-number'&gt;20&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='rb'&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;toggle&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;Cmd-9&amp;gt;&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;Cmd-e&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;Escape&amp;gt;&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;Cmd-Shift-d&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;Cmd-Shift-Tab&amp;gt;&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;Cmd-d&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;current_app_windows&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;Cmd-f&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;trigger_app&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;Cmd-Shift-f&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;Cmd-Tab&amp;gt;&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;Cmd-h&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;Left&amp;gt;&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;Cmd-j&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;Down&amp;gt;&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;Cmd-k&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;Up&amp;gt;&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;Cmd-l&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;Right&amp;gt;&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;Cmd-m&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;Tab&amp;gt;&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;Cmd-,&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;Shift-Tab&amp;gt;&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;Cmd-n&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;Ctrl-n&amp;gt;&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;Cmd-r&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;RightClick&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;Cmd-0&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;Cmd-Shift-D&amp;gt;&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;Cmd-o&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="no"&gt;RunLastCommand&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;Cmd- &amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;launch_app&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;Cmd-i&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;RunHistoryItem&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;Cmd-p&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hit_a_hint&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;Cmd-y&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;run_registered_command&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;The 2 biggest new changes to the Keymando internal engine is that almost everything is modelled as commands. This allows for history, replaying and a host of other features. And the 2nd biggest new feature is the addition of an automation layer we are dubbing the Keymando Automation Engine. To see this engine in action, take a look at my script to manipulate iTunes:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;Creating Command To Press iTunes Menu Items - itunes.rb &lt;/span&gt;&lt;/figcaption&gt;
 &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='rb'&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;itunes_command_for_button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;iTunes Play&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sr"&gt;/Play\s*space/&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;itunes_command_for_button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;iTunes Pause&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sr"&gt;/Pause\s*space/&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;itunes_command_for_button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;iTunes Stop&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sr"&gt;/Stop\s*space/&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;itunes_command_for_button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;iTunes Previous Song&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sr"&gt;/Previous/&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;itunes_command_for_button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;iTunes Next Song&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sr"&gt;/Next/&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;itunes_command_for_button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;iTunes Increase Volume&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sr"&gt;/Increase Volume/&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;itunes_command_for_button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Decrease iTunes Volume&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sr"&gt;/Decrease Volume/&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;This is code in one of my configuration scripts under my plugins folder. It will setup one command for each iTunes function. Here is the code for the itunes_command_for_button method (written in the same plugin script):&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;Leveraging The Command DSL - command.rb &lt;/span&gt;&lt;/figcaption&gt;
 &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='rb'&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;itunes_command_for_button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;name_reg_ex&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="no"&gt;Command&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to_run&lt;/span&gt; &lt;span class="ss"&gt;:description&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;name&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="n"&gt;add_block&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;      &lt;span class="n"&gt;itunes_button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name_reg_ex&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;press&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Notice the use of the simple dsl for registering a command. This is one of 2 dsl&amp;#8217;s for registering commands. At the completion of the dsl block, a new command with the name provided in the description will be place in the set of available commands to run. And finally, the itunes_button method, shows the use of the Keymando Automation Engine to find the actual button:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;Using The Keymando Accessiblity API - accessiblity.rb &lt;/span&gt;&lt;/figcaption&gt;
 &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='rb'&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;itunes_button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name_reg_ex&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Accessibility&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Gateway&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_application_by_name&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;itunes&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;menu_bar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;first_item_matching&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:title&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;Matches&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;regex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name_reg_ex&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;I will be doing more posts on the Automation Engine over the next little while. In the meantime, looking through the scripts in my GitHub repository should give you an idea of what some of the capabilities are.&lt;/p&gt;

&lt;p&gt;The net result of registering all of those commands is that when I press Cmd-y (which is my mapping to run a registered command), it will pop up a list of all of the registered commands based on my settings:&lt;/p&gt;

&lt;div class="thumbnail"&gt;&lt;a href="http://skitch.com/jpboodhoo/8fff6/keymando"&gt;&lt;img src="http://img.skitch.com/20120227-ntncga3g9f32ncb1yq7rm773ae.preview.jpg" alt="Keymando" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span&gt;Uploaded with &lt;a href="http://skitch.com"&gt;Skitch&lt;/a&gt;!&lt;/span&gt;&lt;/div&gt;


&lt;p&gt;&lt;a href="http://www.developwithpassion.com"&gt;Develop With Passion®&lt;/a&gt;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=q-wKdZjOBjE:5V9OGpii3I0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=q-wKdZjOBjE:5V9OGpii3I0:XQ266DUsA9M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=XQ266DUsA9M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=q-wKdZjOBjE:5V9OGpii3I0:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JPBoodhoo/~4/q-wKdZjOBjE" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.developwithpassion.com/2012/02/27/keymando-vnext-automate-your-osx-world/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[developwithpassion_fakes - A Simple Interception Library For Ruby Devs]]></title>
    <link href="http://feeds.developwithpassion.com/~r/JPBoodhoo/~3/9JimpoX4nn8/" />
    <updated>2012-02-27T08:00:00-07:00</updated>
    <id>http://blog.developwithpassion.com/2012/02/27/developwithpassion_fakes-a-simple-interception-library-for-ruby-devs</id>
    <content type="html">&lt;p&gt;This is a really simple library to aid in AAA style testing. The primary driver for using this is to be able to make assertions on method calls to collaborators in actual assertions and not as part of setup. It is meant to be used to complement the current testing framework that you are using to aid you when you are wanting to write an interaction based tests.&lt;/p&gt;

&lt;h2&gt;Installing&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Just gem install developwithpassion_fakes. Or place and entry in your Gemfile and let &lt;a href="http://gembundler.com/"&gt;bundler&lt;/a&gt; do the rest!&lt;/li&gt;
&lt;li&gt;Import the library in the test files you are writing (I usually just place this line in my spec_helper file and forget about it):&lt;/li&gt;
&lt;/ol&gt;


&lt;figure class='code'&gt; &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='line'&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;developwithpassion_fakes&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;h2&gt;Where&amp;#8217;s the code&lt;/h2&gt;

&lt;p&gt;Code for the library is on &lt;a href="https://github.com/developwithpassion/developwithpassion_fakes"&gt;GitHub&lt;/a&gt;. It was written test first, and it was kept clean and small on purpose, as it is meant to be used in conjunction with your existing testing solution.&lt;/p&gt;

&lt;h2&gt;Working with the library&lt;/h2&gt;

&lt;p&gt;Here is a simple example&lt;/p&gt;

&lt;figure class='code'&gt; &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;span class='line-number'&gt;17&lt;/span&gt;
&lt;span class='line-number'&gt;18&lt;/span&gt;
&lt;span class='line-number'&gt;19&lt;/span&gt;
&lt;span class='line-number'&gt;20&lt;/span&gt;
&lt;span class='line-number'&gt;21&lt;/span&gt;
&lt;span class='line-number'&gt;22&lt;/span&gt;
&lt;span class='line-number'&gt;23&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SomeClass&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;collaborator&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="vi"&gt;@collaborator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;collaborator&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="vi"&gt;@collaborator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;send_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Hi&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;describe&lt;/span&gt; &lt;span class="no"&gt;SomeClass&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt; &lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;when run&amp;quot;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;let&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:collaborator&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;&lt;span class="no"&gt;DevelopWithPassion&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Fakes&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Fake&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;let&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:sut&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;&lt;span class="no"&gt;SomeClass&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;collaborator&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;before&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:each&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="n"&gt;sut&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;should trigger its collaborator with the correct message&amp;quot;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="n"&gt;collaborator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;received&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:send_message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;called_with&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Hi&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;should_not&lt;/span&gt; &lt;span class="n"&gt;be_nil&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt; &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;h2&gt;Creating a new fake&lt;/h2&gt;

&lt;p&gt;To create a new fake, simply leverage the fake method that is mixed into the Kernel module.&lt;/p&gt;

&lt;figure class='code'&gt; &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='line'&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;developwithpassion_fakes&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fake&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;h2&gt;Specifying the behaviour of a fake&lt;/h2&gt;

&lt;p&gt;When scaffolding fake return values, the library behaves almost identically to the way RSpec stubs work.&lt;/p&gt;

&lt;h3&gt;Setup a method to return a value for a particular set of arguments&lt;/h3&gt;

&lt;figure class='code'&gt; &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;collaborator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fake&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;collaborator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:name_of_method&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;with&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arg1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;arg2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;arg3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;and_return&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;return_value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;h3&gt;Setup a method to return a value regardless of the arguments it is called with&lt;/h3&gt;

&lt;figure class='code'&gt; &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;collaborator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fake&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;#long handed way&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;collaborator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:name_of_method&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ignore_arg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;and_return&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;return_value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;#preferred way&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;collaborator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:name_of_method&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;and_return&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;return_value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;h3&gt;Setup different return values for different argument sets&lt;/h3&gt;

&lt;figure class='code'&gt; &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;collaborator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fake&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;#Setup a return value for 1&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;collaborator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:method&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;with&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;and_return&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_return_value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;#Setup a return value for 2&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;collaborator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:method&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;with&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;and_return&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;second_return_value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;#Setup a return value when called with everything else &lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;#if you are going to use this, make sure it is used after &lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;#setting up return values for specific arguments&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;collaborator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:method&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;and_return&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value_to_return_with_arguments_other_than_1_and_2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;h2&gt;Verifying calls made to the fake&lt;/h2&gt;

&lt;h3&gt;Verifying when a call was made&lt;/h3&gt;

&lt;p&gt;The primary purpose of the library is to help you in doing interaction style testing in a AAA style. Assume the following class is one you would like to test:&lt;/p&gt;

&lt;figure class='code'&gt; &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ItemToTest&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;collaborator&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="vi"&gt;@collaborator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;collaborator&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;run&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="vi"&gt;@collaborator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;send_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Hello World&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;ItemToTest is supposed to leverage its collaborator and calls its send_message method with the argument &amp;#8220;Hello World&amp;#8221;. To verify this using AAA style, interaction testing you can do the following (I am using rspec, but you can use this with any testing library you wish):&lt;/p&gt;

&lt;figure class='code'&gt; &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;describe&lt;/span&gt; &lt;span class="no"&gt;ItemToTest&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt; &lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;when run&amp;quot;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;let&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:collaborator&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;&lt;span class="n"&gt;fake&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;let&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:sut&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;&lt;span class="no"&gt;ItemToTest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;collaborator&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="c1"&gt;#I typically use a before block to specifically trigger the method that I am testing, so it cleanly&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="c1"&gt;#separates it from the assertions I will make later&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;before&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:each&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="n"&gt;sut&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;should trigger its collaborator with the correct message&amp;quot;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="n"&gt;collaborator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;received&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:send_message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;called_with&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Hello World&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;should_not&lt;/span&gt; &lt;span class="n"&gt;be_nil&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt; &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;From the example above, you can see that we created the fake and did not need to scaffold it with any behaviour.&lt;/p&gt;

&lt;figure class='code'&gt; &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;let&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:collaborator&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;&lt;span class="n"&gt;fake&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;You can also see that we are create our System Under Test (sut) and provide it the collaborator:&lt;/p&gt;

&lt;figure class='code'&gt; &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;let&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:sut&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;&lt;span class="no"&gt;ItemToTest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;collaborator&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;We then proceed to invoke the method on the component we are testing&lt;/p&gt;

&lt;figure class='code'&gt; &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;before&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:each&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;sut&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Last but not least, we verify that our collaborator was invoked and with the right arguments:&lt;/p&gt;

&lt;figure class='code'&gt; &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;should trigger its collaborator with the correct message&amp;quot;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;collaborator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;received&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:send_message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;called_with&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Hello World&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;should_not&lt;/span&gt; &lt;span class="n"&gt;be_nil&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;The nice thing is we can make the assertions after the fact, as opposed to needing to do them as part of setup, which I find is a much more natural way to read things, when you need to do this style of test. Notice that the called_with method return a method_invocation that will be nil if the call was not received. My recommendation would be to create a test utility method that allows you to leverage your testing frameworks assertion library to make the above assertion more terse. The
following rspec sample demonstrates:&lt;/p&gt;

&lt;figure class='code'&gt; &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;RSpec&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="no"&gt;Matchers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;define&lt;/span&gt; &lt;span class="ss"&gt;:have_received&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;symbol&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="n"&gt;match&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;fake&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;      &lt;span class="n"&gt;fake&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;received&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;symbol&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;called_with&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kp"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Using the above utility method turns the previous assertion:&lt;/p&gt;

&lt;figure class='code'&gt; &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;collaborator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;received&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:send_message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;called_with&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Hello World&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;should_not&lt;/span&gt; &lt;span class="n"&gt;be_nil&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;To this:&lt;/p&gt;

&lt;figure class='code'&gt; &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;collaborator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;should&lt;/span&gt; &lt;span class="n"&gt;have_received&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:send_message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Hello World&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;h3&gt;Verifying that a call should not have been made&lt;/h3&gt;

&lt;p&gt;Currently verifying that a call was not made does not take the arguments into consideration. It just ensures that no calls to a particular named method were made. Here is an example:&lt;/p&gt;

&lt;figure class='code'&gt; &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;span class='line-number'&gt;17&lt;/span&gt;
&lt;span class='line-number'&gt;18&lt;/span&gt;
&lt;span class='line-number'&gt;19&lt;/span&gt;
&lt;span class='line-number'&gt;20&lt;/span&gt;
&lt;span class='line-number'&gt;21&lt;/span&gt;
&lt;span class='line-number'&gt;22&lt;/span&gt;
&lt;span class='line-number'&gt;23&lt;/span&gt;
&lt;span class='line-number'&gt;24&lt;/span&gt;
&lt;span class='line-number'&gt;25&lt;/span&gt;
&lt;span class='line-number'&gt;26&lt;/span&gt;
&lt;span class='line-number'&gt;27&lt;/span&gt;
&lt;span class='line-number'&gt;28&lt;/span&gt;
&lt;span class='line-number'&gt;29&lt;/span&gt;
&lt;span class='line-number'&gt;30&lt;/span&gt;
&lt;span class='line-number'&gt;31&lt;/span&gt;
&lt;span class='line-number'&gt;32&lt;/span&gt;
&lt;span class='line-number'&gt;33&lt;/span&gt;
&lt;span class='line-number'&gt;34&lt;/span&gt;
&lt;span class='line-number'&gt;35&lt;/span&gt;
&lt;span class='line-number'&gt;36&lt;/span&gt;
&lt;span class='line-number'&gt;37&lt;/span&gt;
&lt;span class='line-number'&gt;38&lt;/span&gt;
&lt;span class='line-number'&gt;39&lt;/span&gt;
&lt;span class='line-number'&gt;40&lt;/span&gt;
&lt;span class='line-number'&gt;41&lt;/span&gt;
&lt;span class='line-number'&gt;42&lt;/span&gt;
&lt;span class='line-number'&gt;43&lt;/span&gt;
&lt;span class='line-number'&gt;44&lt;/span&gt;
&lt;span class='line-number'&gt;45&lt;/span&gt;
&lt;span class='line-number'&gt;46&lt;/span&gt;
&lt;span class='line-number'&gt;47&lt;/span&gt;
&lt;span class='line-number'&gt;48&lt;/span&gt;
&lt;span class='line-number'&gt;49&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FirstCollaborator&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;send_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SecondCollaborator&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;send_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SomeItem&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;initialize&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="vi"&gt;@first&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;FirstCollaborator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="vi"&gt;@second&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;SecondCollaborator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;first_behaviour&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="vi"&gt;@first&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;send_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Hello&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;second_behaviour&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="vi"&gt;@second&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;send_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;World&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;describe&lt;/span&gt; &lt;span class="no"&gt;SomeItem&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt; &lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;when run&amp;quot;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;let&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:first&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;&lt;span class="n"&gt;fake&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;let&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:second&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;&lt;span class="n"&gt;fake&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;before&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:each&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="no"&gt;FirstCollaborator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:new&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;and_return&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="no"&gt;SecondCollaborator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:new&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;and_return&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;second&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="vi"&gt;@sut&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;SomeItem&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;before&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:each&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="vi"&gt;@sut&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;first_behaviour&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;should trigger its collaborator with the correct message&amp;quot;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="n"&gt;first&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;should&lt;/span&gt; &lt;span class="n"&gt;have_received&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:send_message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Hello&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;should not trigger its second collaborator&amp;quot;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="c1"&gt;#again, here would be another option to use a convienience test utility method&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="n"&gt;second&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;never_received?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:send_message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;should&lt;/span&gt; &lt;span class="n"&gt;be_true&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt; &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;As you can see, in this test we want to verify that one collaborator was triggered and the other not.&lt;/p&gt;

&lt;p&gt;As always, feel free to fork the library and send me any pull requests if you add anything interesting!!&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.developwithpassion.com"&gt;Develop With Passion®&lt;/a&gt;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=9JimpoX4nn8:Yo1tq40qDvM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=9JimpoX4nn8:Yo1tq40qDvM:XQ266DUsA9M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=XQ266DUsA9M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=9JimpoX4nn8:Yo1tq40qDvM:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JPBoodhoo/~4/9JimpoX4nn8" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.developwithpassion.com/2012/02/27/developwithpassion_fakes-a-simple-interception-library-for-ruby-devs/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Bumping Up The Brussels Course By 1 Week (Due To Holiday)]]></title>
    <link href="http://feeds.developwithpassion.com/~r/JPBoodhoo/~3/N9swaxIzfsI/" />
    <updated>2012-02-15T09:00:00-07:00</updated>
    <id>http://blog.developwithpassion.com/2012/02/15/bumping-up-the-brussels-course-by-1-week-due-to-holiday</id>
    <content type="html">&lt;p&gt;Well, it looks like the Brussels course was scheduled on a week of a national holiday!&lt;/p&gt;

&lt;p&gt;To that end we are now bumping the course up by one week to the week of April 23rd.&lt;/p&gt;

&lt;p&gt;Remember, if you register before the end of February and use the discount code : earlybirdforbrusselsis10 , you will receive a 10% discount off the cost of the course.&lt;/p&gt;

&lt;p&gt;Hope to see you there!!&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.developwithpassion.com"&gt;Develop With Passion®&lt;/a&gt;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=N9swaxIzfsI:7YfvaJi1RKs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=N9swaxIzfsI:7YfvaJi1RKs:XQ266DUsA9M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=XQ266DUsA9M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=N9swaxIzfsI:7YfvaJi1RKs:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JPBoodhoo/~4/N9swaxIzfsI" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.developwithpassion.com/2012/02/15/bumping-up-the-brussels-course-by-1-week-due-to-holiday/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Early Bird Discount For April Course In Brussels!!]]></title>
    <link href="http://feeds.developwithpassion.com/~r/JPBoodhoo/~3/EqrqeODtdx8/" />
    <updated>2012-01-28T09:00:00-07:00</updated>
    <id>http://blog.developwithpassion.com/2012/01/28/early-bird-discount-for-april-course-in-brussels</id>
    <content type="html">&lt;p&gt;The crazy Develop With Passion® training course is coming to Brussels on April 30th!!&lt;/p&gt;

&lt;p&gt;This is our first time in Brussels and we are excited for what the potential reception is going to be!!&lt;/p&gt;

&lt;p&gt;You may want to consider taking the course if you are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Able to free up their week for April 30th - May 4th.&lt;/li&gt;
&lt;li&gt;Looking forward to spending a week with a group of peers on the continual path of mastery&lt;/li&gt;
&lt;li&gt;Ready to come and learn killer coding techniques.&lt;/li&gt;
&lt;li&gt;Wanting to learn principles, patterns, and practices that can help enable them to craft a path to a long lasting career as an effective developer regardless of platform or language.&lt;/li&gt;
&lt;li&gt;Excited about the idea of 5 12 hour days of fast paced coding frenzy&lt;/li&gt;
&lt;li&gt;Comfortable with the thought of pair programming with complete strangers to help them to increase their game!!&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Registration for the course can be made &lt;a href="http://www.eventbrite.com/event/2560727204/eorg"&gt;here&lt;/a&gt;. If you register before the end of February and use the discount code: earlybirdforbrusselsis10 , you will receive a 10% discount on the course.&lt;/p&gt;

&lt;p&gt;Looking forward to seeing you there!!&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.developwithpassion.com"&gt;Develop With Passion®&lt;/a&gt;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=EqrqeODtdx8:dBAE8-9HeEg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=EqrqeODtdx8:dBAE8-9HeEg:XQ266DUsA9M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=XQ266DUsA9M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=EqrqeODtdx8:dBAE8-9HeEg:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JPBoodhoo/~4/EqrqeODtdx8" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.developwithpassion.com/2012/01/28/early-bird-discount-for-april-course-in-brussels/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Sharpening the sword]]></title>
    <link href="http://feeds.developwithpassion.com/~r/JPBoodhoo/~3/iESEUysekz4/" />
    <updated>2011-09-30T09:00:00-06:00</updated>
    <id>http://blog.developwithpassion.com/2011/09/30/sharpening-the-sword</id>
    <content type="html">&lt;p&gt;The following document outlines a collection of resources which you can use to help you pursue the art of software craftsmanship.&lt;/p&gt;

&lt;p&gt;There is a wealth of material in here that will take a significant amount of time to work through. The goal is not to complete it in a certain amount of time; rather to use the resources as a way to allow you to continually and incrementally work on honing your skills.&lt;/p&gt;

&lt;p&gt;Some of the resources in here focus on areas related to general computer science and software engineering, others are resources that are there to help you improve more general areas of your skillset, including tuning up the old gray matter!!&lt;/p&gt;

&lt;h2&gt;Work Incrementally And Consistently&lt;/h2&gt;

&lt;p&gt;It is very important to remember that the majority of peoples brains works best when challenged consistently over a long period of time. To this end, it is important that you embed habits of daily practice into your routine. Much like it is important to commit to a workout schedule for you physical health, it is also just as important to apply the same level of discipline to the way that you train your career skill set.&lt;/p&gt;

&lt;h2&gt;The resources&lt;/h2&gt;

&lt;h2&gt;&lt;a href="http://manifesto.softwarecraftsmanship.org/main/reading"&gt;Software Craftsmanship&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;This is really what this entire document is about, the art of crafting a long lasting career as a software professional. There is a huge wealth of information that the craftsmanship site links to. All of it is meant to give you ideas of what it means to be a software craftsman. Some of my favourites from the reading list are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://norvig.com/21-days.html"&gt;Teach yourself programming in 10 years&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;&lt;a href="http://www.lumosity.com/"&gt;Lumosity&lt;/a&gt; - Train Your Brain - 10 minutes a day&lt;/h2&gt;

&lt;p&gt;One of the tools on this list which is specifically focused on brain training is a tool called &lt;a href="http://www.lumosity.com/"&gt;Lumosity&lt;/a&gt;. This site is a collaboration between neuroscientists and computer programmers who have developed a system whereby you can increase a host of cognitive functions over the course of a prolonged training program. The initial 45 days of the program helps you establish a baseline for where you need to improve, and from that point on the program tailors
itself to help you develop the skills in the areas that you need improvement.&lt;/p&gt;

&lt;h2&gt;Code Katas - It just takes 20 minutes&lt;/h2&gt;

&lt;p&gt;The following set of exercises is a collection of code katas that you can use on a daily basis to spend a small amount of time every day working on a set of problems that can allow you to work on broadening the following areas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Increase you context pool of ideas around which to approach a particular problem&lt;/li&gt;
&lt;li&gt;Improve your ability to craft your workbench to allow you to work in the most efficient way possible aka. Repeat katas you have already solved and try to mechanically generate the solutions faster using your favoured workbench. This will allow you to identify areas where you can see yourself using your tools in a less than optimal way and work to iron out those items.&lt;/li&gt;
&lt;li&gt;Learn new languages. Use code katas as a way to explore a new language. Revisiting katas that you have solved and trying to implement them in as many languages as you are interested in.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Here is a small list of some katas that can keep you moving for a while:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://sites.google.com/site/tddproblems/all-problems-1"&gt;TDD Katas&lt;/a&gt;
These problems represent a small set of challenges that can allow you opportunity to flex you tdd programming muscles. Like any other skill, tdd is something that should be practiced over and over until you feel comfortable with the mechanics of leveraging it. In the beginning you will most likely write fairly bad tests. This is usually because TDD forces you to bring design to the forefront of your coding activity and design using code that serves as the first client of that code.
Often when people get started using TDD, they are faced relatively quickly with their deficiencies in the design toolkit they thought they had. This is a great thing, as it gives you an opportunity to purposefully choose to sharpen those skills. I personally feel that the design skills you bring to the table have an impact on the way that you approach executing TDD.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://projecteuler.net/"&gt;Project Euler&lt;/a&gt;
This is a set of over 350 problems that are fairly math centric in nature. This is a great resource for you to gauge where potential gaps in your math skills are. A large majority of line of business programmers can go their entire career without ever really to flex their math muscles. There is nothing wrong with this at all. Unfortunately, a large percentage of these developers also express interest in getting into other areas of computer programming, that require much higher level
math that what they can currently manage. When faced with this dilemma, they can choose to close the gaps in their knowledge that will allow them to get into those areas of interest; or they will choose to go back to what they know they can do, and have a constantly nagging feeling of wanting to do more.&lt;br/&gt;
Using this set of codekatas, you can work through the problems one at a time, and if you hit an problem that is proving a challenge due to a gap in the math skillset, you can close that gap with &lt;a href="http://www.khanacademy.org/"&gt;Khan Academy&lt;/a&gt; - discussed later on !!&lt;/li&gt;
&lt;li&gt;&lt;a href="http://codekata.pragprog.com/"&gt;Code Kata&lt;/a&gt;
One of the original code kata sites. It contains a set of problems as well as a great discussion on why to bother practicing code katas in the first place!!&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;Close some of the gaps in your math skill set&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.khanacademy.org/"&gt;Khan Academy&lt;/a&gt;
This is a fantastic resource put together primarily by the brilliant Salman Khan. Currently the site has over 2400 videos covering topics ranging from basic arithmetic to linear algebra. There are also material on history, biology. It is a crazy resource. For people who may have a gap in their math skillset, this can help you close it.&lt;br/&gt;
If you do happen to identify gaps in the knowledge, you have to be willing to be patient enough with yourself to go back to where the gaps stemmed from and work hard to close them. The many people out there who have been convinced by teachers,friends, etc that they are not mathematically inclined have been lied to. It may most likely mean that for you to exhibit proficiency in math, that you have to spend more time practicing and working through lots and lots of problems until it
clicks.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Now of course, it should be noted that you can probably enjoy a very long and successful career as a software developer without ever needing to get into higher level math. Especially if the majority of your dev effort is spent in the line of business &amp;#8220;crud&amp;#8221; style realm. Of course, if you start wanting to branch out into other areas of software such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Machine Learning&lt;/li&gt;
&lt;li&gt;Graphics&lt;/li&gt;
&lt;li&gt;Neural networks&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;You willl definitely require the use of those higher level math skills. At that point, you will either identify that you have the skills, can refresh them, or you will have to learn them from scratch. If this is the case, I believe Khan academy can definitely equip you with the tools to get into the areas that you have interest in!!&lt;/p&gt;

&lt;h2&gt;Get a better education&lt;/h2&gt;

&lt;p&gt;A large majority of computer science based education is not really equipping programmers effectively with what I call &amp;#8220;a solid core&amp;#8221;. Like building a house on sand, if you don&amp;#8217;t take the time to learn and apply the fundamentals, it will be much more difficult to adopt an attitude of confidence in your ability to tackle problems. For some of us, that means we may need to revisit topics that we never had the opportunity to cover in the school that we attended. For some that
  means even going back and learning about fundamentals such as basic data structures and algorithms. There is a myriad of learning resources out there that are focused on just this task, the following list is a small representation of the huge amount of options that you have to be able to use to ramp up the &amp;#8220;core&amp;#8221; skills:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://ocw.mit.edu/"&gt;MIT Opencourseware&lt;/a&gt;.
For quite a number of years now MIT has been making large sections of its courses freely available for public use. Specifically for computer programmer, you can spend time looking at the &lt;a href="http://ocw.mit.edu/courses/electrical-engineering-and-computer-science"&gt;Electrical Engineering and Computer Science&lt;/a&gt;. There is a raft of courses relating to a wide field of computer science based disciplines. My recommendation for a lot of people would be to start with the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-001-structure-and-interpretation-of-computer-programs-spring-2005"&gt;Structure and Interpretation of Computer Programs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-006-introduction-to-algorithms-spring-2008"&gt;Introduction to Algorithms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-088-introduction-to-c-memory-management-and-c-object-oriented-programming-january-iap-2010"&gt;Introduction to C Memory Management and C++ Object Oriented Programming&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-170-laboratory-in-software-engineering-fall-2005"&gt;Laboratory in software engineering&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;To see the impact that MIT Opencourseware is having, check out the following &lt;a href="http://www.wired.com/wired/archive/11.09/mit.html"&gt;article&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://itunes.stanford.edu/"&gt;Stanford on iTunesU&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Once again, the wealth of information on here is just amazing. Even in the computer programming section alone there are lots of video lectures from topics ranging from algorithms to iphone programming.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;Read some books&lt;/h2&gt;

&lt;p&gt;Books are a great resource for getting differing viewpoints on techniques and practices. My recommendation while reading books (especially technical) is to focus on active reading techniques that allow you to implement what you are reading as soon as possible. You want to give yourself the opportunity to build your own mental models for how the concepts apply, and I believe that a large majority of technical information you read is best distilled in your editor writing code
and playing around with the ideas.&lt;br/&gt;
I have put together a small book list that I have created to focus on some fundamental areas of both software engineering and computer science. Granted it definitely leans heavier into the realm of software engineering that raw computer science, but the books that are on there are a great starting point for helping you to further the building of a solid core.&lt;br/&gt;
Check out the book list here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://www.amazon.com/Building-A-Solid-Programming-Core/lm/R39PW96KKNBR79/ref=cm_lm_byauthor_title_full"&gt;Build a solid programming core&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://www.amazon.com/Build-A-Solid-Core/lm/R1TAJN36KKUPG4/ref=cm_lm_byauthor_title_full"&gt;Build a solid core&lt;/a&gt;- In my opinion, the books on this list are far more important than any of the resources I have mentioned so far. Read them and prepare to have transformative things happen in your life!!&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Feel free to comment on this resource list (yes comments are working again) and let me know if you think there are good additions I can make to the list of recommendations.&lt;/p&gt;

&lt;p&gt;God Bless You.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.developwithpassion.com"&gt;Develop With Passion®&lt;/a&gt;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=iESEUysekz4:4R3y-N4b_fY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=iESEUysekz4:4R3y-N4b_fY:XQ266DUsA9M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=XQ266DUsA9M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=iESEUysekz4:4R3y-N4b_fY:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JPBoodhoo/~4/iESEUysekz4" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.developwithpassion.com/2011/09/30/sharpening-the-sword/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Review - Kinesis Advancategories Pro Keyboard]]></title>
    <link href="http://feeds.developwithpassion.com/~r/JPBoodhoo/~3/RFrJllXBTRI/" />
    <updated>2011-09-12T09:00:00-06:00</updated>
    <id>http://blog.developwithpassion.com/2011/09/12/review-kinesis-advantage-pro-keyboard</id>
    <content type="html">&lt;p&gt;Someone got in contact with me a couple of weeks ago asking about whether the switch I made to the &lt;a href="http://www.kinesis-ergo.com/advantage_pro.htm"&gt;Kinesis Advantage Pro&lt;/a&gt; was worth it? The answer is a large resounding YES!!!&lt;/p&gt;

&lt;p&gt;This keyboard is without a doubt the most comfortable keyboard that I have ever used. For the first couple of weeks during the &amp;#8220;adaptation&amp;#8221; period, it was a little challenging. Getting used to the keyboard took a little bit of time, coupled with the fact that because I went &amp;#8220;cold-turkey&amp;#8221;, when I had to jump onto another machine to do something, I could barely type on the flat/regular natural keyboard. As it felt completely unatural compared to the Kinesis!!&lt;/p&gt;

&lt;p&gt;The mechanics of the unit are amazing. The responsiveness of the keys, and the feel of the keys themselves are awesome. Of course, the one downside compared to my old natural keyboard, is the fact that it is not wireless. Not a biggie though.&lt;/p&gt;

&lt;p&gt;Even though the device looks a little big, it is small enough to carry comfortably in my backpack, where I often will break it out when I am doing coding in a coffee shop (much to the bizarre looks of everyone around me!!)&lt;/p&gt;

&lt;p&gt;The price tag may be a little steep, but to me the cost is well worth it!!&lt;/p&gt;

&lt;p&gt;If you have been looking for a new keyboard and are willing to dish out a little bit of money, then you will definitely not go wrong with this keyboard!!!&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.developwithpassion.com"&gt;Develop With Passion®&lt;/a&gt;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=RFrJllXBTRI:7rB3Loi9cDI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=RFrJllXBTRI:7rB3Loi9cDI:XQ266DUsA9M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=XQ266DUsA9M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=RFrJllXBTRI:7rB3Loi9cDI:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JPBoodhoo/~4/RFrJllXBTRI" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.developwithpassion.com/2011/09/12/review-kinesis-advantage-pro-keyboard/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Keymando - Version 1.0.3 is out and a small taste of what's on the horizon!!]]></title>
    <link href="http://feeds.developwithpassion.com/~r/JPBoodhoo/~3/Bx-zZxm3avM/" />
    <updated>2011-09-09T09:00:00-06:00</updated>
    <id>http://blog.developwithpassion.com/2011/09/09/keymando-version-1-0-3-is-out-and-a-small-taste-of-whats-on-the-horizon</id>
    <content type="html">&lt;p&gt;&lt;a href="http://keymando.com"&gt;Keymando&lt;/a&gt; version 1.0.3 is out, and we have opened up a long awaited trial mode so that people can give it a whirl.  We understand that a $20 price tag for most developers is not spent lightly, so we want to make sure that people get time to play with it. For anyone who knows me and know what a keyboard freak I am, I can literally say, that I can&amp;#8217;t even use a machine that does not have this program on it anymore!! I am going to create some small 1-2 minute screen casts that will
demonstrate some of the worflows that I use on a day to day basis.&lt;/p&gt;

&lt;p&gt;There are many constructs, algorithms and patterns that go into making this thing sing. &lt;a href="http://kevin.colyar.net"&gt;Kevin&lt;/a&gt; and I are hard at work adding new features, and for now we are going to keep the lid closed on 2 awesome features that are coming down the pipe. I can say with complete confidence that it will revolutionize the way you use osx with the keyboard!!&lt;/p&gt;

&lt;p&gt;It is also beneficial to know that we have a small, but growing, community of plugin developers who are writing freely available plugins and making them available through the official &lt;a href="https://github.com/keymando"&gt;keymando plugin repository&lt;/a&gt;. 2 that I use quite often are the:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://github.com/keymando/underscore"&gt;underscore&lt;/a&gt; - Great if you like to type with underscores when you code (or if you are like me, all over the place!!)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/keymando/abbrev"&gt;abbrev&lt;/a&gt; - An abbreviation plugin that emulates complex text expansion!!&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;What more OSX power users and developers need to realize, is that there is so much you can do for customization if you know how to code ruby. For regular users we are keeping the barrier to entry as low as possible and keeping the dsl as &amp;#8220;simple&amp;#8221; for the 80/20 rule. For developers who know ruby, well, you are really only limited by your imagination.&lt;/p&gt;

&lt;p&gt;We are going to be adding more capabilities to the core pipeline that will be exposed to plugin developers, or just simple config scripts. So hold onto your hats!! For now we are also not focusing on any fancy user interfaces, as we are currently focusing on growing the core engine. The pretty UI&amp;#8217;s for some of the features will come in time!!&lt;/p&gt;

&lt;p&gt;For now, I&amp;#8217;ll leave you with a large section of code from my current .keymandorc.rb file (the main configuration script). Keep in mind that some of the code in this file is based on the main line of development!! Hopefully most of it will be self descriptive enough for me to not need to include comments.&lt;/p&gt;

&lt;figure class='code'&gt; &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;span class='line-number'&gt;17&lt;/span&gt;
&lt;span class='line-number'&gt;18&lt;/span&gt;
&lt;span class='line-number'&gt;19&lt;/span&gt;
&lt;span class='line-number'&gt;20&lt;/span&gt;
&lt;span class='line-number'&gt;21&lt;/span&gt;
&lt;span class='line-number'&gt;22&lt;/span&gt;
&lt;span class='line-number'&gt;23&lt;/span&gt;
&lt;span class='line-number'&gt;24&lt;/span&gt;
&lt;span class='line-number'&gt;25&lt;/span&gt;
&lt;span class='line-number'&gt;26&lt;/span&gt;
&lt;span class='line-number'&gt;27&lt;/span&gt;
&lt;span class='line-number'&gt;28&lt;/span&gt;
&lt;span class='line-number'&gt;29&lt;/span&gt;
&lt;span class='line-number'&gt;30&lt;/span&gt;
&lt;span class='line-number'&gt;31&lt;/span&gt;
&lt;span class='line-number'&gt;32&lt;/span&gt;
&lt;span class='line-number'&gt;33&lt;/span&gt;
&lt;span class='line-number'&gt;34&lt;/span&gt;
&lt;span class='line-number'&gt;35&lt;/span&gt;
&lt;span class='line-number'&gt;36&lt;/span&gt;
&lt;span class='line-number'&gt;37&lt;/span&gt;
&lt;span class='line-number'&gt;38&lt;/span&gt;
&lt;span class='line-number'&gt;39&lt;/span&gt;
&lt;span class='line-number'&gt;40&lt;/span&gt;
&lt;span class='line-number'&gt;41&lt;/span&gt;
&lt;span class='line-number'&gt;42&lt;/span&gt;
&lt;span class='line-number'&gt;43&lt;/span&gt;
&lt;span class='line-number'&gt;44&lt;/span&gt;
&lt;span class='line-number'&gt;45&lt;/span&gt;
&lt;span class='line-number'&gt;46&lt;/span&gt;
&lt;span class='line-number'&gt;47&lt;/span&gt;
&lt;span class='line-number'&gt;48&lt;/span&gt;
&lt;span class='line-number'&gt;49&lt;/span&gt;
&lt;span class='line-number'&gt;50&lt;/span&gt;
&lt;span class='line-number'&gt;51&lt;/span&gt;
&lt;span class='line-number'&gt;52&lt;/span&gt;
&lt;span class='line-number'&gt;53&lt;/span&gt;
&lt;span class='line-number'&gt;54&lt;/span&gt;
&lt;span class='line-number'&gt;55&lt;/span&gt;
&lt;span class='line-number'&gt;56&lt;/span&gt;
&lt;span class='line-number'&gt;57&lt;/span&gt;
&lt;span class='line-number'&gt;58&lt;/span&gt;
&lt;span class='line-number'&gt;59&lt;/span&gt;
&lt;span class='line-number'&gt;60&lt;/span&gt;
&lt;span class='line-number'&gt;61&lt;/span&gt;
&lt;span class='line-number'&gt;62&lt;/span&gt;
&lt;span class='line-number'&gt;63&lt;/span&gt;
&lt;span class='line-number'&gt;64&lt;/span&gt;
&lt;span class='line-number'&gt;65&lt;/span&gt;
&lt;span class='line-number'&gt;66&lt;/span&gt;
&lt;span class='line-number'&gt;67&lt;/span&gt;
&lt;span class='line-number'&gt;68&lt;/span&gt;
&lt;span class='line-number'&gt;69&lt;/span&gt;
&lt;span class='line-number'&gt;70&lt;/span&gt;
&lt;span class='line-number'&gt;71&lt;/span&gt;
&lt;span class='line-number'&gt;72&lt;/span&gt;
&lt;span class='line-number'&gt;73&lt;/span&gt;
&lt;span class='line-number'&gt;74&lt;/span&gt;
&lt;span class='line-number'&gt;75&lt;/span&gt;
&lt;span class='line-number'&gt;76&lt;/span&gt;
&lt;span class='line-number'&gt;77&lt;/span&gt;
&lt;span class='line-number'&gt;78&lt;/span&gt;
&lt;span class='line-number'&gt;79&lt;/span&gt;
&lt;span class='line-number'&gt;80&lt;/span&gt;
&lt;span class='line-number'&gt;81&lt;/span&gt;
&lt;span class='line-number'&gt;82&lt;/span&gt;
&lt;span class='line-number'&gt;83&lt;/span&gt;
&lt;span class='line-number'&gt;84&lt;/span&gt;
&lt;span class='line-number'&gt;85&lt;/span&gt;
&lt;span class='line-number'&gt;86&lt;/span&gt;
&lt;span class='line-number'&gt;87&lt;/span&gt;
&lt;span class='line-number'&gt;88&lt;/span&gt;
&lt;span class='line-number'&gt;89&lt;/span&gt;
&lt;span class='line-number'&gt;90&lt;/span&gt;
&lt;span class='line-number'&gt;91&lt;/span&gt;
&lt;span class='line-number'&gt;92&lt;/span&gt;
&lt;span class='line-number'&gt;93&lt;/span&gt;
&lt;span class='line-number'&gt;94&lt;/span&gt;
&lt;span class='line-number'&gt;95&lt;/span&gt;
&lt;span class='line-number'&gt;96&lt;/span&gt;
&lt;span class='line-number'&gt;97&lt;/span&gt;
&lt;span class='line-number'&gt;98&lt;/span&gt;
&lt;span class='line-number'&gt;99&lt;/span&gt;
&lt;span class='line-number'&gt;100&lt;/span&gt;
&lt;span class='line-number'&gt;101&lt;/span&gt;
&lt;span class='line-number'&gt;102&lt;/span&gt;
&lt;span class='line-number'&gt;103&lt;/span&gt;
&lt;span class='line-number'&gt;104&lt;/span&gt;
&lt;span class='line-number'&gt;105&lt;/span&gt;
&lt;span class='line-number'&gt;106&lt;/span&gt;
&lt;span class='line-number'&gt;107&lt;/span&gt;
&lt;span class='line-number'&gt;108&lt;/span&gt;
&lt;span class='line-number'&gt;109&lt;/span&gt;
&lt;span class='line-number'&gt;110&lt;/span&gt;
&lt;span class='line-number'&gt;111&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;# Ignore the following apps&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;disable&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Remote Desktop Connection&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;disable&lt;/span&gt;&lt;span class="sr"&gt; /VirtualBox/&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;#commands----------------------------------------------------&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;launch_firefox&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;launch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Firefox&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;quit_the_current_application&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;send_keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;lt;Cmd-q&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:description&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Quit current application&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="ss"&gt;:remember&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;vimperator_pass_through_mode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;send_keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;lt;Shift-Escape&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;gmail_send_new_mail&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;send_keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;lt;Shift-Tab&amp;gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;gmail_send_reply_mail&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;send_keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;lt;Shift-Tab&amp;gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;gmail_discard_new_mail&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;send_keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;lt;Shift-Tab&amp;gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;gmail_discard_reply_mail&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;send_keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;lt;Shift-Tab&amp;gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;screen_flow_stop_recording&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;send_keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;lt;Cmd-Shift-2&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;window_hide_current&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;send_keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;lt;Cmd-w&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;#end_commands----------------------------------------------------&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;#----------------------------------------&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;#core_shortcuts&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;#----------------------------------------&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;toggle&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;Cmd-9&amp;gt;&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;Cmd-d&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;lt;Cmd-Shift-Tab&amp;gt;&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;Cmd-e&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;Escape&amp;gt;&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;Cmd-f&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;lt;Cmd-Tab&amp;gt;&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;Cmd-h&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;Left&amp;gt;&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;Cmd-j&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;Down&amp;gt;&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;Cmd-k&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;Up&amp;gt;&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;Cmd-l&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;Right&amp;gt;&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;Cmd-m&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;Tab&amp;gt;&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;Cmd-,&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;Shift-Tab&amp;gt;&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;Cmd-n&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;Ctrl-n&amp;gt;&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;Cmd-r&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;RightClick&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;Cmd-0&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;Cmd-Shift-D&amp;gt;&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;Cmd-c&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="no"&gt;RunLastCommand&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;Cmd- &amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;launch_quicksilver&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;# end_core_shortcuts---------------------&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;#mnemonic_mappings-----------------------&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="vi"&gt;@window_management&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="s2"&gt;&amp;quot;wm&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;mercury_mover_move_window&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="s2"&gt;&amp;quot;wfs&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;Divvy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;full_screen&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="s2"&gt;&amp;quot;wtl&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;Divvy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;top_left&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="s2"&gt;&amp;quot;wtr&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;Divvy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;top_right&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="s2"&gt;&amp;quot;wbl&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;Divvy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bottom_left&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="s2"&gt;&amp;quot;wbr&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;Divvy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bottom_right&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="s2"&gt;&amp;quot;wl&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;Divvy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="s2"&gt;&amp;quot;wr&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;Divvy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="s2"&gt;&amp;quot;wt&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;Divvy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;top&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="s2"&gt;&amp;quot;wb&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;Divvy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bottom&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="s2"&gt;&amp;quot;wc&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;Divvy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;center&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="s2"&gt;&amp;quot;w&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;window_hide_current&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="vi"&gt;@itunes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="s2"&gt;&amp;quot;iiv&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;itunes_increase_volume&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="s2"&gt;&amp;quot;div&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;itunes_decrease_volume&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="s2"&gt;&amp;quot;bt&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;itunes_browse_tracks&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="vi"&gt;@firefox&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="s2"&gt;&amp;quot;fi&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;launch_firefox&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="s2"&gt;&amp;quot;pp&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;vimperator_pass_through_mode&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="vi"&gt;@quicksilver&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="s2"&gt;&amp;quot;mi&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;show_current_menu_items&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="s2"&gt;&amp;quot;wi&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;show_current_app_windows&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="vi"&gt;@gmail&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="s2"&gt;&amp;quot;msn&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;gmail_send_new_mail&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="s2"&gt;&amp;quot;msr&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;gmail_send_reply_mail&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="s2"&gt;&amp;quot;mdn&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;gmail_send_reply_mail&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="s2"&gt;&amp;quot;mdr&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;gmail_discard_reply_mail&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="vi"&gt;@skype&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="s2"&gt;&amp;quot;sl&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;skype_login&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="s2"&gt;&amp;quot;scp&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;skype_call_phones&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="vi"&gt;@sound&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="s2"&gt;&amp;quot;sts&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;switch_to_speakers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="s2"&gt;&amp;quot;sti&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;switch_to_imic&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="vi"&gt;@general_mappings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="s2"&gt;&amp;quot;aa&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;app_code_all_items&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="s2"&gt;&amp;quot;rel&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;reload_configuration&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="s2"&gt;&amp;quot;ls&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;lock_the_screen&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="s2"&gt;&amp;quot;x&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;quit_the_current_application&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="s2"&gt;&amp;quot;gmm&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;gotomeeting_mute_me&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="s2"&gt;&amp;quot;sr&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;screen_flow_stop_recording&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="s2"&gt;&amp;quot;ntt&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;things_new_task&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="s2"&gt;&amp;quot;jj&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;RunHistoryItem&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;#end_mnemonic_mappings------------------------------------------------------------&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;Cmd-y&amp;gt;&amp;quot;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vi"&gt;@general_mappings&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;         &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;merge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vi"&gt;@window_management&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;         &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;merge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vi"&gt;@itunes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;         &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;merge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vi"&gt;@firefox&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;         &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;merge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vi"&gt;@quicksilver&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;         &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;merge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vi"&gt;@gmail&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;         &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;merge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vi"&gt;@skype&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;         &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;merge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vi"&gt;@sound&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Happy keyboarding!!&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.developwithpassion.com"&gt;Develop With Passion®&lt;/a&gt;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=Bx-zZxm3avM:pVslH9-aVvE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=Bx-zZxm3avM:pVslH9-aVvE:XQ266DUsA9M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=XQ266DUsA9M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=Bx-zZxm3avM:pVslH9-aVvE:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JPBoodhoo/~4/Bx-zZxm3avM" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.developwithpassion.com/2011/09/09/keymando-version-1-0-3-is-out-and-a-small-taste-of-whats-on-the-horizon/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Switching between multiple twitter accounts with TwitVim]]></title>
    <link href="http://feeds.developwithpassion.com/~r/JPBoodhoo/~3/fcruA3626wA/" />
    <updated>2011-09-05T09:00:00-06:00</updated>
    <id>http://blog.developwithpassion.com/2011/09/05/switching-between-twitter-accounts-with-twitvim</id>
    <content type="html">&lt;p&gt;For the last couple of years now, I have been making use of &lt;a href="http://www.vim.org/scripts/script.php?script_id=2204"&gt;TwitVim&lt;/a&gt; to twitter from within vim. Seeing how much time I actually spend on twitter, it has been a good fit and enables me to help maintain focus without getting drowned out by the twitterverse. Plus I&amp;#8217;m a vim freak, so the more I can use it for the better.&lt;/p&gt;

&lt;p&gt;I often have to switch between posting/reading from multiple twitter accounts. In order to do this effectively, I came up with a quick hack to allow me to switch rapidly.&lt;/p&gt;

&lt;p&gt;Under my [devtools] folder I have an automation folder that contains a bunch of automation scripts that I have accumulated over the years. Under there I have my vim folder, here is the screenshot:&lt;/p&gt;

&lt;div class="thumbnail"&gt;&lt;a href="https://skitch.com/jpboodhoo/fsudd/terminal-zsh-80x24"&gt;&lt;img style="max-width:638px" src="https://img.skitch.com/20110905-pc5swff4mftp8ypyi2p3perpg4.medium.jpg" alt="Terminal — zsh — 80×24" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span&gt;Uploaded with &lt;a href="http://skitch.com"&gt;Skitch&lt;/a&gt;!&lt;/span&gt;&lt;/div&gt;


&lt;p&gt;As you can see, each of my OAuth tokens for the respective user accounts is stored in this folder. The twitvim script, is trivial ruby script to copy the appropriate token into the place where TwitVim looks for the token to do Twitter authentication:&lt;/p&gt;

&lt;figure class='code'&gt; &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;#!/usr/bin/env ruby&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;twitter_user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;ARGV&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="no"&gt;Dir&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chdir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;File&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dirname&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;__FILE__&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="sb"&gt;`cp &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;twitter_user&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sb"&gt;.twitvim.token ~/.twitvim.token`&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Currently I can run this script passing in the account I want to switch to and startup vim and twitter using that account!!&lt;/p&gt;

&lt;p&gt;What I want to be able to do is call this script from inside of Vim as so:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;vim &lt;/span&gt;&lt;/figcaption&gt;
&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;function! Switch_twitter_user(user)
&lt;/span&gt;&lt;span class='line'&gt;  ResetLoginTwitter
&lt;/span&gt;&lt;span class='line'&gt;  let user_name = a:user
&lt;/span&gt;&lt;span class='line'&gt;  let switch_command = "twitvim ".user_name.""
&lt;/span&gt;&lt;span class='line'&gt;  .!switch_command
&lt;/span&gt;&lt;span class='line'&gt;endfunction&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Only problem I am having is a bit of trouble with the last line of the function (shelling out with the command, I can&amp;#8217;t seem to get the substitution working correctly). I am just blasting this down right now, so, if anyone knows it would be greatly appreciated. That is literally the first vim script method I have written!!&lt;/p&gt;

&lt;p&gt;That small wrinkle aside. You can be inside vim issue the ResetLoginTwitter command and then manually shell out to the twitvim script passing the correct username and you can carry on twittering on the different account.&lt;/p&gt;

&lt;p&gt;Hope this helps!!&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.developwithpassion.com"&gt;Develop With Passion®&lt;/a&gt;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=fcruA3626wA:L2KSaHoQax0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=fcruA3626wA:L2KSaHoQax0:XQ266DUsA9M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=XQ266DUsA9M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=fcruA3626wA:L2KSaHoQax0:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JPBoodhoo/~4/fcruA3626wA" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.developwithpassion.com/2011/09/05/switching-between-twitter-accounts-with-twitvim/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[The Journey To Test-Driven: A Startup Tale - Take The Survey]]></title>
    <link href="http://feeds.developwithpassion.com/~r/JPBoodhoo/~3/BtErBhtGue8/" />
    <updated>2011-08-31T09:00:00-06:00</updated>
    <id>http://blog.developwithpassion.com/2011/08/31/the-journey-to-test-driven-a-startup-tale-take-the-survey</id>
    <content type="html">&lt;p&gt;In 2 hours Mike Iwasiow will be giving a &lt;a href="http://webinars.developwithpassion.com/webinars/5"&gt;webinar&lt;/a&gt; on the impact of TDD for his startup.&lt;/p&gt;

&lt;p&gt;If you have time please take the following survey:&lt;/p&gt;

&lt;script type="text/javascript" src="http://i0.poll.fm/survey.js" charset="UTF-8"&gt;&lt;/script&gt;


&lt;p&gt;&lt;noscript&gt;&lt;a href="http://developwithpassion.polldaddy.com/s/the-journey-to-test-driven-a-startup-tale-1"&gt;Take Our Survey!&lt;/a&gt;&lt;/noscript&gt;&lt;/p&gt;

&lt;script type="text/javascript"&gt;
  polldaddy.add( {
    type: 'button',
    title: 'Take Our Survey!',
    style: 'rounded',
    text_color: 'FFFFFF',
    back_color: '000000',
    domain: 'developwithpassion.polldaddy.com/s/',
    id: '3B6503B56F5008D3'
  } );
&lt;/script&gt;


&lt;p&gt;We are extremely interested in what your teams are doing!!&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.developwithpassion.com"&gt;Develop With Passion®&lt;/a&gt;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=BtErBhtGue8:F3qLHw7cjHI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=BtErBhtGue8:F3qLHw7cjHI:XQ266DUsA9M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=XQ266DUsA9M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=BtErBhtGue8:F3qLHw7cjHI:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JPBoodhoo/~4/BtErBhtGue8" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.developwithpassion.com/2011/08/31/the-journey-to-test-driven-a-startup-tale-take-the-survey/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[My Birthday Present Discount To You!!!]]></title>
    <link href="http://feeds.developwithpassion.com/~r/JPBoodhoo/~3/5lfSxSveDK0/" />
    <updated>2011-08-27T08:00:00-06:00</updated>
    <id>http://blog.developwithpassion.com/2011/08/27/my-birthday-present-discount</id>
    <content type="html">&lt;p&gt;Hey everyone, today is my &lt;b&gt;birthday&lt;/b&gt;, and I am feeling generous!!&lt;/p&gt;

&lt;p&gt;To anyone who is thinking about attending one of the upcoming &lt;b&gt;Develop With Passion® bootcamps&lt;/b&gt; in either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.eventbrite.com/event/2011507473"&gt;Medicine Hat, AB&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.eventbrite.com/event/1445494513"&gt;Edmonton, AB&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;If you register before &lt;b&gt;September 30th, 2011&lt;/b&gt; and use the discount code &lt;b&gt;early_bird&lt;/b&gt; you will receive the following discounts off the registration fee:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Medicine Hat - $500 CAD off.&lt;/li&gt;
&lt;li&gt;Edmonton - $1000 CAD off.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;a href="http://www.developwithpassion.com"&gt;Develop With Passion®&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://lansingninjas.files.wordpress.com/2011/02/nin-brthday.png" alt="birthday pic" /&gt;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=5lfSxSveDK0:e-eN7TqGSX8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=5lfSxSveDK0:e-eN7TqGSX8:XQ266DUsA9M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=XQ266DUsA9M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.developwithpassion.com/~ff/JPBoodhoo?a=5lfSxSveDK0:e-eN7TqGSX8:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JPBoodhoo?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JPBoodhoo/~4/5lfSxSveDK0" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.developwithpassion.com/2011/08/27/my-birthday-present-discount/</feedburner:origLink></entry>
  
</feed>

