<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>joseoncode.com</title>
    <link>http://joseoncode.com/</link>
    
    <description>José on Code!</description>
    <language>en-us</language>
    <pubDate>Tue, 31 Jan 2012 21:11:42 +0000</pubDate>
    <lastBuildDate>Tue, 31 Jan 2012 21:11:42 +0000</lastBuildDate>

    
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/JoseFRomaniello" /><feedburner:info uri="josefromaniello" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
      <title>Hide passed tests by default in Qunit</title>
      <link>http://feedproxy.google.com/~r/JoseFRomaniello/~3/EyieLW6JQBo/hide-passed-tests-by-default-in-qunit</link>
      <pubDate>Wed, 25 Jan 2012 14:37:00 +0000</pubDate>
      <author>jfromaniello@gmail.com (José F. Romaniello)</author>
      <guid isPermaLink="false">http://joseoncode.com/2012/01/25/hide-passed-tests-by-default-in-qunit</guid>
      <description>&lt;p&gt;If you are using qunit and you are tired of the 392019321 passed tests output in your browser, there is a checkbox at the top to hide all passed tests. Unfortunately after you refresh the page you will lose this.&lt;/p&gt;

&lt;p&gt;Don't worry I have a snippet for you, insert this at the botton of your test harness page (inside a script block):&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ready&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
        &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;#qunit-tests&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;addClass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;hidepass&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;delegate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;#qunit-testrunner-toolbar&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;DOMNodeInserted&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
        &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;#qunit-filter-pass&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;attr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;checked&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;delegate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;#qunit-filter-pass&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;click&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
        &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stopPropagation&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;newValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;is&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;:checked&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;#qunit-tests&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;toggleClass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;hidepass&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;newValue&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JoseFRomaniello/~4/EyieLW6JQBo" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://joseoncode.com/2012/01/25/hide-passed-tests-by-default-in-qunit</feedburner:origLink></item>
    
    <item>
      <title>Extending jQuery with QUnit assertions</title>
      <link>http://feedproxy.google.com/~r/JoseFRomaniello/~3/OcU5-X8Jhlk/extending-jquery-with-qunit-assertions</link>
      <pubDate>Thu, 19 Jan 2012 11:25:00 +0000</pubDate>
      <author>jfromaniello@gmail.com (José F. Romaniello)</author>
      <guid isPermaLink="false">http://joseoncode.com/2012/01/19/extending-jquery-with-qunit-assertions</guid>
      <description>&lt;p&gt;QUnit come out of the box with some very basic assertions; ok, equal, notequal, deepequal, raises and few others.  In this post I will show how to extend the jQuery object with some useful assertions for qunit.&lt;/p&gt;

&lt;p&gt;When I was working in &lt;a href="http://www.moesion.com/"&gt;Moesion&lt;/a&gt; I saw that I was writing having many times test like this:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nx"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;some test&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;//do something&lt;/span&gt;
    &lt;span class="c1"&gt;//mock ajax call&lt;/span&gt;

    &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.a-button&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;click&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="c1"&gt;//assert&lt;/span&gt;
    &lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.some-element&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.container&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
        &lt;span class="s2"&gt;&amp;quot;it should contains some-element&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    
    &lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.some-other-element&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.container&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;it should contains some-other-element&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.container&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;is&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;:contains(&amp;#39;some text&amp;#39;)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;it should contains &amp;#39;some text&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;So, I wrote some extensions to the jquery object and now I can write the assertions like this:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nx"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;some test&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;//do something&lt;/span&gt;
    &lt;span class="c1"&gt;//mock ajax call&lt;/span&gt;

    &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.a-button&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;click&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="c1"&gt;//assert&lt;/span&gt;
    &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.container&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;assertContains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.some-element&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;assertContains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.some-other-element&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;assertContainsText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;some text&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The implementation is quite easy:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt; &lt;span class="p"&gt;){&lt;/span&gt;

  &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;escapeHtml&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="nx"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;s&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/[\&amp;amp;&amp;quot;&amp;lt;&amp;gt;\\]/g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="k"&gt;switch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
              &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;amp;&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;amp;amp;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
              &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;\\&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;\\\\&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
              &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;quot;&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;\&amp;quot;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
              &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;amp;lt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
              &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
              &lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
          &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nx"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/(\r\n|\n|\r)/gm&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;br /&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;pushSelectorAssertToQunit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;
                                    &lt;span class="nx"&gt;ontent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;expectedMessage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                                    &lt;span class="nx"&gt;expectedValue&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
      &lt;span class="nx"&gt;QUnit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="nx"&gt;actual&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="nx"&gt;expected&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;expectedMessage&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot; &amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;expectedValue&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;

      &lt;span class="nx"&gt;QUnit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;assertions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
          &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;!!&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;escapeHtml&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;style_html&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; 
                        &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt; &amp;lt;div class=\&amp;quot;test-expected\&amp;quot;&amp;gt;&amp;quot;&lt;/span&gt; 
                        &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;expectedMessage&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot; &amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;expectedValue&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;/div&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;});&lt;/span&gt;  
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;assertContains&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;pushSelectorAssertToQunit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                        &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; 
                        &lt;span class="s2"&gt;&amp;quot;should contains&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                        &lt;span class="nx"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;assertNotContains&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;pushSelectorAssertToQunit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                        &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; 
                        &lt;span class="s2"&gt;&amp;quot;should not contains&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                        &lt;span class="nx"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;assertContainsText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;pushSelectorAssertToQunit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;is&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;:contains(&amp;#39;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;#39;)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; 
                        &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; 
                        &lt;span class="s2"&gt;&amp;quot;should contains text&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                        &lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;assertNotContainsText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;pushSelectorAssertToQunit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;is&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;:contains(&amp;#39;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;#39;)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; 
                        &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; 
                        &lt;span class="s2"&gt;&amp;quot;should not contains text&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                        &lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;})(&lt;/span&gt; &lt;span class="nx"&gt;jQuery&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;There is only one dependency, the style_html function comes from &lt;a href="https://github.com/einars/js-beautify/blob/master/beautify-html.js"&gt;beutify_html.js&lt;/a&gt;. You can remove the function call, but it allows me to see beutiful errors when a test fail:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://joseoncodecom.ipage.com/wp-content/uploads/images/2012-01-19_1147.png" alt="2012-01-19_1147.png" /&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/JoseFRomaniello/~4/OcU5-X8Jhlk" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://joseoncode.com/2012/01/19/extending-jquery-with-qunit-assertions</feedburner:origLink></item>
    
    <item>
      <title>SinonJs: mocks for javascript</title>
      <link>http://feedproxy.google.com/~r/JoseFRomaniello/~3/bsxGpemtKSc/sinonjs-mocks-for-javascript</link>
      <pubDate>Wed, 18 Jan 2012 07:58:00 +0000</pubDate>
      <author>jfromaniello@gmail.com (José F. Romaniello)</author>
      <guid isPermaLink="false">http://joseoncode.com/2012/01/18/sinonjs-mocks-for-javascript</guid>
      <description>&lt;p&gt;&lt;a href="http://sinonjs.org/"&gt;Sinon.Js&lt;/a&gt; is a mock/stub/spy framework created by &lt;a href="http://cjohansen.no/"&gt;Christian Johansen&lt;/a&gt; author of the book &lt;a href="http://www.amazon.com/dp/0321683919/"&gt;Test-Driven Javascript Development &lt;/a&gt;.
It has a very handy syntax once you get used and some really useful features.&lt;/p&gt;

&lt;h1&gt;Do I need a mock framework in javascript?&lt;/h1&gt;

&lt;p&gt;Since javascript is a dynamic language and weak typed language a newcomer might don't feel the need of a mock framework for javascript. For instance if I can write a test like this:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nx"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;when clicking the loadMore button then block the ui&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;called&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;blockUI&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
        &lt;span class="nx"&gt;called&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.load-more&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;click&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;called&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;equal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Loading more tweets...&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Here, I replaced the $.blockUI method with a new method that stores two things; if the method was called and the message. And it will work but it has a problem since we are completely overwriting the method I am changing the environment where all test run.&lt;/p&gt;

&lt;p&gt;Sinon.JS has the concept of "sandbox". You can create as many mocks and stubs inside the sandbox, but onces you dispose the sandbox everything will be restored to the original state. I use a sandbox per unit test always.&lt;/p&gt;

&lt;p&gt;So the previous test with sinon.js will look as:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nx"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;when clicking the loadMore button then block the ui&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;blockUI&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;blockUI&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.load-more&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;click&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;blockUI&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;called&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;equal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;blockUI&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Loading more tweets...&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Which will work like the previous one, but the main difference is after the test has finished $.blockUI will be restored. Here I am using the Sinon.Js-qunit integration, but in the main website of Sinon.Js there are some other .js files to integrated with some other test frameworks. I have seen some people using Sinon.Js in node.js as well.&lt;/p&gt;

&lt;h1&gt;Mock ajax calls&lt;/h1&gt;

&lt;p&gt;Sinon.JS has a way to mock ajax calls (and it also follows the sandboxes rules). Here is an example test:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nx"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;when loading an empty inbox then show a message&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;respondWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/getLatestMails&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                            &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Content-Type&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;application/json&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;([])]);&lt;/span&gt;
    
    &lt;span class="nx"&gt;jmail&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;inbox&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;loadPage&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;respond&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;div#inbox&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;assertNotContains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;li.mail&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;it should contains a li.mail&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;div#inbox&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;assertContainsText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;The inbox is empty&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The first parameter in respondWith is the relative url, then an array with the status code result, headers and the body payload.&lt;/p&gt;

&lt;h1&gt;Stub method calls&lt;/h1&gt;

&lt;p&gt;Often we need to stub a function and set the result values for different arguments, with sinon we can do something like this:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nx"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;when changing the hash to target=inbox then call the inbox.loadPage&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;//arrange&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;getState&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bbq&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;getState&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="nx"&gt;jmailLoadPage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;jmail&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;inbox&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;loadPage&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;getState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;withArgs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;target&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;returns&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;inbox&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;//act&lt;/span&gt;
    &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;triggerHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;hashchange&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;//assert&lt;/span&gt;
    &lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;jmailLoadPage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;called&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;When calling $.bbq.getState("target") it will returns "inbox". You can set as many withArgs/returns as you want.&lt;/p&gt;

&lt;h1&gt;Using Mocks&lt;/h1&gt;

&lt;p&gt;According to Sinon.Js documentation,&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Mocks (and mock expectations) are fake methods (like spies) with pre-programmed behavior (like stubs) as well as pre-programmed expectations. A mock will fail your test if it is not used as expected.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;In an example before I shown the usage of called and args in stubs. We can set the expectation upfront (instead of asserting after the fact)  as follows:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nx"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;when clicking the loadMore button then block the ui&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;$mock&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;$mock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;expects&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;blockUI&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
         &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;once&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
         &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;withArgs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Loading more tweets...&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.load-more&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;click&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;After the test is finished (and the sandbox disposed) if we didn't fulfill the expectation the test will fail.&lt;/p&gt;

&lt;p&gt;I don't know why but I vaguely use this method, I prefer sinon.js stubs.&lt;/p&gt;

&lt;h1&gt;Test Spies&lt;/h1&gt;

&lt;p&gt;Spy objects works as stubs but the only difference is that the underlying method is called normally. To use this, instead of this.stub you will use this.spy.&lt;/p&gt;

&lt;p&gt;Another useful usage of spy is when you want to test how a method will use a callback. An example of this (from sinon docs) is:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="s2"&gt;&amp;quot;test should call subscribers on publish&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;callback&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;sinon&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;spy&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nx"&gt;PubSub&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;message&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;PubSub&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;publishSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;message&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;assertTrue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;called&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; 
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;As you can see here we are creating an spy without args.&lt;/p&gt;

&lt;h1&gt;About the QUnit Integration&lt;/h1&gt;

&lt;p&gt;In the Sinon.Js main page there is a &lt;a href="http://sinonjs.org/qunit/"&gt;sinon-qunit adapter&lt;/a&gt;. Unfortunately we found some problems with it, I think it was something with async tests.&lt;/p&gt;

&lt;p&gt;So, &lt;a href="http://machadogj.com"&gt;Gustavo Machado&lt;/a&gt; and I wrote a new adapter for qunit based on the module setup/teardown of qunit. I already published this file in my JMail repository so you can download it &lt;a href="https://github.com/jfromaniello/jmail/blob/master/scripts/Tests/sinon-qunit-1.0.0.js"&gt;here&lt;/a&gt;. There is only one drawback with this method and is that you need to set a qunit "module" for your tests.&lt;/p&gt;

&lt;h1&gt;Final thoughts&lt;/h1&gt;

&lt;p&gt;Sinon.Js is a must-have when doing TDD in javascript and I haven't found any other alternative. The documentation of Sinon.Js is very clear and easy to follow.&lt;/p&gt;

&lt;p&gt;Most of the examples in this blog post are from my Singe Page Application example called &lt;a href="https://github.com/jfromaniello/jmail/"&gt;Jmail&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/JoseFRomaniello/~4/bsxGpemtKSc" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://joseoncode.com/2012/01/18/sinonjs-mocks-for-javascript</feedburner:origLink></item>
    
    <item>
      <title>Slido: markdown to html5 slideshow</title>
      <link>http://feedproxy.google.com/~r/JoseFRomaniello/~3/xOtxtPkGEbg/slido-markdown-to-html5-slideshow</link>
      <pubDate>Thu, 29 Dec 2011 09:57:00 +0000</pubDate>
      <author>jfromaniello@gmail.com (José F. Romaniello)</author>
      <guid isPermaLink="false">http://joseoncode.com/2011/12/29/slido-markdown-to-html5-slideshow</guid>
      <description>&lt;p&gt;&lt;a href="http://slido.herokuapp.com"&gt;Slido&lt;/a&gt; is an experiment I did in &lt;a href="http://nodejs.org/"&gt;node.js&lt;/a&gt; based on Google's &lt;a href="http://slides.html5rocks.com/"&gt;Html5 Rocks&lt;/a&gt; and inspired by &lt;a href="http://slideshow.rubyforge.org/"&gt;Ruby S9 project&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Basically you write your presentation in markdown right in the page, and you get an html5 presentation that looks like a &lt;a href="http://en.wikipedia.org/wiki/Microsoft_PowerPoint"&gt;ppt&lt;/a&gt; but is better. You can edit it has many times as you want.&lt;/p&gt;

&lt;p&gt;If you save the presentation while you are authenticated (only facebook for now), you can share the link to view the presentation but no one can edit it except you.&lt;/p&gt;

&lt;p&gt;I did some improvements to Google's javascript client-side code, for instance now it works properly on IE9 (without the fancy CSS3 animations) and I also added a very hot new theme; "Windows Metro". This is an example of my &lt;a href="http://slido.herokuapp.com/slide/4e92efdd02e4c50100000001?defaultTheme=metro#slide-landing-slide"&gt;CodeCamp presentation&lt;/a&gt; (spanish).&lt;/p&gt;

&lt;p&gt;The code is opensource and it is &lt;a href="https://github.com/jfromaniello/slido"&gt;here&lt;/a&gt;. Any feedback is welcome, don't hesitate to send me a pull request and I will push to the heroku app.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/JoseFRomaniello/~4/xOtxtPkGEbg" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://joseoncode.com/2011/12/29/slido-markdown-to-html5-slideshow</feedburner:origLink></item>
    
    <item>
      <title>Continuous Testing scripts with Growl</title>
      <link>http://feedproxy.google.com/~r/JoseFRomaniello/~3/LlwL8nkkRS8/continuous-testing-scripts-with-growl</link>
      <pubDate>Fri, 09 Dec 2011 17:36:00 +0000</pubDate>
      <author>jfromaniello@gmail.com (José F. Romaniello)</author>
      <guid isPermaLink="false">http://joseoncode.com/2011/12/09/continuous-testing-scripts-with-growl</guid>
      <description>&lt;p&gt;Few days ago I discover Growl in twitter thanks to &lt;a href="http://twitter.com/hotgazpacho"&gt;Will Green&lt;/a&gt;. Growl is an open source notification system for Mac OS X. Basically it runs in the background and show the notifications sent by other programs.&lt;/p&gt;

&lt;p&gt;I was thinking to add something like this few month ago &lt;a href="/2011/08/08/javascript-continuous-testing-with-qunit-phantomjs-and-powershell/"&gt;to my continuous testing scripts for javascript&lt;/a&gt; but I didn't know about this software and even less than there is a &lt;a href="http://www.growlforwindows.com/gfw/default.aspx"&gt;version for windows&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;So, I start playing with an powershell script I found from an old post of &lt;a href="http://huddledmasses.org/more-growl-for-windows-from-powershell/"&gt;Joel Bennett&lt;/a&gt; changed to work with latest version of Growl, and published in &lt;a href="http://psget.net"&gt;PsGet&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you install Growl, you can use this script as follow:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="c"&gt;#Install PsGet&lt;/span&gt;
&lt;span class="c"&gt;#run this line only if you don&amp;#39;t have PsGet.Net already installed in order.&lt;/span&gt;
&lt;span class="o"&gt;(&lt;/span&gt;new-object Net.WebClient&lt;span class="o"&gt;)&lt;/span&gt;.DownloadString&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;http://psget.net/GetPsGet.ps1&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; | iex

&lt;span class="c"&gt;#Install Send-Growl&lt;/span&gt;
&lt;span class="c"&gt;#run this line if you don&amp;#39;t have Send-Growl yet &lt;/span&gt;
Import-Module PsGet
Install-Module Send-Growl

&lt;span class="c"&gt;#Register the application and add a notice type&lt;/span&gt;
Register-GrowlType MyApp NoticeType

&lt;span class="c"&gt;#Send a message&lt;/span&gt;
Send-Growl MyApp NoticeType &lt;span class="s2"&gt;&amp;quot;A Title&amp;quot;&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Some description&amp;quot;&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;http://a.link.callback.com&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;And as a result, you will see something like this:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://joseoncodecom.ipage.com/wp-content/uploads/images/2011-12-09_1750.png" alt="2011-12-09_1750.png" /&gt;&lt;/p&gt;

&lt;p&gt;I use this module in my continuous testing script, when I save a file, the tests suite is executed and it shows me the results as you can see in this mini screencast:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://joseoncodecom.ipage.com/wp-content/uploads/images/tdd-continuous-growl.gif" alt="screencast" /&gt;&lt;/p&gt;

&lt;p&gt;If you want to see how test this or see my javascript continuous testing script looks in &lt;a href="https://github.com/jfromaniello/jmail/blob/master/Tools/qunit-runner/continuous.ps1"&gt;my jmail project&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/JoseFRomaniello/~4/LlwL8nkkRS8" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://joseoncode.com/2011/12/09/continuous-testing-scripts-with-growl</feedburner:origLink></item>
    
    <item>
      <title>How I use Jing to add screenshots in markdown</title>
      <link>http://feedproxy.google.com/~r/JoseFRomaniello/~3/7wi-8Ar1_Q0/how-i-use-jing-when-writing-a-blog-post-in-markdown</link>
      <pubDate>Fri, 09 Dec 2011 00:35:00 +0000</pubDate>
      <author>jfromaniello@gmail.com (José F. Romaniello)</author>
      <guid isPermaLink="false">http://joseoncode.com/2011/12/09/how-i-use-jing-when-writing-a-blog-post-in-markdown</guid>
      <description>&lt;p&gt;Since I started to use Jekyll for this blog, one of the things that I miss was the way I was "pasting" screenshots in my posts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Take a screenshot with &lt;a href="http://www.techsmith.com/jing.html"&gt;Jing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Save it locally&lt;/li&gt;
&lt;li&gt;Insert it in the blog post (with Windows live writer)&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;The first posts that I wrote in markdown, I did something crazy: I uploaded the file using filezilla to my old ftp and then figure out what was the url to that image, and then the markdown syntax.&lt;/p&gt;

&lt;p&gt;Now, Jing has a very handy option to add a new button, first I went to Preferences and then to Customize Buttons:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://joseoncodecom.ipage.com/wp-content/uploads/images/2011-12-09_0047.png" alt="2011-12-09_0047.png" /&gt;&lt;/p&gt;

&lt;p&gt;Next I added a new button with these settings:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://joseoncodecom.ipage.com/wp-content/uploads/images/2011-12-09_0050.png" alt="2011-12-09_0050.png" /&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Button type: FTP&lt;/li&gt;
&lt;li&gt;My FTP settings connection settings&lt;/li&gt;
&lt;li&gt;After the screenshot is uploaded, I want the piece of markdown in my clipboard ready to paste. This include the markdown syntax with the full url to the image.&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;And now I can take a screenshot with a key combination, then click a button and get the markdown code ready to paste! I think is even easier than with the old WLW :).&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/JoseFRomaniello/~4/7wi-8Ar1_Q0" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://joseoncode.com/2011/12/09/how-i-use-jing-when-writing-a-blog-post-in-markdown</feedburner:origLink></item>
    
    <item>
      <title>PsGet.Net a repository of reusable powershell modules</title>
      <link>http://feedproxy.google.com/~r/JoseFRomaniello/~3/GP7TDddQKB4/psget-dot-net-the-repository-for-reusable-powershell-modules</link>
      <pubDate>Thu, 08 Dec 2011 23:02:00 +0000</pubDate>
      <author>jfromaniello@gmail.com (José F. Romaniello)</author>
      <guid isPermaLink="false">http://joseoncode.com/2011/12/08/psget-dot-net-the-repository-for-reusable-powershell-modules</guid>
      <description>&lt;p&gt;I love internet. Few MINUTES after I published one of my previous posts &lt;a href="/2011/11/24/sharing-powershell-modules-easily/"&gt;Sharing powershell scrtips easily&lt;/a&gt; I received a comment from &lt;a href="http://twitter.com/#!/chaliy"&gt;Mike Chaliy&lt;/a&gt; ;&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Hello, if you do not mind I added PsWatch to PsGet ;). Now if somebody have psget installed, Install-Module pswatch will do job.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Of course I didn't mind! In fact I love to discover things in this way.&lt;/p&gt;

&lt;p&gt;This is something really needed in the powershell echosystem; a centralized place to share reusable things.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://psget.net/"&gt;PsGet&lt;/a&gt; is a powershell pure-module you can easily install it with one line:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="o"&gt;(&lt;/span&gt;new-object Net.WebClient&lt;span class="o"&gt;)&lt;/span&gt;.DownloadString&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;http://psget.net/GetPsGet.ps1&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; | iex
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;And then you have to import the module as any other powershell module before using it:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;Import-Module PsGet
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;and then you can start using it. There is only one important command for now which is Install-Module. For instance if you want to install my PsWatch script, you do:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;Install-Module PsWatch
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;and you are done!&lt;/p&gt;

&lt;p&gt;&lt;img src="http://joseoncodecom.ipage.com/wp-content/uploads/images/2011-12-09_0004.png" alt="2011-12-09_0004.png" /&gt;&lt;/p&gt;

&lt;p&gt;Another interesting thing about PsGet is that you don't need to publish something to the repository in order to install it. You can use the modifiers -ModuleName to set the name of the module, and -ModuleUrl to provide an url where the module content is served as plain text:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;Install-Module -ModuleUrl https://mydomain.com/mymodule.psm1 -ModuleName my-module
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;If you want to take a look to the scripts already published you can look &lt;a href="http://psget.net/directory/"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;Things to improve&lt;/h1&gt;

&lt;p&gt;One of the things that needs more work I think is to descentralize the directory. Right now the only way to publish something is to fork Mike repository, edit the directory.xml file and push-request him.&lt;/p&gt;

&lt;p&gt;But so far is looking really good, well done Mike!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/JoseFRomaniello/~4/GP7TDddQKB4" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://joseoncode.com/2011/12/08/psget-dot-net-the-repository-for-reusable-powershell-modules</feedburner:origLink></item>
    
    <item>
      <title>Posh-Git and Posh-Hg in the same machine</title>
      <link>http://feedproxy.google.com/~r/JoseFRomaniello/~3/EIkqNQxeGeg/running-posh-git-and-posh-hg-in-the-same-machine</link>
      <pubDate>Wed, 30 Nov 2011 14:30:00 +0000</pubDate>
      <author>jfromaniello@gmail.com (José F. Romaniello)</author>
      <guid isPermaLink="false">http://joseoncode.com/2011/11/30/running-posh-git-and-posh-hg-in-the-same-machine</guid>
      <description>&lt;p&gt;&lt;a href="http://git-scm.com/"&gt;Git&lt;/a&gt; and &lt;a href="http://mercurial.selenic.com/"&gt;Mercurial&lt;/a&gt; have powerfull command line interfaces besides GUIs like TortoiseGit, GitExtensions and TortoiseHg.&lt;/p&gt;

&lt;p&gt;There are two projects that I like &lt;a href="https://github.com/dahlbyk/posh-git"&gt;Posh-Git&lt;/a&gt; and &lt;a href="https://github.com/JeremySkinner/posh-hg"&gt;Posh-Hg&lt;/a&gt;. These projects add to the Powersherll terminal TAB completion and some usefull information in the prompt as shown here:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://joseoncodecom.ipage.com/wp-content/uploads/images/2011-11-30_1527.png" alt="Posh-Hg screenshot" /&gt;&lt;/p&gt;

&lt;p&gt;The problem that I had is that even if it is well documented how to install each one, I couldn't make both work in the same machine. There is an answer in &lt;a href="http://stackoverflow.com/a/4845935/234047"&gt;stackoverflow&lt;/a&gt; which is a very good starting point, but it has a problem with the path variables used and TAB completion in mercurial seems broken after.&lt;/p&gt;

&lt;p&gt;This is how I installed and I have both working now. First you will need to download the two repositorios to My Documents\WindowsPowerShell\Modules\ and then in My Documents\WindowsPowerShell add a file named profile.ps1 with the following content:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="k"&gt;function &lt;/span&gt;isCurrentDirectoryARepository&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$type&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;((&lt;/span&gt;Test-Path &lt;span class="nv"&gt;$type&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; -eq &lt;span class="nv"&gt;$TRUE&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$TRUE&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="c"&gt;# Test within parent dirs&lt;/span&gt;
    &lt;span class="nv"&gt;$checkIn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;Get-Item .&lt;span class="o"&gt;)&lt;/span&gt;.parent
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$checkIn&lt;/span&gt; -ne &lt;span class="nv"&gt;$NULL&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$pathToTest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$checkIn&lt;/span&gt;.fullname + &lt;span class="s1"&gt;&amp;#39;/&amp;#39;&lt;/span&gt; + &lt;span class="nv"&gt;$type&lt;/span&gt;;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;((&lt;/span&gt;Test-Path &lt;span class="nv"&gt;$pathToTest&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; -eq &lt;span class="nv"&gt;$TRUE&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$TRUE&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="nv"&gt;$checkIn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$checkIn&lt;/span&gt;.parent
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$FALSE&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;# Posh-Hg and Posh-git prompt&lt;/span&gt;

. &lt;span class="nv"&gt;$Home&lt;/span&gt;&lt;span class="se"&gt;\D&lt;/span&gt;ocuments&lt;span class="se"&gt;\W&lt;/span&gt;indowsPowerShell&lt;span class="se"&gt;\M&lt;/span&gt;odules&lt;span class="se"&gt;\p&lt;/span&gt;osh-git&lt;span class="se"&gt;\p&lt;/span&gt;rofile.example.ps1
. &lt;span class="nv"&gt;$Home&lt;/span&gt;&lt;span class="se"&gt;\D&lt;/span&gt;ocuments&lt;span class="se"&gt;\W&lt;/span&gt;indowsPowerShell&lt;span class="se"&gt;\M&lt;/span&gt;odules&lt;span class="se"&gt;\p&lt;/span&gt;osh-hg&lt;span class="se"&gt;\p&lt;/span&gt;rofile.example.ps1

&lt;span class="k"&gt;function &lt;/span&gt;prompt&lt;span class="o"&gt;(){&lt;/span&gt;
    &lt;span class="c"&gt;# Reset color, which can be messed up by Enable-GitColors&lt;/span&gt;
    &lt;span class="nv"&gt;$Host&lt;/span&gt;.UI.RawUI.ForegroundColor &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$GitPromptSettings&lt;/span&gt;.DefaultForegroundColor

    Write-Host&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$pwd&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; -nonewline

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;isCurrentDirectoryARepository&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.git&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c"&gt;# Git Prompt&lt;/span&gt;
        &lt;span class="nv"&gt;$Global&lt;/span&gt;:GitStatus &lt;span class="o"&gt;=&lt;/span&gt; Get-GitStatus
        Write-GitStatus &lt;span class="nv"&gt;$GitStatus&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt; elseif &lt;span class="o"&gt;(&lt;/span&gt;isCurrentDirectoryARepository&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.hg&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c"&gt;# Mercurial Prompt&lt;/span&gt;
        &lt;span class="nv"&gt;$Global&lt;/span&gt;:HgStatus &lt;span class="o"&gt;=&lt;/span&gt; Get-HgStatus
        Write-HgStatus &lt;span class="nv"&gt;$HgStatus&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;gt; &amp;quot;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JoseFRomaniello/~4/EIkqNQxeGeg" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://joseoncode.com/2011/11/30/running-posh-git-and-posh-hg-in-the-same-machine</feedburner:origLink></item>
    
    <item>
      <title>Generating monthly archives with Jekyll</title>
      <link>http://feedproxy.google.com/~r/JoseFRomaniello/~3/jte6C11zlqs/generating-monthly-archives-with-jekyll</link>
      <pubDate>Sun, 27 Nov 2011 21:23:00 +0000</pubDate>
      <author>jfromaniello@gmail.com (José F. Romaniello)</author>
      <guid isPermaLink="false">http://joseoncode.com/2011/11/27/generating-monthly-archives-with-jekyll</guid>
      <description>&lt;p&gt;Continuing my series of posts about Jekyll I will show in this post how to generate monthly archives.
This is the index you see when you enter this url:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;http://joseoncode.com/2011/11
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The difference between Jekyll and any other blog system is that Jekyll generate the site at build time, while the others generate the page at runtime with data coming from a database.&lt;/p&gt;

&lt;p&gt;The first thing you will need is a jekyll plugin in the "_plugins" folder as follow:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;Jekyll&lt;/span&gt;
  &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ArchiveIndex&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;Page&lt;/span&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;site&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dir&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;period&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="vi"&gt;@site&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;site&lt;/span&gt;
      &lt;span class="vi"&gt;@base&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt;
      &lt;span class="vi"&gt;@dir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dir&lt;/span&gt;
      &lt;span class="vi"&gt;@name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;index.html&amp;#39;&lt;/span&gt;
      &lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;process&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vi"&gt;@name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read_yaml&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;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;_layouts&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;archive_index.html&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;period&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;period&lt;/span&gt;
      &lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;period_posts&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;posts&lt;/span&gt;
      &lt;span class="n"&gt;archive_title_prefix&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;archive_title_prefix&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Archive: &amp;amp;ldquo;&amp;#39;&lt;/span&gt;
      &lt;span class="n"&gt;archive_title_suffix&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;archive_title_suffix&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;amp;rdquo;&amp;#39;&lt;/span&gt;
      &lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;title&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;archive_title_prefix&lt;/span&gt;&lt;span class="si"&gt;}#{&lt;/span&gt;&lt;span class="n"&gt;period&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;month&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;]&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;period&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;year&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}#{&lt;/span&gt;&lt;span class="n"&gt;archive_title_suffix&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ArchiveGenerator&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;Generator&lt;/span&gt;
    &lt;span class="n"&gt;safe&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;layouts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;key?&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;archive_index&amp;#39;&lt;/span&gt;
        &lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;posts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;group_by&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;month&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;month&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;year&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;year&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}&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;period&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;posts&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
          &lt;span class="n"&gt;archive_dir&lt;/span&gt; &lt;span class="o"&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;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;period&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;year&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="n"&gt;to_s&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;%02d&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;period&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;month&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="n"&gt;to_s&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
          &lt;span class="n"&gt;write_archive_index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;archive_dir&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;period&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;end&lt;/span&gt;
      &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;write_archive_index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dir&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;period&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;ArchiveIndex&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;site&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dir&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;period&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;layouts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;site_payload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pages&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Shame on me!! please pardon my ruby skills.&lt;/p&gt;

&lt;p&gt;This will generate an html file index.html in the folder /YYYY/MM.&lt;/p&gt;

&lt;p&gt;And then in the "layout" folder I wrote a template for this archive_index.html (you can set another name in _config.yml):&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;---
layout: default
meta-robots: &amp;quot;noodp, noydir, noindex, noarchive, follow&amp;quot;
---

&lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt; Posts archive: {{ page.period[&amp;quot;month&amp;quot;] }} - {{page.period[&amp;quot;year&amp;quot;]}} &lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&amp;lt;br&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;ul&amp;gt;&lt;/span&gt;
{% for post in page.period_posts %}
&lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt; 
    &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{{ post.title }}&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;entry-meta&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Published: {{ post.date | date: &amp;quot;%B %d, %Y&amp;quot; }}&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
{% endfor %}
&lt;span class="nt"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JoseFRomaniello/~4/jte6C11zlqs" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://joseoncode.com/2011/11/27/generating-monthly-archives-with-jekyll</feedburner:origLink></item>
    
    <item>
      <title>Solving UTF problem with Jekyll on Windows</title>
      <link>http://feedproxy.google.com/~r/JoseFRomaniello/~3/q0kZawCE7NE/solving-utf-problem-with-jekyll-on-windows</link>
      <pubDate>Sun, 27 Nov 2011 10:48:00 +0000</pubDate>
      <author>jfromaniello@gmail.com (José F. Romaniello)</author>
      <guid isPermaLink="false">http://joseoncode.com/2011/11/27/solving-utf-problem-with-jekyll-on-windows</guid>
      <description>&lt;p&gt;As I mention before I am running this blog with Jekyll.
I noticed a problem while trying to execute the blog from windows:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Liquid Exception: incompatible character encodings: UTF-8 and IBM437 in index.html
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;After further investigation I found that this problem means that the console you are trying to run ruby doesn't work with UTF characters ( ? ).
The way you can fix this is to set the code-page before running the jekyll command, simple execute this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;chcp 65001
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Beaware that I tried to set this globally by changing a registry key, and I broke my windows installation... seems that 65001 is not something that you can use globally, so don't do it.&lt;/p&gt;

&lt;p&gt;Instead I added a new rake task as follows:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;task :runwindows do
    puts '* Changing the codepage'
    `chcp 65001`
    puts '* Running Jekyll'
    `jekyll --server --auto`
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;and now I can execute jekyll with:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;rake runwindows
&lt;/code&gt;&lt;/pre&gt;&lt;img src="http://feeds.feedburner.com/~r/JoseFRomaniello/~4/q0kZawCE7NE" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://joseoncode.com/2011/11/27/solving-utf-problem-with-jekyll-on-windows</feedburner:origLink></item>
    

  </channel> 
</rss>

