<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  

  <id>http://blog.zenspider.com/</id>
  <title>Polishing Ruby + Software Releases - zenspider.com</title>
  <updated>2012-05-15T17:24:29-07:00</updated>

  <author>
    <name>ryan davis</name>
    <email>ryand-ruby@zenspider.com</email>
  </author>

  <link href="http://blog.zenspider.com/atom.xml" rel="self"/>
  <link href="http://blog.zenspider.com/"/>

  <rights> © ryan davis - ryand-ruby@zenspider.com </rights>

  
    <entry>
      <id>http://blog.zenspider.com/releases/2012/05/hoe-version-3-0-6-has-been-released.html</id>
      <title>hoe version 3.0.6 has been released!</title>
      <updated>2012-05-15T17:24:29-07:00</updated>

      <link rel="alternate" href="http://blog.zenspider.com/releases/2012/05/hoe-version-3-0-6-has-been-released.html"/>

      <published>2012-05-15T17:24:29-07:00</published>
      <content type="html">&lt;p&gt;Hoe is a rake/rubygems helper for project Rakefiles. It helps you
manage, maintain, and release your project and includes a dynamic
plug-in system allowing for easy extensibility. Hoe ships with
plug-ins for all your usual project tasks including rdoc generation,
testing, packaging, deployment, and announcement..&lt;/p&gt;

&lt;p&gt;See class rdoc for help. Hint: &lt;code&gt;ri Hoe&lt;/code&gt; or any of the plugins listed
below.&lt;/p&gt;

&lt;p&gt;For extra goodness, see: http://seattlerb.rubyforge.org/hoe/Hoe.pdf&lt;/p&gt;

&lt;p&gt;Changes:&lt;/p&gt;

&lt;h3 id=&quot;section&quot;&gt;3.0.6 / 2012-05-15&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;1 minor enhancement:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Added install_plugins to the newb task&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;bugs: &lt;a href=&quot;https://github.com/seattlerb/hoe/issues&quot;&gt;https://github.com/seattlerb/hoe/issues&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;code: &lt;a href=&quot;https://github.com/seattlerb/hoe&quot;&gt;https://github.com/seattlerb/hoe&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;other: &lt;a href=&quot;http://github.com/jbarnette/hoe-plugin-examples&quot;&gt;http://github.com/jbarnette/hoe-plugin-examples&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;doco: &lt;a href=&quot;http://seattlerb.rubyforge.org/hoe/Hoe.pdf&quot;&gt;http://seattlerb.rubyforge.org/hoe/Hoe.pdf&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;rdoc: &lt;a href=&quot;http://seattlerb.rubyforge.org/hoe/&quot;&gt;http://seattlerb.rubyforge.org/hoe/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;home: &lt;a href=&quot;http://www.zenspider.com/projects/hoe.html&quot;&gt;http://www.zenspider.com/projects/hoe.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
  
    <entry>
      <id>http://blog.zenspider.com/blog/2012/05/repeating-tasks.html</id>
      <title>Repeating Tasks</title>
      <updated>2012-05-14T12:00:00-07:00</updated>

      <link rel="alternate" href="http://blog.zenspider.com/blog/2012/05/repeating-tasks.html"/>

      <published>2012-05-14T12:00:00-07:00</published>
      <content type="html">&lt;p&gt;This is my fourth entry detailing my personal &amp;ldquo;&lt;a href=&quot;/blog/2012/05/productivity-pr0n.html&quot;&gt;productivity pr0n&lt;/a&gt;&amp;rdquo;.&lt;/p&gt;

&lt;h2 id=&quot;what-they-do&quot;&gt;What They Do&lt;/h2&gt;

&lt;p&gt;One of the gems I got from my meeting at omni was the sheer scope and power of repeating tasks. I didn&amp;rsquo;t use them &lt;em&gt;at all&lt;/em&gt; before that and honestly didn&amp;rsquo;t understand what I&amp;rsquo;d use them. Since then they&amp;rsquo;ve completely turned my workflow around.&lt;/p&gt;

&lt;p&gt;Basically, any task can have a &amp;ldquo;repeat&amp;rdquo; and the repeat interval is very customizable, esp with the latest version of omnifocus. Repeating just means a new version of that task is created with a new start and/or due date.&lt;/p&gt;

&lt;p&gt;You can have a task repeat every N days/weeks/months regardless of when it was completed, or have it repeat N days/weeks/months after you complete it. The difference is subtle but important. For example, If you need to write and send a weekly status report &lt;em&gt;every&lt;/em&gt; friday then you&amp;rsquo;d use the former. But if you need to check your oil 3 months after you last checked it, you&amp;rsquo;d use the latter.&lt;/p&gt;

&lt;h2 id=&quot;daily&quot;&gt;Daily&lt;/h2&gt;

&lt;p&gt;For me, initially at least, it was all about the daily task. I had a &lt;em&gt;lot&lt;/em&gt; of backlog in my project planning, execution, and life in general. The daily task gave me bite sized chunks to do so I had continual progress across all of them. I didn&amp;rsquo;t have to get overwhelmed by the size of the overall task. Here&amp;rsquo;s my current daily tasks:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/omnifocus_daily.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;p&gt;There were a lot more, but most of them got caught up and then eventually promoted to weekly repeating tasks.&lt;/p&gt;

&lt;p&gt;The important part is that I didn&amp;rsquo;t say &amp;ldquo;Empty Inbox Mail&amp;rdquo;, instead I focused on &amp;ldquo;Process Inbox Mail&amp;rdquo;. The original comment was something like &amp;ldquo;Do 5-10 quickly&amp;rdquo;. The task is only estimated at 10 minutes and that&amp;rsquo;s all I wanted to do. Strategically, you&amp;rsquo;ll notice that I only have 6 10 minute tasks and many of them are often much faster than that.&lt;/p&gt;

&lt;p&gt;Also important, notice that I have &amp;ldquo;Process OmniFocus Inbox&amp;rdquo; and &amp;ldquo;Triage Due Perspective&amp;rdquo;. Tasks about tasks. By creating and working on these you know that you don&amp;rsquo;t have to have all your tasks perfectly organized and it also means you don&amp;rsquo;t have to put all the info on a task. You can just write enough information for you to be able to do the task, and organize it the next day when you process your inbox.&lt;/p&gt;

&lt;h2 id=&quot;weekly&quot;&gt;Weekly&lt;/h2&gt;

&lt;p&gt;And here are my weekly tasks:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/omnifocus_weekly.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;p&gt;One thing to note is that I treat a lot of these like a pipeline. I don&amp;rsquo;t have to get everything right all at once. All I have to do is progress something to the next stage. &amp;ldquo;Contextualize new tasks&amp;rdquo; is only there to fill in the context field on new tasks. That moves them on into &amp;ldquo;Estimate new tasks&amp;rdquo; and so on. Again, the intent is just to make it so I have simple digestible tasks.&lt;/p&gt;

&lt;p&gt;And yes&amp;hellip; I hate processing my physical inbox. :(&lt;/p&gt;

</content>
    </entry>
  
    <entry>
      <id>http://blog.zenspider.com/blog/2012/05/how-to-write-minitest-spec-expectations-by-jared-ning.html</id>
      <title>How to Write MiniTest::Spec Expectations</title>
      <updated>2012-05-11T12:00:00-07:00</updated>

      <link rel="alternate" href="http://blog.zenspider.com/blog/2012/05/how-to-write-minitest-spec-expectations-by-jared-ning.html"/>

      <published>2012-05-11T12:00:00-07:00</published>
      <content type="html">&lt;p&gt;Originally published by Jared Ning at: https://gist.github.com/2032303 . Republished with permission.&lt;/p&gt;

&lt;p&gt;I&amp;rsquo;m a fan of MiniTest::Spec. It strikes a nice balance between the simplicity of TestUnit and the readable syntax of RSpec. When I first switched from RSpec to MiniTest::Spec, one thing I was worried I would miss was the ability to add matchers. (A note in terminology: &amp;ldquo;matchers&amp;rdquo; in MiniTest::Spec refer to something completely different than &amp;ldquo;matchers&amp;rdquo; in RSpec. I won&amp;rsquo;t get into it, but from now on, let&amp;rsquo;s use the proper term: &amp;ldquo;expectations&amp;rdquo;).&lt;/p&gt;

&lt;h2 id=&quot;understanding-minitestexpectations&quot;&gt;Understanding MiniTest::Expectations&lt;/h2&gt;

&lt;p&gt;Let&amp;rsquo;s take a look in the code (I&amp;rsquo;m specifically referring to the gem, not the standard library that&amp;rsquo;s built into Ruby 1.9):&lt;/p&gt;

&lt;div&gt;&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td class=&quot;line-numbers&quot; title=&quot;double click to toggle&quot; ondblclick=&quot;with (this.firstChild.style) { display = (display == '') ? 'none' : '' }&quot;&gt;&lt;pre&gt;&lt;a href=&quot;#n1&quot; name=&quot;n1&quot;&gt;1&lt;/a&gt;
&lt;a href=&quot;#n2&quot; name=&quot;n2&quot;&gt;2&lt;/a&gt;
&lt;a href=&quot;#n3&quot; name=&quot;n3&quot;&gt;3&lt;/a&gt;
&lt;a href=&quot;#n4&quot; name=&quot;n4&quot;&gt;4&lt;/a&gt;
&lt;a href=&quot;#n5&quot; name=&quot;n5&quot;&gt;5&lt;/a&gt;
&lt;a href=&quot;#n6&quot; name=&quot;n6&quot;&gt;6&lt;/a&gt;
&lt;a href=&quot;#n7&quot; name=&quot;n7&quot;&gt;7&lt;/a&gt;
&lt;a href=&quot;#n8&quot; name=&quot;n8&quot;&gt;8&lt;/a&gt;
&lt;a href=&quot;#n9&quot; name=&quot;n9&quot;&gt;9&lt;/a&gt;
&lt;strong&gt;&lt;a href=&quot;#n10&quot; name=&quot;n10&quot;&gt;10&lt;/a&gt;&lt;/strong&gt;
&lt;a href=&quot;#n11&quot; name=&quot;n11&quot;&gt;11&lt;/a&gt;
&lt;a href=&quot;#n12&quot; name=&quot;n12&quot;&gt;12&lt;/a&gt;
&lt;a href=&quot;#n13&quot; name=&quot;n13&quot;&gt;13&lt;/a&gt;
&lt;a href=&quot;#n14&quot; name=&quot;n14&quot;&gt;14&lt;/a&gt;
&lt;a href=&quot;#n15&quot; name=&quot;n15&quot;&gt;15&lt;/a&gt;
&lt;a href=&quot;#n16&quot; name=&quot;n16&quot;&gt;16&lt;/a&gt;
&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;comment&quot;&gt;# minitest/spec.rb&lt;/span&gt;

&lt;span class=&quot;keyword&quot;&gt;module&lt;/span&gt; &lt;span class=&quot;class&quot;&gt;MiniTest::Expectations&lt;/span&gt;
  &lt;span class=&quot;comment&quot;&gt;# ...&lt;/span&gt;

  &lt;span class=&quot;comment&quot;&gt;##&lt;/span&gt;
  &lt;span class=&quot;comment&quot;&gt;# See MiniTest::Assertions#assert_instance_of&lt;/span&gt;
  &lt;span class=&quot;comment&quot;&gt;#&lt;/span&gt;
  &lt;span class=&quot;comment&quot;&gt;#    obj.must_be_instance_of klass&lt;/span&gt;
  &lt;span class=&quot;comment&quot;&gt;#&lt;/span&gt;
  &lt;span class=&quot;comment&quot;&gt;# :method: must_be_instance_of&lt;/span&gt;

  infect_an_assertion &lt;span class=&quot;symbol&quot;&gt;:assert_instance_of&lt;/span&gt;, &lt;span class=&quot;symbol&quot;&gt;:must_be_instance_of&lt;/span&gt;

  &lt;span class=&quot;comment&quot;&gt;# ...&lt;/span&gt;
&lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;

&lt;p&gt;That entire module is filled with almost nothing but one-line &amp;ldquo;definitions&amp;rdquo;. They each give a very brief description and instructions to see the related assertion. One great thing about MiniTest::Spec is that it&amp;rsquo;s built right on top of MiniTest::Unit, which is very simple and therefor very fast. &lt;code&gt;infect_an_assertion&lt;/code&gt; simply calls the assertion and passes the arguments. For example, from the above definition:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;'foobar'.must_be_instance_of String&lt;/code&gt; calls &lt;code&gt;assert_instance_of String, 'foobar'&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Notice the order of &lt;code&gt;'foobar'&lt;/code&gt; and &lt;code&gt;String&lt;/code&gt; in the assertion as opposed to the expectation. See how they&amp;rsquo;re flipped? The convention for the order of arguments in an assertion is expected value goes first, then actual value. With expectations, it&amp;rsquo;s the opposite:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;assert_equal 'expected', 'actual'&lt;/code&gt; and &lt;code&gt;'actual'.must_equal 'expected'&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Let&amp;rsquo;s look at another example:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;infect_an_assertion :assert_includes, :must_include, :reverse&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;assert_includes [1, 2, 3], 1&lt;/code&gt; is the same as &lt;code&gt;[1, 2, 3].must_include 1&lt;/code&gt;. But notice that the order of the arguments isn&amp;rsquo;t flipped. That&amp;rsquo;s why the &lt;code&gt;:reverse&lt;/code&gt; argument above is needed.&lt;/p&gt;

&lt;p&gt;Similarly, another example of when it&amp;rsquo;s necessary not to flip the arguments is when there is only 1 argument. For example:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;infect_an_assertion :assert_empty, :must_be_empty, :unary&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The assertion is &lt;code&gt;assert_empty []&lt;/code&gt;, and the expectation is &lt;code&gt;[].must_be_empty&lt;/code&gt;. &lt;code&gt;infect_an_assertion&lt;/code&gt; splats (&lt;code&gt;*args&lt;/code&gt;) the arguments, so the lack of arguments to flip doesn&amp;rsquo;t mess up anything. But we do need to flip, nevertheless. The &lt;code&gt;:unary&lt;/code&gt; argument does this for us. It does exactly the same thing the &lt;code&gt;:reverse&lt;/code&gt; argument does. In fact, anything other than &lt;code&gt;nil&lt;/code&gt; or &lt;code&gt;false&lt;/code&gt; will work, but it&amp;rsquo;s good to be descriptive.&lt;/p&gt;

&lt;h2 id=&quot;writing-our-own-custom-assertionexpectation&quot;&gt;Writing our own custom assertion/expectation&lt;/h2&gt;

&lt;p&gt;Now that we understand how MiniTest::Expectations uses &lt;code&gt;infect_an_assertion&lt;/code&gt; to define expectations, let&amp;rsquo;s write our own custom assertions and corresponding expectations.&lt;/p&gt;

&lt;div&gt;&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td class=&quot;line-numbers&quot; title=&quot;double click to toggle&quot; ondblclick=&quot;with (this.firstChild.style) { display = (display == '') ? 'none' : '' }&quot;&gt;&lt;pre&gt;&lt;a href=&quot;#n1&quot; name=&quot;n1&quot;&gt;1&lt;/a&gt;
&lt;a href=&quot;#n2&quot; name=&quot;n2&quot;&gt;2&lt;/a&gt;
&lt;a href=&quot;#n3&quot; name=&quot;n3&quot;&gt;3&lt;/a&gt;
&lt;a href=&quot;#n4&quot; name=&quot;n4&quot;&gt;4&lt;/a&gt;
&lt;a href=&quot;#n5&quot; name=&quot;n5&quot;&gt;5&lt;/a&gt;
&lt;a href=&quot;#n6&quot; name=&quot;n6&quot;&gt;6&lt;/a&gt;
&lt;a href=&quot;#n7&quot; name=&quot;n7&quot;&gt;7&lt;/a&gt;
&lt;a href=&quot;#n8&quot; name=&quot;n8&quot;&gt;8&lt;/a&gt;
&lt;a href=&quot;#n9&quot; name=&quot;n9&quot;&gt;9&lt;/a&gt;
&lt;strong&gt;&lt;a href=&quot;#n10&quot; name=&quot;n10&quot;&gt;10&lt;/a&gt;&lt;/strong&gt;
&lt;a href=&quot;#n11&quot; name=&quot;n11&quot;&gt;11&lt;/a&gt;
&lt;a href=&quot;#n12&quot; name=&quot;n12&quot;&gt;12&lt;/a&gt;
&lt;a href=&quot;#n13&quot; name=&quot;n13&quot;&gt;13&lt;/a&gt;
&lt;a href=&quot;#n14&quot; name=&quot;n14&quot;&gt;14&lt;/a&gt;
&lt;a href=&quot;#n15&quot; name=&quot;n15&quot;&gt;15&lt;/a&gt;
&lt;a href=&quot;#n16&quot; name=&quot;n16&quot;&gt;16&lt;/a&gt;
&lt;a href=&quot;#n17&quot; name=&quot;n17&quot;&gt;17&lt;/a&gt;
&lt;a href=&quot;#n18&quot; name=&quot;n18&quot;&gt;18&lt;/a&gt;
&lt;a href=&quot;#n19&quot; name=&quot;n19&quot;&gt;19&lt;/a&gt;
&lt;strong&gt;&lt;a href=&quot;#n20&quot; name=&quot;n20&quot;&gt;20&lt;/a&gt;&lt;/strong&gt;
&lt;a href=&quot;#n21&quot; name=&quot;n21&quot;&gt;21&lt;/a&gt;
&lt;a href=&quot;#n22&quot; name=&quot;n22&quot;&gt;22&lt;/a&gt;
&lt;a href=&quot;#n23&quot; name=&quot;n23&quot;&gt;23&lt;/a&gt;
&lt;a href=&quot;#n24&quot; name=&quot;n24&quot;&gt;24&lt;/a&gt;
&lt;a href=&quot;#n25&quot; name=&quot;n25&quot;&gt;25&lt;/a&gt;
&lt;a href=&quot;#n26&quot; name=&quot;n26&quot;&gt;26&lt;/a&gt;
&lt;a href=&quot;#n27&quot; name=&quot;n27&quot;&gt;27&lt;/a&gt;
&lt;a href=&quot;#n28&quot; name=&quot;n28&quot;&gt;28&lt;/a&gt;
&lt;a href=&quot;#n29&quot; name=&quot;n29&quot;&gt;29&lt;/a&gt;
&lt;strong&gt;&lt;a href=&quot;#n30&quot; name=&quot;n30&quot;&gt;30&lt;/a&gt;&lt;/strong&gt;
&lt;a href=&quot;#n31&quot; name=&quot;n31&quot;&gt;31&lt;/a&gt;
&lt;a href=&quot;#n32&quot; name=&quot;n32&quot;&gt;32&lt;/a&gt;
&lt;a href=&quot;#n33&quot; name=&quot;n33&quot;&gt;33&lt;/a&gt;
&lt;a href=&quot;#n34&quot; name=&quot;n34&quot;&gt;34&lt;/a&gt;
&lt;a href=&quot;#n35&quot; name=&quot;n35&quot;&gt;35&lt;/a&gt;
&lt;a href=&quot;#n36&quot; name=&quot;n36&quot;&gt;36&lt;/a&gt;
&lt;a href=&quot;#n37&quot; name=&quot;n37&quot;&gt;37&lt;/a&gt;
&lt;a href=&quot;#n38&quot; name=&quot;n38&quot;&gt;38&lt;/a&gt;
&lt;a href=&quot;#n39&quot; name=&quot;n39&quot;&gt;39&lt;/a&gt;
&lt;strong&gt;&lt;a href=&quot;#n40&quot; name=&quot;n40&quot;&gt;40&lt;/a&gt;&lt;/strong&gt;
&lt;a href=&quot;#n41&quot; name=&quot;n41&quot;&gt;41&lt;/a&gt;
&lt;a href=&quot;#n42&quot; name=&quot;n42&quot;&gt;42&lt;/a&gt;
&lt;a href=&quot;#n43&quot; name=&quot;n43&quot;&gt;43&lt;/a&gt;
&lt;a href=&quot;#n44&quot; name=&quot;n44&quot;&gt;44&lt;/a&gt;
&lt;a href=&quot;#n45&quot; name=&quot;n45&quot;&gt;45&lt;/a&gt;
&lt;a href=&quot;#n46&quot; name=&quot;n46&quot;&gt;46&lt;/a&gt;
&lt;a href=&quot;#n47&quot; name=&quot;n47&quot;&gt;47&lt;/a&gt;
&lt;a href=&quot;#n48&quot; name=&quot;n48&quot;&gt;48&lt;/a&gt;
&lt;a href=&quot;#n49&quot; name=&quot;n49&quot;&gt;49&lt;/a&gt;
&lt;strong&gt;&lt;a href=&quot;#n50&quot; name=&quot;n50&quot;&gt;50&lt;/a&gt;&lt;/strong&gt;
&lt;a href=&quot;#n51&quot; name=&quot;n51&quot;&gt;51&lt;/a&gt;
&lt;a href=&quot;#n52&quot; name=&quot;n52&quot;&gt;52&lt;/a&gt;
&lt;a href=&quot;#n53&quot; name=&quot;n53&quot;&gt;53&lt;/a&gt;
&lt;a href=&quot;#n54&quot; name=&quot;n54&quot;&gt;54&lt;/a&gt;
&lt;a href=&quot;#n55&quot; name=&quot;n55&quot;&gt;55&lt;/a&gt;
&lt;a href=&quot;#n56&quot; name=&quot;n56&quot;&gt;56&lt;/a&gt;
&lt;a href=&quot;#n57&quot; name=&quot;n57&quot;&gt;57&lt;/a&gt;
&lt;a href=&quot;#n58&quot; name=&quot;n58&quot;&gt;58&lt;/a&gt;
&lt;a href=&quot;#n59&quot; name=&quot;n59&quot;&gt;59&lt;/a&gt;
&lt;strong&gt;&lt;a href=&quot;#n60&quot; name=&quot;n60&quot;&gt;60&lt;/a&gt;&lt;/strong&gt;
&lt;a href=&quot;#n61&quot; name=&quot;n61&quot;&gt;61&lt;/a&gt;
&lt;a href=&quot;#n62&quot; name=&quot;n62&quot;&gt;62&lt;/a&gt;
&lt;a href=&quot;#n63&quot; name=&quot;n63&quot;&gt;63&lt;/a&gt;
&lt;a href=&quot;#n64&quot; name=&quot;n64&quot;&gt;64&lt;/a&gt;
&lt;a href=&quot;#n65&quot; name=&quot;n65&quot;&gt;65&lt;/a&gt;
&lt;a href=&quot;#n66&quot; name=&quot;n66&quot;&gt;66&lt;/a&gt;
&lt;a href=&quot;#n67&quot; name=&quot;n67&quot;&gt;67&lt;/a&gt;
&lt;a href=&quot;#n68&quot; name=&quot;n68&quot;&gt;68&lt;/a&gt;
&lt;a href=&quot;#n69&quot; name=&quot;n69&quot;&gt;69&lt;/a&gt;
&lt;strong&gt;&lt;a href=&quot;#n70&quot; name=&quot;n70&quot;&gt;70&lt;/a&gt;&lt;/strong&gt;
&lt;a href=&quot;#n71&quot; name=&quot;n71&quot;&gt;71&lt;/a&gt;
&lt;a href=&quot;#n72&quot; name=&quot;n72&quot;&gt;72&lt;/a&gt;
&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;require &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;minitest/autorun&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;'&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;keyword&quot;&gt;module&lt;/span&gt; &lt;span class=&quot;class&quot;&gt;MiniTest::Assertions&lt;/span&gt;
  &lt;span class=&quot;keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;function&quot;&gt;assert_equals_rounded&lt;/span&gt;(rounded, decimal)
    assert rounded == decimal.round, &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;Expected &lt;/span&gt;&lt;span class=&quot;inline&quot;&gt;&lt;span class=&quot;inline-delimiter&quot;&gt;#{&lt;/span&gt;decimal&lt;span class=&quot;inline-delimiter&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt; to round to &lt;/span&gt;&lt;span class=&quot;inline&quot;&gt;&lt;span class=&quot;inline-delimiter&quot;&gt;#{&lt;/span&gt;rounded&lt;span class=&quot;inline-delimiter&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;

  &lt;span class=&quot;keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;function&quot;&gt;assert_palindrome&lt;/span&gt;(string)
    assert string == string.reverse, &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;Expected &lt;/span&gt;&lt;span class=&quot;inline&quot;&gt;&lt;span class=&quot;inline-delimiter&quot;&gt;#{&lt;/span&gt;string&lt;span class=&quot;inline-delimiter&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt; to read the same way backwards and forwards&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;

  &lt;span class=&quot;keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;function&quot;&gt;assert_default&lt;/span&gt;(hash, default_value)
    assert default_value == hash.default, &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;Expected &lt;/span&gt;&lt;span class=&quot;inline&quot;&gt;&lt;span class=&quot;inline-delimiter&quot;&gt;#{&lt;/span&gt;default_value&lt;span class=&quot;inline-delimiter&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt; to be default value for hash but was &lt;/span&gt;&lt;span class=&quot;inline&quot;&gt;&lt;span class=&quot;inline-delimiter&quot;&gt;#{&lt;/span&gt;hash.default.inspect&lt;span class=&quot;inline-delimiter&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;

&lt;span class=&quot;constant&quot;&gt;Numeric&lt;/span&gt;.infect_an_assertion &lt;span class=&quot;symbol&quot;&gt;:assert_equals_rounded&lt;/span&gt;, &lt;span class=&quot;symbol&quot;&gt;:must_round_to&lt;/span&gt;
&lt;span class=&quot;constant&quot;&gt;String&lt;/span&gt;.infect_an_assertion &lt;span class=&quot;symbol&quot;&gt;:assert_palindrome&lt;/span&gt;, &lt;span class=&quot;symbol&quot;&gt;:must_be_palindrome&lt;/span&gt;, &lt;span class=&quot;symbol&quot;&gt;:only_one_argument&lt;/span&gt;
&lt;span class=&quot;constant&quot;&gt;Hash&lt;/span&gt;.infect_an_assertion   &lt;span class=&quot;symbol&quot;&gt;:assert_default&lt;/span&gt;, &lt;span class=&quot;symbol&quot;&gt;:must_default_to&lt;/span&gt;, &lt;span class=&quot;symbol&quot;&gt;:do_not_flip&lt;/span&gt;

describe &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;custom expectations&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;do&lt;/span&gt;

  describe &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;#must_round_to&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;do&lt;/span&gt;

    it &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;rounds correctly for Float&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;do&lt;/span&gt;
      &lt;span class=&quot;float&quot;&gt;1.2&lt;/span&gt;.must_round_to &lt;span class=&quot;integer&quot;&gt;1&lt;/span&gt;
    &lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;

    it &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;rounds correctly for Fixnum&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;do&lt;/span&gt;
      &lt;span class=&quot;integer&quot;&gt;1&lt;/span&gt;.must_round_to &lt;span class=&quot;integer&quot;&gt;1&lt;/span&gt;
    &lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;

    it &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;catches failures&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;do&lt;/span&gt;
      proc { &lt;span class=&quot;float&quot;&gt;1.5&lt;/span&gt;.must_round_to &lt;span class=&quot;integer&quot;&gt;42&lt;/span&gt; }.must_raise(&lt;span class=&quot;constant&quot;&gt;MiniTest&lt;/span&gt;::&lt;span class=&quot;constant&quot;&gt;Assertion&lt;/span&gt;)
    &lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;

  &lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;

  describe &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;#must_be_palindrome&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;do&lt;/span&gt;

    it &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;read a string backwards and forwards&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;do&lt;/span&gt;
      &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;racecar&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;'&lt;/span&gt;&lt;/span&gt;.must_be_palindrome
    &lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;

    it &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;catches failures&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;do&lt;/span&gt;
      proc { &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;kriss kross&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;'&lt;/span&gt;&lt;/span&gt;.must_be_palindrome }.must_raise(&lt;span class=&quot;constant&quot;&gt;MiniTest&lt;/span&gt;::&lt;span class=&quot;constant&quot;&gt;Assertion&lt;/span&gt;)
    &lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;

    it &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;only works for Strings&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;do&lt;/span&gt;
      proc { &lt;span class=&quot;integer&quot;&gt;1&lt;/span&gt;.must_be_palindrome }.must_raise(&lt;span class=&quot;constant&quot;&gt;NoMethodError&lt;/span&gt;)
    &lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;

  &lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;

  describe &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;#must_default_to&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;do&lt;/span&gt;

    it &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;compares the default value of a hash&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;do&lt;/span&gt;
      hash = &lt;span class=&quot;constant&quot;&gt;Hash&lt;/span&gt;.new(&lt;span class=&quot;integer&quot;&gt;42&lt;/span&gt;)
      hash.must_default_to &lt;span class=&quot;integer&quot;&gt;42&lt;/span&gt;
    &lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;

    it &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;catches failures&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;do&lt;/span&gt;
      proc { {}.must_default_to &lt;span class=&quot;integer&quot;&gt;42&lt;/span&gt; }.must_raise(&lt;span class=&quot;constant&quot;&gt;MiniTest&lt;/span&gt;::&lt;span class=&quot;constant&quot;&gt;Assertion&lt;/span&gt;)
    &lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;

    it &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;only works for Hashes&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;do&lt;/span&gt;
      proc { &lt;span class=&quot;integer&quot;&gt;1&lt;/span&gt;.must_default_to &lt;span class=&quot;integer&quot;&gt;2&lt;/span&gt; }.must_raise(&lt;span class=&quot;constant&quot;&gt;NoMethodError&lt;/span&gt;)
    &lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;

  &lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;

&lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;

&lt;p&gt;Notice that I was specific about what I used to call &lt;code&gt;infect_an_assertion&lt;/code&gt;. &lt;code&gt;infect_an_assertion&lt;/code&gt; is a method defined on Module, which means we can call it on just about anything. I was specific about String and Hash because I only want those expectations to be defined on instances of those classes. I defined &lt;code&gt;must_round_to&lt;/code&gt; on Numeric because both Integer and Float (among others) respond to &lt;code&gt;round&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The code above is completely executable. It works with Ruby built-in MiniTest too. Play around with it.&lt;/p&gt;
</content>
    </entry>
  
    <entry>
      <id>http://blog.zenspider.com/blog/2012/05/contexts.html</id>
      <title>Contexts</title>
      <updated>2012-05-10T12:00:00-07:00</updated>

      <link rel="alternate" href="http://blog.zenspider.com/blog/2012/05/contexts.html"/>

      <published>2012-05-10T12:00:00-07:00</published>
      <content type="html">&lt;p&gt;This is my third entry detailing my personal &amp;ldquo;&lt;a href=&quot;/blog/2012/05/productivity-pr0n.html&quot;&gt;productivity pr0n&lt;/a&gt;&amp;rdquo;.&lt;/p&gt;

&lt;h3 id=&quot;defined-sorta&quot;&gt;Defined, sorta&amp;hellip;&lt;/h3&gt;

&lt;p&gt;Every task has a project and a context. Project is obvious. Context less so.&lt;/p&gt;

&lt;p&gt;According to &lt;a href=&quot;http://en.wikipedia.org/wiki/Getting_Things_Done&quot;&gt;wikipedia&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&amp;ldquo;During a weekly review, determine the context for the tasks and puts them on the appropriate lists. An example of grouping together similar tasks would be making a list of outstanding telephone calls, or the tasks / errands to perform while downtown. Context lists can be defined by the set of tools available or by the presence of individuals or groups for whom one has items to discuss or present.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;context-is-not-a-thing&quot;&gt;Context is not a Thing&lt;/h3&gt;

&lt;p&gt;&lt;img src=&quot;/img/omnifocus_contexts.png&quot; alt=&quot;my omnifocus contexts&quot; /&gt;&lt;/p&gt;

&lt;p&gt;GTD originally suggested things like &amp;ldquo;email&amp;rdquo; and &amp;ldquo;laptop&amp;rdquo;. My interpretation is that GTD&amp;rsquo;s obvious bent towards business means their original idea of context originated more from making the very best of whatever situation you&amp;rsquo;re stuck in&amp;hellip; like while waiting in the airport you might as well make a bunch of phone calls or queue up email to the marketing dept.&lt;/p&gt;

&lt;p&gt;I don&amp;rsquo;t work like that. Fortunately, I&amp;rsquo;m not (usually) a victim of my context/situation. It isn&amp;rsquo;t about what I have available to me as much as it is what mindset I&amp;rsquo;m in. If I want to work on new features I should work on new features. If I&amp;rsquo;m NOT in the mood to work on new features, then doing so would be less than inspired. I should work on those things I&amp;rsquo;m in the right mood to work on or I won&amp;rsquo;t be as effective/efficient as I would be otherwise.&lt;/p&gt;

&lt;p&gt;For me context is the mode I&amp;rsquo;m in when I&amp;rsquo;m working on a task.&lt;/p&gt;

&lt;h3 id=&quot;person-place-and-verb&quot;&gt;Person, Place, and Verb&lt;/h3&gt;

&lt;p&gt;Shortly after my productivity pr0n meeting at omni I had an epiphany: I see context as three orthogonal dimensions:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;what mode I&amp;rsquo;m in when I&amp;rsquo;m working on this task (this is a verb in my world).&lt;/li&gt;
  &lt;li&gt;where I need to be to work on this task.&lt;/li&gt;
  &lt;li&gt;and optionally, who I&amp;rsquo;m working with on this task.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, a bug on racc might be: Aaron Patterson, Vivace (our café we work from), Coding (Bug).&lt;/p&gt;

&lt;p&gt;So if I&amp;rsquo;m in the mood to work on a bug and at vivace but aaron isn&amp;rsquo;t available&amp;hellip; well, I go find something else to work on or I work less effectively on it and wait for him for a code review before I commit.&lt;/p&gt;

&lt;p&gt;Ideally I&amp;rsquo;d be able to assign multiple contexts to a task. Unfortunately omnifocus only allows for one which is a real shame. I&amp;rsquo;ve talked to them about it and while there are ideas on how to address this, nothing is coming soon. For now, I do the one I find most important to completing it (usually the verb).&lt;/p&gt;

&lt;p&gt;Not everything even has all three dimensions, and that&amp;rsquo;s fine too.&lt;/p&gt;

</content>
    </entry>
  
    <entry>
      <id>http://blog.zenspider.com/blog/2012/05/omnifocus-project-organization.html</id>
      <title>Omnifocus Project Organization</title>
      <updated>2012-05-09T12:00:00-07:00</updated>

      <link rel="alternate" href="http://blog.zenspider.com/blog/2012/05/omnifocus-project-organization.html"/>

      <published>2012-05-09T12:00:00-07:00</published>
      <content type="html">&lt;p&gt;This is my second entry detailing my personal &amp;ldquo;&lt;a href=&quot;/blog/2012/05/productivity-pr0n.html&quot;&gt;productivity pr0n&lt;/a&gt;&amp;rdquo;.&lt;/p&gt;

&lt;p&gt;As I said in my previous post, I have 3 hierarchies of projects: personal, nerd, and work.&lt;/p&gt;

&lt;h2 id=&quot;non-nerd-projects&quot;&gt;Non-nerd Projects&lt;/h2&gt;

&lt;p&gt;Personal and work are similar in that they&amp;rsquo;re just bundles of projects and there is no structure beyond that. In personal I have projects like:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;condo&lt;/li&gt;
  &lt;li&gt;entertainment&lt;/li&gt;
  &lt;li&gt;vacation&lt;/li&gt;
  &lt;li&gt;kittens&lt;/li&gt;
  &lt;li&gt;cooking&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;and inside there are any number of tasks in there with no sub-projects.&lt;/p&gt;

&lt;p&gt;Work is even less structured with a single project called: Tedium. It&amp;rsquo;s for the stuff I don&amp;rsquo;t like to do, but have to and without a reminder I won&amp;rsquo;t get it done.&lt;/p&gt;

&lt;h2 id=&quot;nerd-projects&quot;&gt;Nerd Projects&lt;/h2&gt;

&lt;p&gt;Nerd projects are different. First, I have a &lt;em&gt;lot&lt;/em&gt; of them. Currently there are 44 active nerd projects with 12 others currently put on hold. I&amp;rsquo;m probably also missing some and should automate some sort of audit against my repos. Second, I take a much more active stance with my nerd projects than I do my personal ones. Personal tasks are much more &amp;ldquo;dumping ground&amp;rdquo; than my nerd projects. So, in order to maintain the chaos caused by having so many active projects, more engineering needs to be put into my daily/weekly process.&lt;/p&gt;

&lt;p&gt;Each nerd project corresponds to an open source product that I work on whether it is one of my own or a group project I contribute to. Each project has at least 2 repeating tasks to schedule release and task triage (assuming I have release responsibility for that project):&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/omnifocus_hoe.png&quot; alt=&quot;omnifocus hoe project&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Every project has a priority level for me. For example, hoe and minitest are much higher priority than something like image_science. I have 5 levels of priority for projects. The triage and release tasks repeat on an N weekly basis where N is a prime number corresponding to it&amp;rsquo;s priority: 1, 2, 3, 5, 7. This helps spread out the work I have to do. I got this idea from the &lt;a href=&quot;http://en.wikipedia.org/wiki/Cicada#Life_cycle&quot;&gt;Cicada Lifecycle&lt;/a&gt; (how cool is that?!?) and it has helped balance things out tremendously. If I used the priority for the repeat then every 12 weeks I&amp;rsquo;d have to release all of 1-4 in the same week and every 60 weeks I&amp;rsquo;d have to release &lt;em&gt;everything&lt;/em&gt;. Using primes ensures that things are evenly spread out as you can see in my review table:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;          date\ tot 1w 2w 3w 5w 7w 
2012-05-11 Fri:  27  9  7  3  7  1 
2012-05-18 Fri:  19  0  7  4  7  1 
2012-05-25 Fri:  10  0  0  3  6  1 
2012-06-01 Fri:   7  0  0  0  6  1 
2012-06-08 Fri:   8  0  0  0  7  1 
2012-06-15 Fri:   1  0  0  0  0  1 
2012-06-22 Fri:   1  0  0  0  0  1 
   total:  73  9 14 10 33  7 
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I&amp;rsquo;ll talk more about the repeating tasks and how I work on projects in a later post.&lt;/p&gt;

</content>
    </entry>
  
    <entry>
      <id>http://blog.zenspider.com/releases/2012/05/minitest-version-3-0-0-has-been-released.html</id>
      <title>minitest version 3.0.0 has been released!</title>
      <updated>2012-05-08T20:36:55-07:00</updated>

      <link rel="alternate" href="http://blog.zenspider.com/releases/2012/05/minitest-version-3-0-0-has-been-released.html"/>

      <published>2012-05-08T20:36:55-07:00</published>
      <content type="html">&lt;p&gt;minitest provides a complete suite of testing facilities supporting
TDD, BDD, mocking, and benchmarking.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&quot;I had a class with Jim Weirich on testing last week and we were
 allowed to choose our testing frameworks. Kirk Haines and I were
 paired up and we cracked open the code for a few test
 frameworks...

 I MUST say that minitest is *very* readable / understandable
 compared to the 'other two' options we looked at. Nicely done and
 thank you for helping us keep our mental sanity.&quot;

-- Wayne E. Seguin
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;minitest/unit is a small and incredibly fast unit testing framework.
It provides a rich set of assertions to make your tests clean and
readable.&lt;/p&gt;

&lt;p&gt;minitest/spec is a functionally complete spec engine. It hooks onto
minitest/unit and seamlessly bridges test assertions over to spec
expectations.&lt;/p&gt;

&lt;p&gt;minitest/benchmark is an awesome way to assert the performance of your
algorithms in a repeatable manner. Now you can assert that your newb
co-worker doesn&amp;rsquo;t replace your linear algorithm with an exponential
one!&lt;/p&gt;

&lt;p&gt;minitest/mock by Steven Baker, is a beautifully tiny mock (and stub)
object framework.&lt;/p&gt;

&lt;p&gt;minitest/pride shows pride in testing and adds coloring to your test
output. I guess it is an example of how to write IO pipes too. :P&lt;/p&gt;

&lt;p&gt;minitest/unit is meant to have a clean implementation for language
implementors that need a minimal set of methods to bootstrap a working
test suite. For example, there is no magic involved for test-case
discovery.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&quot;Again, I can't praise enough the idea of a testing/specing
 framework that I can actually read in full in one sitting!&quot;

-- Piotr Szotkowski
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Changes:&lt;/p&gt;

&lt;h3 id=&quot;section&quot;&gt;3.0.0 / 2012-05-08&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;3 major enhancements:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Added Object#stub (in minitest/mock.rb).&lt;/li&gt;
      &lt;li&gt;Mock#expect mocks are used in the order they&amp;rsquo;re given.&lt;/li&gt;
      &lt;li&gt;Mock#verify now strictly compares against expect calls.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;3 minor enhancements:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Added caller to deprecation message.&lt;/li&gt;
      &lt;li&gt;Mock error messages are much prettier.&lt;/li&gt;
      &lt;li&gt;Removed String check for RHS of assert/refute_match. This lets #to_str work properly.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;1 bug fix:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Support drive letter on Windows. Patch provided from MRI by Usaku NAKAMURA. (ayumin)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;vim: &lt;a href=&quot;https://github.com/sunaku/vim-ruby-minitest&quot;&gt;https://github.com/sunaku/vim-ruby-minitest&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;home: &lt;a href=&quot;https://github.com/seattlerb/minitest&quot;&gt;https://github.com/seattlerb/minitest&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;rdoc: &lt;a href=&quot;http://docs.seattlerb.org/minitest&quot;&gt;http://docs.seattlerb.org/minitest&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
  
    <entry>
      <id>http://blog.zenspider.com/blog/2012/05/omnifocus-dumping-grounds.html</id>
      <title>The Dumping Grounds</title>
      <updated>2012-05-08T12:00:00-07:00</updated>

      <link rel="alternate" href="http://blog.zenspider.com/blog/2012/05/omnifocus-dumping-grounds.html"/>

      <published>2012-05-08T12:00:00-07:00</published>
      <content type="html">&lt;p&gt;This is my first entry detailing my personal &amp;ldquo;&lt;a href=&quot;/blog/2012/05/productivity-pr0n.html&quot;&gt;productivity pr0n&lt;/a&gt;&amp;rdquo;.&lt;/p&gt;

&lt;h3 id=&quot;collection&quot;&gt;Collection&lt;/h3&gt;

&lt;p&gt;According to &lt;a href=&quot;http://wiki.43folders.com/index.php/Getting_Things_Done&quot;&gt;43folders&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The Collection stage is where all stuff is gathered together in an unstructured manner. This stage involves writing down whatever things one can think of that needs doing (possibly using trigger lists), and all places where relevant information might accumulate, such as in folders and drawers, are emptied into one place.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The important part there is that it should be as easy and quick as possible to get that thing out of your brain and into the trusted system.&lt;/p&gt;

&lt;h3 id=&quot;what-that-means-to-me&quot;&gt;What that means to me&lt;/h3&gt;

&lt;p&gt;As I&amp;rsquo;ve said elsewhere, I use &lt;a href=&quot;http://www.omnigroup.com/omnifocus&quot;&gt;omnifocus&lt;/a&gt;. I&amp;rsquo;ve been using it religiously since it came out and for a couple years I used it &lt;em&gt;solely&lt;/em&gt; as a dumping ground for all my ideas, todos, and lists. I was burnt out enough that it didn&amp;rsquo;t serve any other purpose. But knowing that I had a place for all that stuff to go and it wouldn&amp;rsquo;t get lost or forgotten really helped me deal with that burnout.&lt;/p&gt;

&lt;p&gt;For me there are two parts to this phase:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;It must be &lt;em&gt;easy as hell&lt;/em&gt; to get things in. Easy to the point where you don&amp;rsquo;t lose concentration on what you&amp;rsquo;re actually doing.&lt;/li&gt;
  &lt;li&gt;It must be trustworthy. I need to know that what goes in is safe and accessible.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If nothing else, omnifocus solves this problem perfectly.&lt;/p&gt;

&lt;h3 id=&quot;omnifocus-quick-entry&quot;&gt;Omnifocus Quick Entry&lt;/h3&gt;

&lt;p&gt;By simply hitting a global keybinding, omnifocus&amp;rsquo; Quick Entry window pops up:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/omnifocus_quick_entry.png&quot; alt=&quot;omnifocus quick entry&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This lets me paste/type my tasks in quickly and as soon as I hit Cmd-S, it&amp;rsquo;s gone and I&amp;rsquo;m back to work. There are several other ways of capturing new tasks, but this is the one I use 90+% of the time.&lt;/p&gt;

&lt;p&gt;If you provide extra information for project and context, it&amp;rsquo;ll automatically get filed into that project w/ the correct context. Otherwise, it goes in your inbox and you can organize later. This lets you quickly choose which path you want. If you just want to capture and go, don&amp;rsquo;t bother filling out the info and you can get back to work in a few seconds. If you&amp;rsquo;re in planning mode, you can take the time to provide all the extra info you want and things will wind up in the right places.&lt;/p&gt;

&lt;h3 id=&quot;what-i-put-in-omnifocus&quot;&gt;What I put in omnifocus&lt;/h3&gt;

&lt;p&gt;Anything and everything! I have 3 hierarchies: personal, nerd, and work as well as some miscellaneous groupings for daily/weekly/monthly repeating tasks. In personal I have things as varied as errands I need to run, to music I want to buy, to things to study, as well as one titled &amp;ldquo;Live Volcano Vacation&amp;rdquo;. For my nerd hierarchy, I&amp;rsquo;ve have a folder for every open source project I work on and presentation I&amp;rsquo;m planning. Random ideas go in here. Yaks go in here. And I use software to sync from bug tracking systems into here. I&amp;rsquo;ll explain these more fully in later posts.&lt;/p&gt;

&lt;p&gt;The important thing to understand is that if I want to do something and I can&amp;rsquo;t do it &lt;em&gt;&lt;strong&gt;right now&lt;/strong&gt;&lt;/em&gt;, it goes in omnifocus.&lt;/p&gt;

</content>
    </entry>
  
    <entry>
      <id>http://blog.zenspider.com/blog/2012/05/inherited-sucks.html</id>
      <title>Inherited Sucks</title>
      <updated>2012-05-07T17:00:00-07:00</updated>

      <link rel="alternate" href="http://blog.zenspider.com/blog/2012/05/inherited-sucks.html"/>

      <published>2012-05-07T17:00:00-07:00</published>
      <content type="html">&lt;p&gt;Found via a rails &lt;a href=&quot;http://www.urbandictionary.com/define.php?term=snafu&quot;&gt;SNAFU&lt;/a&gt;:&lt;/p&gt;

&lt;div&gt;&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td class=&quot;line-numbers&quot; title=&quot;double click to toggle&quot; ondblclick=&quot;with (this.firstChild.style) { display = (display == '') ? 'none' : '' }&quot;&gt;&lt;pre&gt;&lt;a href=&quot;#n1&quot; name=&quot;n1&quot;&gt;1&lt;/a&gt;
&lt;a href=&quot;#n2&quot; name=&quot;n2&quot;&gt;2&lt;/a&gt;
&lt;a href=&quot;#n3&quot; name=&quot;n3&quot;&gt;3&lt;/a&gt;
&lt;a href=&quot;#n4&quot; name=&quot;n4&quot;&gt;4&lt;/a&gt;
&lt;a href=&quot;#n5&quot; name=&quot;n5&quot;&gt;5&lt;/a&gt;
&lt;a href=&quot;#n6&quot; name=&quot;n6&quot;&gt;6&lt;/a&gt;
&lt;a href=&quot;#n7&quot; name=&quot;n7&quot;&gt;7&lt;/a&gt;
&lt;a href=&quot;#n8&quot; name=&quot;n8&quot;&gt;8&lt;/a&gt;
&lt;a href=&quot;#n9&quot; name=&quot;n9&quot;&gt;9&lt;/a&gt;
&lt;strong&gt;&lt;a href=&quot;#n10&quot; name=&quot;n10&quot;&gt;10&lt;/a&gt;&lt;/strong&gt;
&lt;a href=&quot;#n11&quot; name=&quot;n11&quot;&gt;11&lt;/a&gt;
&lt;a href=&quot;#n12&quot; name=&quot;n12&quot;&gt;12&lt;/a&gt;
&lt;a href=&quot;#n13&quot; name=&quot;n13&quot;&gt;13&lt;/a&gt;
&lt;a href=&quot;#n14&quot; name=&quot;n14&quot;&gt;14&lt;/a&gt;
&lt;a href=&quot;#n15&quot; name=&quot;n15&quot;&gt;15&lt;/a&gt;
&lt;a href=&quot;#n16&quot; name=&quot;n16&quot;&gt;16&lt;/a&gt;
&lt;a href=&quot;#n17&quot; name=&quot;n17&quot;&gt;17&lt;/a&gt;
&lt;a href=&quot;#n18&quot; name=&quot;n18&quot;&gt;18&lt;/a&gt;
&lt;a href=&quot;#n19&quot; name=&quot;n19&quot;&gt;19&lt;/a&gt;
&lt;strong&gt;&lt;a href=&quot;#n20&quot; name=&quot;n20&quot;&gt;20&lt;/a&gt;&lt;/strong&gt;
&lt;a href=&quot;#n21&quot; name=&quot;n21&quot;&gt;21&lt;/a&gt;
&lt;a href=&quot;#n22&quot; name=&quot;n22&quot;&gt;22&lt;/a&gt;
&lt;a href=&quot;#n23&quot; name=&quot;n23&quot;&gt;23&lt;/a&gt;
&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;comment&quot;&gt;# in rails spread across many modules and classes :(&lt;/span&gt;

&lt;span class=&quot;keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;class&quot;&gt;A&lt;/span&gt;
  &lt;span class=&quot;keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;predefined-constant&quot;&gt;self&lt;/span&gt;.&lt;span class=&quot;function&quot;&gt;inherited&lt;/span&gt;(x)
    p x.instance &lt;span class=&quot;comment&quot;&gt;# create a singleton upon inheritance&lt;/span&gt;
  &lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;

  &lt;span class=&quot;keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;predefined-constant&quot;&gt;self&lt;/span&gt;.&lt;span class=&quot;function&quot;&gt;instance&lt;/span&gt;
    &lt;span class=&quot;instance-variable&quot;&gt;@instance&lt;/span&gt; ||= new
  &lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;

  &lt;span class=&quot;keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;function&quot;&gt;initialize&lt;/span&gt;
    p &lt;span class=&quot;symbol&quot;&gt;:A_initialize&lt;/span&gt;
  &lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;

&lt;span class=&quot;comment&quot;&gt;# in your application.rb&lt;/span&gt;

&lt;span class=&quot;keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;class&quot;&gt;B&lt;/span&gt; &amp;lt; &lt;span class=&quot;constant&quot;&gt;A&lt;/span&gt;
  &lt;span class=&quot;keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;function&quot;&gt;initialize&lt;/span&gt;
    p &lt;span class=&quot;symbol&quot;&gt;:B_initialize&lt;/span&gt;
  &lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;

&lt;p&gt;This prints out &lt;code&gt;:A_initialize&lt;/code&gt; only.. and is &lt;em&gt;terribly&lt;/em&gt; confusing
because it is about 8 layers of indirection deep. tenderlove and I
poked at this for about 30 minutes trying to untangle why his simple
initialize method wouldn&amp;rsquo;t get called.&lt;/p&gt;

&lt;p&gt;Turns out it is that crafty instantiation inside of the &lt;code&gt;inherited&lt;/code&gt;
hook. &lt;code&gt;inherited&lt;/code&gt; triggers on the &lt;em&gt;class opening&lt;/em&gt;&amp;hellip; when &lt;code&gt;initialize&lt;/code&gt;
hasn&amp;rsquo;t been defined yet.&lt;/p&gt;

&lt;p&gt;This sucks big time and is a perfect illustration of why I think ruby
needs a hook for the &lt;em&gt;close&lt;/em&gt; of a inherited class, not just the
opening. So many powerful tools could be written with such a simple
hook. I have yet to see inherited be used for much more than the
horrible cargo-culted ClassMethods+InstanceMethods pattern.&lt;/p&gt;

&lt;p&gt;I found a workaround&amp;hellip; It &lt;strong&gt;sucks&lt;/strong&gt;, but it &lt;em&gt;does&lt;/em&gt; ensure that your
&lt;code&gt;initialize&lt;/code&gt; gets called:&lt;/p&gt;

&lt;div&gt;&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td class=&quot;line-numbers&quot; title=&quot;double click to toggle&quot; ondblclick=&quot;with (this.firstChild.style) { display = (display == '') ? 'none' : '' }&quot;&gt;&lt;pre&gt;&lt;a href=&quot;#n1&quot; name=&quot;n1&quot;&gt;1&lt;/a&gt;
&lt;a href=&quot;#n2&quot; name=&quot;n2&quot;&gt;2&lt;/a&gt;
&lt;a href=&quot;#n3&quot; name=&quot;n3&quot;&gt;3&lt;/a&gt;
&lt;a href=&quot;#n4&quot; name=&quot;n4&quot;&gt;4&lt;/a&gt;
&lt;a href=&quot;#n5&quot; name=&quot;n5&quot;&gt;5&lt;/a&gt;
&lt;a href=&quot;#n6&quot; name=&quot;n6&quot;&gt;6&lt;/a&gt;
&lt;a href=&quot;#n7&quot; name=&quot;n7&quot;&gt;7&lt;/a&gt;
&lt;a href=&quot;#n8&quot; name=&quot;n8&quot;&gt;8&lt;/a&gt;
&lt;a href=&quot;#n9&quot; name=&quot;n9&quot;&gt;9&lt;/a&gt;
&lt;strong&gt;&lt;a href=&quot;#n10&quot; name=&quot;n10&quot;&gt;10&lt;/a&gt;&lt;/strong&gt;
&lt;a href=&quot;#n11&quot; name=&quot;n11&quot;&gt;11&lt;/a&gt;
&lt;a href=&quot;#n12&quot; name=&quot;n12&quot;&gt;12&lt;/a&gt;
&lt;a href=&quot;#n13&quot; name=&quot;n13&quot;&gt;13&lt;/a&gt;
&lt;a href=&quot;#n14&quot; name=&quot;n14&quot;&gt;14&lt;/a&gt;
&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;class&quot;&gt;A&lt;/span&gt;
  &lt;span class=&quot;keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;predefined-constant&quot;&gt;self&lt;/span&gt;.&lt;span class=&quot;function&quot;&gt;method_added&lt;/span&gt; m
    &lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;predefined-constant&quot;&gt;self&lt;/span&gt; != &lt;span class=&quot;constant&quot;&gt;A&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;and&lt;/span&gt; m == &lt;span class=&quot;symbol&quot;&gt;:initialize&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;then&lt;/span&gt;
      instance.send &lt;span class=&quot;symbol&quot;&gt;:initialize&lt;/span&gt;
    &lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;
  &lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;

&lt;span class=&quot;keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;class&quot;&gt;B&lt;/span&gt; &amp;lt; &lt;span class=&quot;constant&quot;&gt;A&lt;/span&gt;
  &lt;span class=&quot;keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;function&quot;&gt;initialize&lt;/span&gt;
    &lt;span class=&quot;comment&quot;&gt;# NEVER call super since this is instantiated through inherited :(&lt;/span&gt;
    p &lt;span class=&quot;symbol&quot;&gt;:B_initialize&lt;/span&gt;
  &lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;

</content>
    </entry>
  
    <entry>
      <id>http://blog.zenspider.com/releases/2012/05/image_science-version-1-2-3-has-been-released.html</id>
      <title>image_science version 1.2.3 has been released!</title>
      <updated>2012-05-07T16:09:42-07:00</updated>

      <link rel="alternate" href="http://blog.zenspider.com/releases/2012/05/image_science-version-1-2-3-has-been-released.html"/>

      <published>2012-05-07T16:09:42-07:00</published>
      <content type="html">&lt;p&gt;ImageScience is a clean and happy Ruby library that generates
thumbnails &amp;ndash; and kicks the living crap out of RMagick. Oh, and it
doesn&amp;rsquo;t leak memory like a sieve. :)&lt;/p&gt;

&lt;p&gt;For more information including build steps, see http://seattlerb.rubyforge.org/&lt;/p&gt;

&lt;p&gt;Changes:&lt;/p&gt;

&lt;h3 id=&quot;section&quot;&gt;1.2.3 / 2012-05-07&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;2 bug fixes:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Fixed thumbnail float imprecision errors. (jdelStrother)&lt;/li&gt;
      &lt;li&gt;Switched to using tmpdir for INLINEDIR to avoid failures in CI environments w/o homedirs&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://seattlerb.rubyforge.org/ImageScience.html&quot;&gt;http://seattlerb.rubyforge.org/ImageScience.html&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://rubyforge.org/projects/seattlerb&quot;&gt;http://rubyforge.org/projects/seattlerb&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
  
    <entry>
      <id>http://blog.zenspider.com/releases/2012/05/hoe-version-3-0-5-has-been-released.html</id>
      <title>hoe version 3.0.5 has been released!</title>
      <updated>2012-05-07T16:04:03-07:00</updated>

      <link rel="alternate" href="http://blog.zenspider.com/releases/2012/05/hoe-version-3-0-5-has-been-released.html"/>

      <published>2012-05-07T16:04:03-07:00</published>
      <content type="html">&lt;p&gt;Hoe is a rake/rubygems helper for project Rakefiles. It helps you
manage, maintain, and release your project and includes a dynamic
plug-in system allowing for easy extensibility. Hoe ships with
plug-ins for all your usual project tasks including rdoc generation,
testing, packaging, deployment, and announcement..&lt;/p&gt;

&lt;p&gt;See class rdoc for help. Hint: &lt;code&gt;ri Hoe&lt;/code&gt; or any of the plugins listed
below.&lt;/p&gt;

&lt;p&gt;For extra goodness, see: http://seattlerb.rubyforge.org/hoe/Hoe.pdf&lt;/p&gt;

&lt;p&gt;Changes:&lt;/p&gt;

&lt;h3 id=&quot;section&quot;&gt;3.0.5 / 2012-05-07&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;1 bug fix:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Fixed ridocs argument handling (erikh)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;code: &lt;a href=&quot;https://github.com/seattlerb/hoe&quot;&gt;https://github.com/seattlerb/hoe&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;doco: &lt;a href=&quot;http://seattlerb.rubyforge.org/hoe/Hoe.pdf&quot;&gt;http://seattlerb.rubyforge.org/hoe/Hoe.pdf&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;other: &lt;a href=&quot;http://github.com/jbarnette/hoe-plugin-examples&quot;&gt;http://github.com/jbarnette/hoe-plugin-examples&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;bugs: &lt;a href=&quot;https://github.com/seattlerb/hoe/issues&quot;&gt;https://github.com/seattlerb/hoe/issues&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;home: &lt;a href=&quot;http://www.zenspider.com/projects/hoe.html&quot;&gt;http://www.zenspider.com/projects/hoe.html&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;rdoc: &lt;a href=&quot;http://seattlerb.rubyforge.org/hoe/&quot;&gt;http://seattlerb.rubyforge.org/hoe/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
  
    <entry>
      <id>http://blog.zenspider.com/blog/2012/05/productivity-pr0n.html</id>
      <title>productivity pr0n</title>
      <updated>2012-05-07T12:00:00-07:00</updated>

      <link rel="alternate" href="http://blog.zenspider.com/blog/2012/05/productivity-pr0n.html"/>

      <published>2012-05-07T12:00:00-07:00</published>
      <content type="html">&lt;p&gt;Productivity is a very personal thing. What works for you might not work for me and vice-versa. That said, there&amp;rsquo;s nothing wrong with sharing what works for me in the hopes that I might help others or learn something new from you.&lt;/p&gt;

&lt;h3 id=&quot;gtd-phases&quot;&gt;GTD Phases&lt;/h3&gt;

&lt;p&gt;I do &lt;em&gt;some&lt;/em&gt; sort of &lt;a href=&quot;http://wiki.43folders.com/index.php/Getting_Things_Done&quot;&gt;GTD&lt;/a&gt; with my own little twists and turns thrown in. The main tenet that got me on GTD that I really liked was the idea that by dumping all the lists and ideas and todos out of your head. Putting all of that into a trusted system frees up cognitive space and allows you to focus on the task and hand and be more creative as a result. Bunk? &lt;em&gt;Maybe&lt;/em&gt;&amp;hellip; but the idea works for me. I tangent a &lt;em&gt;lot&lt;/em&gt; less when I have this system in place. Less yak to shave.&lt;/p&gt;

&lt;p&gt;Last year, I met up with an old friend at the Omni Group to talk about how we work (specifically, how we use omnifocus) and I dunno&amp;hellip; &lt;em&gt;something&lt;/em&gt; he said lit a fire under my ass and I got back in gear and moving on a lot of projects very quickly. In the 36 months I&amp;rsquo;d been using omnifocus preceding this meeting, I&amp;rsquo;d finished 668 tasks (or about 18/mo). In the 6 months after the meeting, I finished 1273 tasks (212/mo). In the last 6 months, I&amp;rsquo;ve been maintaining an average of 252/mo&amp;hellip; so &lt;em&gt;something&lt;/em&gt; has clearly worked for me.&lt;/p&gt;

&lt;h4 id=&quot;collection&quot;&gt;Collection&lt;/h4&gt;

&lt;p&gt;According to &lt;a href=&quot;http://wiki.43folders.com/index.php/Getting_Things_Done&quot;&gt;43folders&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The Collection stage is where all stuff is gathered together in an unstructured manner. This stage involves writing down whatever things one can think of that needs doing (possibly using trigger lists), and all places where relevant information might accumulate, such as in folders and drawers, are emptied into one place.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The important part there is that it should be as easy and quick as possible to get that thing out of your brain and into the trusted system.&lt;/p&gt;

&lt;h4 id=&quot;process&quot;&gt;Process&lt;/h4&gt;

&lt;blockquote&gt;
  &lt;p&gt;The Process stage is where these items are sorted, and the further activity needed by them is decided.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;(again with &lt;a href=&quot;http://wiki.43folders.com/index.php/Getting_Things_Done&quot;&gt;43folders&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;This is where you go through what&amp;rsquo;s collected and either act on it immediately (eg, if it is &amp;lt; 2 minutes) or you decide what further action needs to happen. This is also called Do/Delegate/Defer.&lt;/p&gt;

&lt;h4 id=&quot;organize&quot;&gt;Organize&lt;/h4&gt;

&lt;blockquote&gt;
  &lt;p&gt;The Organize stage takes these sorted items and puts them together in a form than can be used through the day for allocating tasks to time.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;(&lt;a href=&quot;http://wiki.43folders.com/index.php/Getting_Things_Done&quot;&gt;43folders&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Personally, I don&amp;rsquo;t treat the process and organize stages as distinctly different. I&amp;rsquo;ll go into more detail on that later.&lt;/p&gt;

&lt;h4 id=&quot;review&quot;&gt;Review&lt;/h4&gt;

&lt;p&gt;The review stage is exactly that: review what&amp;rsquo;s in the system and keep it up to date. This is, for many (including me), the hardest (or least tangibly rewarding) thing to do. Luckily, there are tools to help with this.&lt;/p&gt;

&lt;h3 id=&quot;scheduleplan&quot;&gt;Schedule/Plan&lt;/h3&gt;

&lt;p&gt;Over the next few weeks/days I&amp;rsquo;m going to be describing my personal flavor of productivity &lt;a href=&quot;http://wiki.43folders.com/index.php/Productivity_pr0n&quot;&gt;pr0n&lt;/a&gt;. I&amp;rsquo;ll be going over how I use emacs and omnifocus and what the workflow of my day/week looks like. Here is a rough outline of what I plan to go over.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;omnifocus dumping grounds&lt;/li&gt;
  &lt;li&gt;omnifocus project organization&lt;/li&gt;
  &lt;li&gt;omnifocus contexts&lt;/li&gt;
  &lt;li&gt;omnifocus perspectives&lt;/li&gt;
  &lt;li&gt;daily &amp;amp; weekly repeating tasks&lt;/li&gt;
  &lt;li&gt;project oriented tasks&lt;/li&gt;
  &lt;li&gt;scheduling of complex and numerous projects - release, triage, daily work&lt;/li&gt;
  &lt;li&gt;weekly review&lt;/li&gt;
  &lt;li&gt;omnifocus gem - BTS integration, reviewing, scheduling, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This will essentially be a detailed continuation of my &lt;a href=&quot;http://www.zenspider.com/presentations/2010-gogaruco.html&quot;&gt;workflow presentation&lt;/a&gt; with more of a macro view.&lt;/p&gt;

&lt;p&gt;I&amp;rsquo;ll update these to links as they get written/published.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disclosure&lt;/strong&gt;: I used to work for The Omni Group but no longer have a working relationship with them.&lt;/p&gt;

</content>
    </entry>
  
    <entry>
      <id>http://blog.zenspider.com/releases/2012/05/ZenTest-version-4-8-0-has-been-released.html</id>
      <title>ZenTest version 4.8.0 has been released!</title>
      <updated>2012-05-04T15:46:09-07:00</updated>

      <link rel="alternate" href="http://blog.zenspider.com/releases/2012/05/ZenTest-version-4-8-0-has-been-released.html"/>

      <published>2012-05-04T15:46:09-07:00</published>
      <content type="html">&lt;p&gt;ZenTest provides 4 different tools: zentest, unit_diff, autotest, and
multiruby.&lt;/p&gt;

&lt;p&gt;zentest scans your target and unit-test code and writes your missing
code based on simple naming rules, enabling XP at a much quicker pace.
zentest only works with Ruby and Minitest or Test::Unit. There is
enough evidence to show that this is still proving useful to users, so
it stays.&lt;/p&gt;

&lt;p&gt;unit_diff is a command-line filter to diff expected results from
actual results and allow you to quickly see exactly what is wrong.
Do note that minitest 2.2+ provides an enhanced assert_equal obviating
the need for unit_diff&lt;/p&gt;

&lt;p&gt;autotest is a continous testing facility meant to be used during
development. As soon as you save a file, autotest will run the
corresponding dependent tests.&lt;/p&gt;

&lt;p&gt;multiruby runs anything you want on multiple versions of ruby. Great
for compatibility checking! Use multiruby_setup to manage your
installed versions.&lt;/p&gt;

&lt;p&gt;Changes:&lt;/p&gt;

&lt;h3 id=&quot;section&quot;&gt;4.8.0 / 2012-05-04&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;1 minor enhancement:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Added Minitest generation to zentest (use -t to generate for test/unit)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;1 bug fix:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Fixes and clarifications to Autotest#find_file. (hugh sasse)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;home: &lt;a href=&quot;https://github.com/seattlerb/zentest&quot;&gt;https://github.com/seattlerb/zentest&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;rdoc: &lt;a href=&quot;http://zentest.rubyforge.org/ZenTest&quot;&gt;http://zentest.rubyforge.org/ZenTest&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
  
    <entry>
      <id>http://blog.zenspider.com/releases/2012/05/ParseTree-version-3-0-9-has-been-released.html</id>
      <title>ParseTree version 3.0.9 has been released!</title>
      <updated>2012-05-01T16:39:28-07:00</updated>

      <link rel="alternate" href="http://blog.zenspider.com/releases/2012/05/ParseTree-version-3-0-9-has-been-released.html"/>

      <published>2012-05-01T16:39:28-07:00</published>
      <content type="html">&lt;p&gt;ParseTree is a C extension (using RubyInline) that extracts the parse
tree for an entire class or a specific method and returns it as a
s-expression (aka sexp) using ruby&amp;rsquo;s arrays, strings, symbols, and
integers.&lt;/p&gt;

&lt;p&gt;As an example:&lt;/p&gt;

&lt;p&gt;def conditional1(arg1)
    if arg1 == 0 then
      return 1
    end
    return 0
  end&lt;/p&gt;

&lt;p&gt;becomes:&lt;/p&gt;

&lt;p&gt;[:defn,
    :conditional1,
    [:scope,
     [:block,
      [:args, :arg1],
      [:if,
       [:call, [:lvar, :arg1], :==, [:array, [:lit, 0]]],
       [:return, [:lit, 1]],
       nil],
      [:return, [:lit, 0]]]]]&lt;/p&gt;

&lt;p&gt;Changes:&lt;/p&gt;

&lt;h3 id=&quot;section&quot;&gt;3.0.9 / 2012-05-01&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;6 minor enhancements:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Added a bunch of new tests from PTTC.&lt;/li&gt;
      &lt;li&gt;Added masgn handling inside block_pass&lt;/li&gt;
      &lt;li&gt;Added rewrite_iter to unwrap masgns w/ only 1 arg.&lt;/li&gt;
      &lt;li&gt;Handle rewriting block_pass in iter.&lt;/li&gt;
      &lt;li&gt;Imported RawParseTree test data from PTTC.&lt;/li&gt;
      &lt;li&gt;Removed rewrite_masgn requirement for 4 slots.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;3 bug fixes:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Fixed dependencies to ensure they&amp;rsquo;re not going to use ruby_parser 3 and friends.&lt;/li&gt;
      &lt;li&gt;Fixed segv for NODE_BLOCK_PASS in iter (nd_iter == 1&amp;hellip; go boom)&lt;/li&gt;
      &lt;li&gt;Remove nil body in iter (I think this is wrong, but whatevs).&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;home: &lt;a href=&quot;https://github.com/seattlerb/parsetree&quot;&gt;https://github.com/seattlerb/parsetree&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;rdoc: &lt;a href=&quot;http://docs.seattlerb.org/ParseTree/&quot;&gt;http://docs.seattlerb.org/ParseTree/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
  
    <entry>
      <id>http://blog.zenspider.com/releases/2012/05/hoe-version-3-0-4-has-been-released.html</id>
      <title>hoe version 3.0.4 has been released!</title>
      <updated>2012-05-01T16:30:36-07:00</updated>

      <link rel="alternate" href="http://blog.zenspider.com/releases/2012/05/hoe-version-3-0-4-has-been-released.html"/>

      <published>2012-05-01T16:30:36-07:00</published>
      <content type="html">&lt;p&gt;Hoe is a rake/rubygems helper for project Rakefiles. It helps you
manage, maintain, and release your project and includes a dynamic
plug-in system allowing for easy extensibility. Hoe ships with
plug-ins for all your usual project tasks including rdoc generation,
testing, packaging, deployment, and announcement..&lt;/p&gt;

&lt;p&gt;See class rdoc for help. Hint: &lt;code&gt;ri Hoe&lt;/code&gt; or any of the plugins listed
below.&lt;/p&gt;

&lt;p&gt;For extra goodness, see: http://seattlerb.rubyforge.org/hoe/Hoe.pdf&lt;/p&gt;

&lt;p&gt;Changes:&lt;/p&gt;

&lt;h3 id=&quot;section&quot;&gt;3.0.4 / 2012-05-01&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;1 bug fix:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Removed rubygems/deprecated and rolled my own for users on older rubygems&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;code: &lt;a href=&quot;https://github.com/seattlerb/hoe&quot;&gt;https://github.com/seattlerb/hoe&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;doco: &lt;a href=&quot;http://seattlerb.rubyforge.org/hoe/Hoe.pdf&quot;&gt;http://seattlerb.rubyforge.org/hoe/Hoe.pdf&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;other: &lt;a href=&quot;http://github.com/jbarnette/hoe-plugin-examples&quot;&gt;http://github.com/jbarnette/hoe-plugin-examples&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;bugs: &lt;a href=&quot;https://github.com/seattlerb/hoe/issues&quot;&gt;https://github.com/seattlerb/hoe/issues&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;home: &lt;a href=&quot;http://www.zenspider.com/projects/hoe.html&quot;&gt;http://www.zenspider.com/projects/hoe.html&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;rdoc: &lt;a href=&quot;http://seattlerb.rubyforge.org/hoe/&quot;&gt;http://seattlerb.rubyforge.org/hoe/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
  
    <entry>
      <id>http://blog.zenspider.com/blog/2012/04/minitest-mock-which-is-more-important-.html</id>
      <title>minitest mock -- which is more important?</title>
      <updated>2012-04-27T16:13:23-07:00</updated>

      <link rel="alternate" href="http://blog.zenspider.com/blog/2012/04/minitest-mock-which-is-more-important-.html"/>

      <published>2012-04-27T16:13:23-07:00</published>
      <content type="html">&lt;p&gt;Currently you can do something like this with minitest/mock:&lt;/p&gt;

&lt;div&gt;&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td class=&quot;line-numbers&quot; title=&quot;double click to toggle&quot; ondblclick=&quot;with (this.firstChild.style) { display = (display == '') ? 'none' : '' }&quot;&gt;&lt;pre&gt;&lt;a href=&quot;#n1&quot; name=&quot;n1&quot;&gt;1&lt;/a&gt;
&lt;a href=&quot;#n2&quot; name=&quot;n2&quot;&gt;2&lt;/a&gt;
&lt;a href=&quot;#n3&quot; name=&quot;n3&quot;&gt;3&lt;/a&gt;
&lt;a href=&quot;#n4&quot; name=&quot;n4&quot;&gt;4&lt;/a&gt;
&lt;a href=&quot;#n5&quot; name=&quot;n5&quot;&gt;5&lt;/a&gt;
&lt;a href=&quot;#n6&quot; name=&quot;n6&quot;&gt;6&lt;/a&gt;
&lt;a href=&quot;#n7&quot; name=&quot;n7&quot;&gt;7&lt;/a&gt;
&lt;a href=&quot;#n8&quot; name=&quot;n8&quot;&gt;8&lt;/a&gt;
&lt;a href=&quot;#n9&quot; name=&quot;n9&quot;&gt;9&lt;/a&gt;
&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;mock = &lt;span class=&quot;constant&quot;&gt;MiniTest&lt;/span&gt;::&lt;span class=&quot;constant&quot;&gt;Mock&lt;/span&gt;.new

mock.expect &lt;span class=&quot;symbol&quot;&gt;:foo&lt;/span&gt;, &lt;span class=&quot;predefined-constant&quot;&gt;nil&lt;/span&gt;

mock.foo
mock.foo
mock.foo &lt;span class=&quot;comment&quot;&gt;# and so on... you can call until the cows come home&lt;/span&gt;

mock.verify
&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;

&lt;p&gt;but you &lt;a href=&quot;https://github.com/seattlerb/minitest/issues/119&quot;&gt;can&amp;rsquo;t do the following&lt;/a&gt;:&lt;/p&gt;

&lt;div&gt;&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td class=&quot;line-numbers&quot; title=&quot;double click to toggle&quot; ondblclick=&quot;with (this.firstChild.style) { display = (display == '') ? 'none' : '' }&quot;&gt;&lt;pre&gt;&lt;a href=&quot;#n1&quot; name=&quot;n1&quot;&gt;1&lt;/a&gt;
&lt;a href=&quot;#n2&quot; name=&quot;n2&quot;&gt;2&lt;/a&gt;
&lt;a href=&quot;#n3&quot; name=&quot;n3&quot;&gt;3&lt;/a&gt;
&lt;a href=&quot;#n4&quot; name=&quot;n4&quot;&gt;4&lt;/a&gt;
&lt;a href=&quot;#n5&quot; name=&quot;n5&quot;&gt;5&lt;/a&gt;
&lt;a href=&quot;#n6&quot; name=&quot;n6&quot;&gt;6&lt;/a&gt;
&lt;a href=&quot;#n7&quot; name=&quot;n7&quot;&gt;7&lt;/a&gt;
&lt;a href=&quot;#n8&quot; name=&quot;n8&quot;&gt;8&lt;/a&gt;
&lt;a href=&quot;#n9&quot; name=&quot;n9&quot;&gt;9&lt;/a&gt;
&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;mock = &lt;span class=&quot;constant&quot;&gt;MiniTest&lt;/span&gt;::&lt;span class=&quot;constant&quot;&gt;Mock&lt;/span&gt;.new

mock.expect &lt;span class=&quot;symbol&quot;&gt;:foo&lt;/span&gt;, &lt;span class=&quot;predefined-constant&quot;&gt;nil&lt;/span&gt;
mock.expect &lt;span class=&quot;symbol&quot;&gt;:foo&lt;/span&gt;, &lt;span class=&quot;predefined-constant&quot;&gt;true&lt;/span&gt;

assert_equal &lt;span class=&quot;predefined-constant&quot;&gt;nil&lt;/span&gt;,  mock.foo
assert_equal &lt;span class=&quot;predefined-constant&quot;&gt;true&lt;/span&gt;, mock.foo

mock.verify
&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;

&lt;p&gt;minitest/mock currently accesses mocked calls by arity and the first
one wins.&lt;/p&gt;

&lt;p&gt;I want to break the former and fix the latter. Which is more important
to you?&lt;/p&gt;

</content>
    </entry>
  
    <entry>
      <id>http://blog.zenspider.com/blog/2012/04/tpkg-blues.html</id>
      <title>I've got the Tpkg Blues</title>
      <updated>2012-04-19T00:00:00-07:00</updated>

      <link rel="alternate" href="http://blog.zenspider.com/blog/2012/04/tpkg-blues.html"/>

      <published>2012-04-19T00:00:00-07:00</published>
      <content type="html">&lt;iframe width=&quot;640&quot; height=&quot;480&quot; src=&quot;http://www.youtube.com/embed/3VM_zWrj4AY&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;</content>
    </entry>
  
    <entry>
      <id>http://blog.zenspider.com/blog/2012/04/minitest-pride.html</id>
      <title>Minitest Pride</title>
      <updated>2012-04-18T14:30:30-07:00</updated>

      <link rel="alternate" href="http://blog.zenspider.com/blog/2012/04/minitest-pride.html"/>

      <published>2012-04-18T14:30:30-07:00</published>
      <content type="html">&lt;p&gt;&lt;img src=&quot;/img/minitest-pride.png&quot; alt=&quot;/img/minitest-pride.png&quot; /&gt;&lt;/p&gt;
</content>
    </entry>
  
    <entry>
      <id>http://blog.zenspider.com/releases/2012/04/sexp_processor-version-3-2-0-has-been-released.html</id>
      <title>sexp_processor version 3.2.0 has been released!</title>
      <updated>2012-04-15T14:28:21-07:00</updated>

      <link rel="alternate" href="http://blog.zenspider.com/releases/2012/04/sexp_processor-version-3-2-0-has-been-released.html"/>

      <published>2012-04-15T14:28:21-07:00</published>
      <content type="html">&lt;p&gt;sexp_processor branches from ParseTree bringing all the generic sexp
processing tools with it. Sexp, SexpProcessor, Environment, etc&amp;hellip; all
for your language processing pleasure.&lt;/p&gt;

&lt;p&gt;Changes:&lt;/p&gt;

&lt;h3 id=&quot;section&quot;&gt;3.2.0 / 2012-04-15&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;5 minor enhancements:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Added a ton of block arg tests.&lt;/li&gt;
      &lt;li&gt;Added add19_edgecases to help refactor a bunch of tests that all have the same output.&lt;/li&gt;
      &lt;li&gt;Added better debugging output for rewrites.&lt;/li&gt;
      &lt;li&gt;Cleaned and added a bunch of stabby proc tests.&lt;/li&gt;
      &lt;li&gt;Moved RawParseTree test data to ParseTree project.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;2 bug fixes:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Fixed a bunch of entries for r2r changes against edgecase parse/lex tests&lt;/li&gt;
      &lt;li&gt;Fixes for R2R&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;home: &lt;a href=&quot;https://github.com/seattlerb/sexp_processor&quot;&gt;https://github.com/seattlerb/sexp_processor&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;rdoc: &lt;a href=&quot;http://docs.seattlerb.org/sexp_processor&quot;&gt;http://docs.seattlerb.org/sexp_processor&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
  
    <entry>
      <id>http://blog.zenspider.com/releases/2012/04/minitest-version-2-12-1-has-been-released.html</id>
      <title>minitest version 2.12.1 has been released!</title>
      <updated>2012-04-10T20:35:14-07:00</updated>

      <link rel="alternate" href="http://blog.zenspider.com/releases/2012/04/minitest-version-2-12-1-has-been-released.html"/>

      <published>2012-04-10T20:35:14-07:00</published>
      <content type="html">&lt;p&gt;minitest provides a complete suite of testing facilities supporting
TDD, BDD, mocking, and benchmarking.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&quot;I had a class with Jim Weirich on testing last week and we were
 allowed to choose our testing frameworks. Kirk Haines and I were
 paired up and we cracked open the code for a few test
 frameworks...

 I MUST say that minitest is *very* readable / understandable
 compared to the 'other two' options we looked at. Nicely done and
 thank you for helping us keep our mental sanity.&quot;

-- Wayne E. Seguin
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;minitest/unit is a small and incredibly fast unit testing framework.
It provides a rich set of assertions to make your tests clean and
readable.&lt;/p&gt;

&lt;p&gt;minitest/spec is a functionally complete spec engine. It hooks onto
minitest/unit and seamlessly bridges test assertions over to spec
expectations.&lt;/p&gt;

&lt;p&gt;minitest/benchmark is an awesome way to assert the performance of your
algorithms in a repeatable manner. Now you can assert that your newb
co-worker doesn&amp;rsquo;t replace your linear algorithm with an exponential
one!&lt;/p&gt;

&lt;p&gt;minitest/mock by Steven Baker, is a beautifully tiny mock object
framework.&lt;/p&gt;

&lt;p&gt;minitest/pride shows pride in testing and adds coloring to your test
output. I guess it is an example of how to write IO pipes too. :P&lt;/p&gt;

&lt;p&gt;minitest/unit is meant to have a clean implementation for language
implementors that need a minimal set of methods to bootstrap a working
test suite. For example, there is no magic involved for test-case
discovery.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&quot;Again, I can't praise enough the idea of a testing/specing
 framework that I can actually read in full in one sitting!&quot;

-- Piotr Szotkowski
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Changes:&lt;/p&gt;

&lt;h3 id=&quot;section&quot;&gt;2.12.1 / 2012-04-10&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;1 minor enhancement:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Added ruby releases to History.txt to make it easier to see what you&amp;rsquo;re missing&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;1 bug fix:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Rolled my own deprecate msg to allow MT to work with rubygems &amp;lt; 1.7&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;vim: &lt;a href=&quot;https://github.com/sunaku/vim-ruby-minitest&quot;&gt;https://github.com/sunaku/vim-ruby-minitest&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;home: &lt;a href=&quot;https://github.com/seattlerb/minitest&quot;&gt;https://github.com/seattlerb/minitest&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;rdoc: &lt;a href=&quot;http://docs.seattlerb.org/minitest&quot;&gt;http://docs.seattlerb.org/minitest&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
  
    <entry>
      <id>http://blog.zenspider.com/blog/2012/04/i-don-t-always-code.html</id>
      <title>I don't always code</title>
      <updated>2012-04-09T17:22:39-07:00</updated>

      <link rel="alternate" href="http://blog.zenspider.com/blog/2012/04/i-don-t-always-code.html"/>

      <published>2012-04-09T17:22:39-07:00</published>
      <content type="html">&lt;p&gt;As seen on IRC:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;WillMarshall&amp;gt; zenspider: I don't always code, but when I do I like to cargo-cult.&lt;/code&gt;&lt;/p&gt;
</content>
    </entry>
  
    <entry>
      <id>http://blog.zenspider.com/releases/2012/04/hoe-version-3-0-3-has-been-released.html</id>
      <title>hoe version 3.0.3 has been released!</title>
      <updated>2012-04-09T17:13:31-07:00</updated>

      <link rel="alternate" href="http://blog.zenspider.com/releases/2012/04/hoe-version-3-0-3-has-been-released.html"/>

      <published>2012-04-09T17:13:31-07:00</published>
      <content type="html">&lt;p&gt;Hoe is a rake/rubygems helper for project Rakefiles. It helps you
manage, maintain, and release your project and includes a dynamic
plug-in system allowing for easy extensibility. Hoe ships with
plug-ins for all your usual project tasks including rdoc generation,
testing, packaging, deployment, and announcement..&lt;/p&gt;

&lt;p&gt;See class rdoc for help. Hint: &lt;code&gt;ri Hoe&lt;/code&gt; or any of the plugins listed
below.&lt;/p&gt;

&lt;p&gt;For extra goodness, see: http://seattlerb.rubyforge.org/hoe/Hoe.pdf&lt;/p&gt;

&lt;p&gt;Changes:&lt;/p&gt;

&lt;h3 id=&quot;section&quot;&gt;3.0.3 / 2012-04-09&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;2 bug fixes:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Fixed racc plugin&amp;rsquo;s gem dependency activation&lt;/li&gt;
      &lt;li&gt;Fixed rake multi&amp;rsquo;s use of multiruby_skip.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;code: &lt;a href=&quot;https://github.com/seattlerb/hoe&quot;&gt;https://github.com/seattlerb/hoe&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;doco: &lt;a href=&quot;http://seattlerb.rubyforge.org/hoe/Hoe.pdf&quot;&gt;http://seattlerb.rubyforge.org/hoe/Hoe.pdf&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;other: &lt;a href=&quot;http://github.com/jbarnette/hoe-plugin-examples&quot;&gt;http://github.com/jbarnette/hoe-plugin-examples&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;bugs: &lt;a href=&quot;https://github.com/seattlerb/hoe/issues&quot;&gt;https://github.com/seattlerb/hoe/issues&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;home: &lt;a href=&quot;http://www.zenspider.com/projects/hoe.html&quot;&gt;http://www.zenspider.com/projects/hoe.html&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;rdoc: &lt;a href=&quot;http://seattlerb.rubyforge.org/hoe/&quot;&gt;http://seattlerb.rubyforge.org/hoe/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
  
    <entry>
      <id>http://blog.zenspider.com/releases/2012/04/zenprofile-version-1-3-2-has-been-released.html</id>
      <title>zenprofile version 1.3.2 has been released!</title>
      <updated>2012-04-06T18:09:18-07:00</updated>

      <link rel="alternate" href="http://blog.zenspider.com/releases/2012/04/zenprofile-version-1-3-2-has-been-released.html"/>

      <published>2012-04-06T18:09:18-07:00</published>
      <content type="html">&lt;p&gt;zenprofiler helps answer WHAT is being called the most. spy_on helps
answer WHERE those calls are being made. ZenProfiler provides a faster
version of the standard library ruby profiler. It is otherwise pretty
much the same as before. spy_on provides a clean way to redefine a
bottleneck method so you can account for and aggregate all the calls
to it.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;% ruby -Ilib bin/zenprofile misc/factorial.rb 50000
Total time = 3.056884
Total time = 2.390000

          total     self              self    total
% time  seconds  seconds    calls  ms/call  ms/call  name
 50.70     1.64     1.64    50000     0.03     0.05 Integer#downto
 19.63     2.27     0.63   200000     0.00     0.00 Fixnum#*
 14.19     2.73     0.46    50000     0.01     0.05 Factorial#factorial
  9.93     3.05     0.32        1   320.36  3047.10 Range#each
  5.54     3.23     0.18        2    89.40   178.79 ZenProfiler#start_hook
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Once you know that Integer#downto takes 50% of the entire run, you
can use spy_on to find it. (See misc/factorial.rb for the actual code):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;% SPY=1 ruby -Ilib misc/factorial.rb 50000
Spying on Integer#downto

Integer.downto

50000: total
50000: ./misc/factorial.rb:6:in `factorial' via 
       ./misc/factorial.rb:6:in `factorial'
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Changes:&lt;/p&gt;

&lt;h3 id=&quot;section&quot;&gt;1.3.2 / 2012-04-06&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;2 bug fixes:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Fixed compile problems raised by clang&lt;/li&gt;
      &lt;li&gt;Removed &amp;lsquo;self.&amp;rsquo; from wrapped call to fix calling private methods. (joevandyk)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;http://rubyforge.org/projects/seattlerb&quot;&gt;http://rubyforge.org/projects/seattlerb&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
  
    <entry>
      <id>http://blog.zenspider.com/releases/2012/04/minitest-version-2-12-0-has-been-released.html</id>
      <title>minitest version 2.12.0 has been released!</title>
      <updated>2012-04-03T20:31:29-07:00</updated>

      <link rel="alternate" href="http://blog.zenspider.com/releases/2012/04/minitest-version-2-12-0-has-been-released.html"/>

      <published>2012-04-03T20:31:29-07:00</published>
      <content type="html">&lt;p&gt;minitest provides a complete suite of testing facilities supporting
TDD, BDD, mocking, and benchmarking.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&quot;I had a class with Jim Weirich on testing last week and we were
 allowed to choose our testing frameworks. Kirk Haines and I were
 paired up and we cracked open the code for a few test
 frameworks...

 I MUST say that minitest is *very* readable / understandable
 compared to the 'other two' options we looked at. Nicely done and
 thank you for helping us keep our mental sanity.&quot;

-- Wayne E. Seguin
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;minitest/unit is a small and incredibly fast unit testing framework.
It provides a rich set of assertions to make your tests clean and
readable.&lt;/p&gt;

&lt;p&gt;minitest/spec is a functionally complete spec engine. It hooks onto
minitest/unit and seamlessly bridges test assertions over to spec
expectations.&lt;/p&gt;

&lt;p&gt;minitest/benchmark is an awesome way to assert the performance of your
algorithms in a repeatable manner. Now you can assert that your newb
co-worker doesn&amp;rsquo;t replace your linear algorithm with an exponential
one!&lt;/p&gt;

&lt;p&gt;minitest/mock by Steven Baker, is a beautifully tiny mock object
framework.&lt;/p&gt;

&lt;p&gt;minitest/pride shows pride in testing and adds coloring to your test
output. I guess it is an example of how to write IO pipes too. :P&lt;/p&gt;

&lt;p&gt;minitest/unit is meant to have a clean implementation for language
implementors that need a minimal set of methods to bootstrap a working
test suite. For example, there is no magic involved for test-case
discovery.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&quot;Again, I can't praise enough the idea of a testing/specing
 framework that I can actually read in full in one sitting!&quot;

-- Piotr Szotkowski
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Changes:&lt;/p&gt;

&lt;h3 id=&quot;section&quot;&gt;2.12.0 / 2012-04-03&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;4 minor enhancements:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;::it returns test method name (wojtekmach)&lt;/li&gt;
      &lt;li&gt;Added #record method to runner so runner subclasses can cleanly gather data.&lt;/li&gt;
      &lt;li&gt;Added Minitest alias for MiniTest because even I forget.&lt;/li&gt;
      &lt;li&gt;Deprecated assert_block!! Yay!!!&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;1 bug fix:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Fixed warning in i_suck_and_my_tests_are_order_dependent! (phiggins)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;vim: &lt;a href=&quot;https://github.com/sunaku/vim-ruby-minitest&quot;&gt;https://github.com/sunaku/vim-ruby-minitest&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;home: &lt;a href=&quot;https://github.com/seattlerb/minitest&quot;&gt;https://github.com/seattlerb/minitest&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;rdoc: &lt;a href=&quot;http://docs.seattlerb.org/minitest&quot;&gt;http://docs.seattlerb.org/minitest&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
  
    <entry>
      <id>http://blog.zenspider.com/releases/2012/04/hoe-version-3-0-2-has-been-released.html</id>
      <title>hoe version 3.0.2 has been released!</title>
      <updated>2012-04-03T19:57:45-07:00</updated>

      <link rel="alternate" href="http://blog.zenspider.com/releases/2012/04/hoe-version-3-0-2-has-been-released.html"/>

      <published>2012-04-03T19:57:45-07:00</published>
      <content type="html">&lt;p&gt;Hoe is a rake/rubygems helper for project Rakefiles. It helps you
manage, maintain, and release your project and includes a dynamic
plug-in system allowing for easy extensibility. Hoe ships with
plug-ins for all your usual project tasks including rdoc generation,
testing, packaging, deployment, and announcement..&lt;/p&gt;

&lt;p&gt;See class rdoc for help. Hint: &lt;code&gt;ri Hoe&lt;/code&gt; or any of the plugins listed
below.&lt;/p&gt;

&lt;p&gt;For extra goodness, see: http://seattlerb.rubyforge.org/hoe/Hoe.pdf&lt;/p&gt;

&lt;p&gt;Changes:&lt;/p&gt;

&lt;h3 id=&quot;section&quot;&gt;3.0.2 / 2012-04-03&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;1 bug fix:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Generate urls list properly in #announcement if you use k/v form&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;code: &lt;a href=&quot;https://github.com/seattlerb/hoe&quot;&gt;https://github.com/seattlerb/hoe&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;doco: &lt;a href=&quot;http://seattlerb.rubyforge.org/hoe/Hoe.pdf&quot;&gt;http://seattlerb.rubyforge.org/hoe/Hoe.pdf&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;other: &lt;a href=&quot;http://github.com/jbarnette/hoe-plugin-examples&quot;&gt;http://github.com/jbarnette/hoe-plugin-examples&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;bugs: &lt;a href=&quot;https://github.com/seattlerb/hoe/issues&quot;&gt;https://github.com/seattlerb/hoe/issues&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;home: &lt;a href=&quot;http://www.zenspider.com/projects/hoe.html&quot;&gt;http://www.zenspider.com/projects/hoe.html&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;rdoc: &lt;a href=&quot;http://seattlerb.rubyforge.org/hoe/&quot;&gt;http://seattlerb.rubyforge.org/hoe/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
  
    <entry>
      <id>http://blog.zenspider.com/releases/2012/03/hoe-version-3-0-1-has-been-released.html</id>
      <title>hoe version 3.0.1 has been released!</title>
      <updated>2012-03-26T17:53:32-07:00</updated>

      <link rel="alternate" href="http://blog.zenspider.com/releases/2012/03/hoe-version-3-0-1-has-been-released.html"/>

      <published>2012-03-26T17:53:32-07:00</published>
      <content type="html">&lt;p&gt;Hoe is a rake/rubygems helper for project Rakefiles. It helps you
manage, maintain, and release your project and includes a dynamic
plug-in system allowing for easy extensibility. Hoe ships with
plug-ins for all your usual project tasks including rdoc generation,
testing, packaging, deployment, and announcement..&lt;/p&gt;

&lt;p&gt;See class rdoc for help. Hint: &lt;code&gt;ri Hoe&lt;/code&gt; or any of the plugins listed
below.&lt;/p&gt;

&lt;p&gt;For extra goodness, see: http://seattlerb.rubyforge.org/hoe/Hoe.pdf&lt;/p&gt;

&lt;p&gt;Changes:&lt;/p&gt;

&lt;h3 id=&quot;section&quot;&gt;3.0.1 / 2012-03-26&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;1 minor enhancement:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Uniqify hoe plugins in sow Rakefile template. (evanphx)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;3 bug fixes:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Fixed have_gem? checks in the install_plugins task to match the install_gem calls.&lt;/li&gt;
      &lt;li&gt;Fixed homepage handling when bullet list used in readme. (evanphx)&lt;/li&gt;
      &lt;li&gt;Removed deprecated use of #url in publish plugin&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;code: &lt;a href=&quot;https://github.com/seattlerb/hoe&quot;&gt;https://github.com/seattlerb/hoe&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;doco: &lt;a href=&quot;http://seattlerb.rubyforge.org/hoe/Hoe.pdf&quot;&gt;http://seattlerb.rubyforge.org/hoe/Hoe.pdf&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;other: &lt;a href=&quot;http://github.com/jbarnette/hoe-plugin-examples&quot;&gt;http://github.com/jbarnette/hoe-plugin-examples&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;bugs: &lt;a href=&quot;https://github.com/seattlerb/hoe/issues&quot;&gt;https://github.com/seattlerb/hoe/issues&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;home: &lt;a href=&quot;http://www.zenspider.com/projects/hoe.html&quot;&gt;http://www.zenspider.com/projects/hoe.html&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;rdoc: &lt;a href=&quot;http://seattlerb.rubyforge.org/hoe/&quot;&gt;http://seattlerb.rubyforge.org/hoe/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
  
    <entry>
      <id>http://blog.zenspider.com/releases/2012/03/minitest-version-2-11-4-has-been-released.html</id>
      <title>minitest version 2.11.4 has been released!</title>
      <updated>2012-03-20T17:24:03-07:00</updated>

      <link rel="alternate" href="http://blog.zenspider.com/releases/2012/03/minitest-version-2-11-4-has-been-released.html"/>

      <published>2012-03-20T17:24:03-07:00</published>
      <content type="html">&lt;p&gt;minitest provides a complete suite of testing facilities supporting
TDD, BDD, mocking, and benchmarking.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&quot;I had a class with Jim Weirich on testing last week and we were
 allowed to choose our testing frameworks. Kirk Haines and I were
 paired up and we cracked open the code for a few test
 frameworks...

 I MUST say that minitest is *very* readable / understandable
 compared to the 'other two' options we looked at. Nicely done and
 thank you for helping us keep our mental sanity.&quot;

-- Wayne E. Seguin
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;minitest/unit is a small and incredibly fast unit testing framework.
It provides a rich set of assertions to make your tests clean and
readable.&lt;/p&gt;

&lt;p&gt;minitest/spec is a functionally complete spec engine. It hooks onto
minitest/unit and seamlessly bridges test assertions over to spec
expectations.&lt;/p&gt;

&lt;p&gt;minitest/benchmark is an awesome way to assert the performance of your
algorithms in a repeatable manner. Now you can assert that your newb
co-worker doesn&amp;rsquo;t replace your linear algorithm with an exponential
one!&lt;/p&gt;

&lt;p&gt;minitest/mock by Steven Baker, is a beautifully tiny mock object
framework.&lt;/p&gt;

&lt;p&gt;minitest/pride shows pride in testing and adds coloring to your test
output. I guess it is an example of how to write IO pipes too. :P&lt;/p&gt;

&lt;p&gt;minitest/unit is meant to have a clean implementation for language
implementors that need a minimal set of methods to bootstrap a working
test suite. For example, there is no magic involved for test-case
discovery.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&quot;Again, I can't praise enough the idea of a testing/specing
 framework that I can actually read in full in one sitting!&quot;

-- Piotr Szotkowski
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Changes:&lt;/p&gt;

&lt;h3 id=&quot;section&quot;&gt;2.11.4 / 2012-03-20&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;2 minor enhancements:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Updated known extensions&lt;/li&gt;
      &lt;li&gt;You got your unicode in my tests! You got your tests in my unicode! (fl00r)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;1 bug fix:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Fixed MiniTest::Mock example in the readme. (conradwt)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
  
    <entry>
      <id>http://blog.zenspider.com/releases/2012/03/hoe-version-3-0-0-has-been-released.html</id>
      <title>hoe version 3.0.0 has been released!</title>
      <updated>2012-03-20T16:55:59-07:00</updated>

      <link rel="alternate" href="http://blog.zenspider.com/releases/2012/03/hoe-version-3-0-0-has-been-released.html"/>

      <published>2012-03-20T16:55:59-07:00</published>
      <content type="html">&lt;p&gt;Hoe is a rake/rubygems helper for project Rakefiles. It helps you
manage, maintain, and release your project and includes a dynamic
plug-in system allowing for easy extensibility. Hoe ships with
plug-ins for all your usual project tasks including rdoc generation,
testing, packaging, deployment, and announcement..&lt;/p&gt;

&lt;p&gt;See class rdoc for help. Hint: &lt;code&gt;ri Hoe&lt;/code&gt; or any of the plugins listed
below.&lt;/p&gt;

&lt;p&gt;For extra goodness, see: http://seattlerb.rubyforge.org/hoe/Hoe.pdf&lt;/p&gt;

&lt;p&gt;Changes:&lt;/p&gt;

&lt;h3 id=&quot;section&quot;&gt;3.0.0 / 2012-03-20&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;3 major enhancements:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Added activate_plugin_deps phase to plugin loading.&lt;/li&gt;
      &lt;li&gt;Removed long deprecated Hoe.new { block }.&lt;/li&gt;
      &lt;li&gt;Removed long deprecated handling of improper dependencies.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;3 minor enhancements:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Added deprecation warnings to Hoe#url and Hoe#url=. Already deprecated for 9 mo.&lt;/li&gt;
      &lt;li&gt;Reworked all the plugins to use activate_XXX_deps, as necessary.&lt;/li&gt;
      &lt;li&gt;Switched internal usage of #url to #urls.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;2 bug fixes:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Fixed failures in the publish_docs task when remote directory times cannot be changed (such as on rubyforge).&lt;/li&gt;
      &lt;li&gt;Fixed isolate setup for the racc plugin&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
  
    <entry>
      <id>http://blog.zenspider.com/releases/2012/03/ZenTest-version-4-7-0-has-been-released.html</id>
      <title>ZenTest version 4.7.0 has been released!</title>
      <updated>2012-03-15T16:49:07-07:00</updated>

      <link rel="alternate" href="http://blog.zenspider.com/releases/2012/03/ZenTest-version-4-7-0-has-been-released.html"/>

      <published>2012-03-15T16:49:07-07:00</published>
      <content type="html">&lt;p&gt;ZenTest provides 4 different tools: zentest, unit_diff, autotest, and
multiruby.&lt;/p&gt;

&lt;p&gt;ZenTest scans your target and unit-test code and writes your missing
code based on simple naming rules, enabling XP at a much quicker
pace. ZenTest only works with Ruby and Test::Unit. Nobody uses this
tool anymore but it is the package namesake, so it stays.&lt;/p&gt;

&lt;p&gt;unit_diff is a command-line filter to diff expected results from
actual results and allow you to quickly see exactly what is wrong.
Do note that minitest 2.2+ provides an enhanced assert_equal obviating
the need for unit_diff&lt;/p&gt;

&lt;p&gt;autotest is a continous testing facility meant to be used during
development. As soon as you save a file, autotest will run the
corresponding dependent tests.&lt;/p&gt;

&lt;p&gt;multiruby runs anything you want on multiple versions of ruby. Great
for compatibility checking! Use multiruby_setup to manage your
installed versions.&lt;/p&gt;

&lt;p&gt;Changes:&lt;/p&gt;

&lt;h3 id=&quot;section&quot;&gt;4.7.0 / 2012-03-15&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;2 minor enhancements:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;autotest/timestamp now uses ran_command hook. (bhenderson)&lt;/li&gt;
      &lt;li&gt;run_command hook is now passed cmd. (bhenderson)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;1 bug fix:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Fixed run_command hook to only trigger when there are test files to run. (bhenderson)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://github.com/seattlerb/zentest&quot;&gt;https://github.com/seattlerb/zentest&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
  
    <entry>
      <id>http://blog.zenspider.com/blog/2012/03/assert_equal_unordered.html</id>
      <title>assert_equal_unordered</title>
      <updated>2012-03-15T15:00:00-07:00</updated>

      <link rel="alternate" href="http://blog.zenspider.com/blog/2012/03/assert_equal_unordered.html"/>

      <published>2012-03-15T15:00:00-07:00</published>
      <content type="html">&lt;p&gt;This new minitest assertion is up for debate on &lt;a href=&quot;https://github.com/seattlerb/minitest/pull/93&quot;&gt;github&lt;/a&gt;. Will it
clean up your tests? Will it clean up your tests enough to warrant
addition to minitest, or should it be an add-on gem? tenderlov,
drbrain, and I don&amp;rsquo;t see it cleaning up our tests all that much, but
that may be specific to our design patterns.&lt;/p&gt;

&lt;p&gt;What do you think?&lt;/p&gt;

&lt;div&gt;&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td class=&quot;line-numbers&quot; title=&quot;double click to toggle&quot; ondblclick=&quot;with (this.firstChild.style) { display = (display == '') ? 'none' : '' }&quot;&gt;&lt;pre&gt;&lt;a href=&quot;#n1&quot; name=&quot;n1&quot;&gt;1&lt;/a&gt;
&lt;a href=&quot;#n2&quot; name=&quot;n2&quot;&gt;2&lt;/a&gt;
&lt;a href=&quot;#n3&quot; name=&quot;n3&quot;&gt;3&lt;/a&gt;
&lt;a href=&quot;#n4&quot; name=&quot;n4&quot;&gt;4&lt;/a&gt;
&lt;a href=&quot;#n5&quot; name=&quot;n5&quot;&gt;5&lt;/a&gt;
&lt;a href=&quot;#n6&quot; name=&quot;n6&quot;&gt;6&lt;/a&gt;
&lt;a href=&quot;#n7&quot; name=&quot;n7&quot;&gt;7&lt;/a&gt;
&lt;a href=&quot;#n8&quot; name=&quot;n8&quot;&gt;8&lt;/a&gt;
&lt;a href=&quot;#n9&quot; name=&quot;n9&quot;&gt;9&lt;/a&gt;
&lt;strong&gt;&lt;a href=&quot;#n10&quot; name=&quot;n10&quot;&gt;10&lt;/a&gt;&lt;/strong&gt;
&lt;a href=&quot;#n11&quot; name=&quot;n11&quot;&gt;11&lt;/a&gt;
&lt;a href=&quot;#n12&quot; name=&quot;n12&quot;&gt;12&lt;/a&gt;
&lt;a href=&quot;#n13&quot; name=&quot;n13&quot;&gt;13&lt;/a&gt;
&lt;a href=&quot;#n14&quot; name=&quot;n14&quot;&gt;14&lt;/a&gt;
&lt;a href=&quot;#n15&quot; name=&quot;n15&quot;&gt;15&lt;/a&gt;
&lt;a href=&quot;#n16&quot; name=&quot;n16&quot;&gt;16&lt;/a&gt;
&lt;a href=&quot;#n17&quot; name=&quot;n17&quot;&gt;17&lt;/a&gt;
&lt;a href=&quot;#n18&quot; name=&quot;n18&quot;&gt;18&lt;/a&gt;
&lt;a href=&quot;#n19&quot; name=&quot;n19&quot;&gt;19&lt;/a&gt;
&lt;strong&gt;&lt;a href=&quot;#n20&quot; name=&quot;n20&quot;&gt;20&lt;/a&gt;&lt;/strong&gt;
&lt;a href=&quot;#n21&quot; name=&quot;n21&quot;&gt;21&lt;/a&gt;
&lt;a href=&quot;#n22&quot; name=&quot;n22&quot;&gt;22&lt;/a&gt;
&lt;a href=&quot;#n23&quot; name=&quot;n23&quot;&gt;23&lt;/a&gt;
&lt;a href=&quot;#n24&quot; name=&quot;n24&quot;&gt;24&lt;/a&gt;
&lt;a href=&quot;#n25&quot; name=&quot;n25&quot;&gt;25&lt;/a&gt;
&lt;a href=&quot;#n26&quot; name=&quot;n26&quot;&gt;26&lt;/a&gt;
&lt;a href=&quot;#n27&quot; name=&quot;n27&quot;&gt;27&lt;/a&gt;
&lt;a href=&quot;#n28&quot; name=&quot;n28&quot;&gt;28&lt;/a&gt;
&lt;a href=&quot;#n29&quot; name=&quot;n29&quot;&gt;29&lt;/a&gt;
&lt;strong&gt;&lt;a href=&quot;#n30&quot; name=&quot;n30&quot;&gt;30&lt;/a&gt;&lt;/strong&gt;
&lt;a href=&quot;#n31&quot; name=&quot;n31&quot;&gt;31&lt;/a&gt;
&lt;a href=&quot;#n32&quot; name=&quot;n32&quot;&gt;32&lt;/a&gt;
&lt;a href=&quot;#n33&quot; name=&quot;n33&quot;&gt;33&lt;/a&gt;
&lt;a href=&quot;#n34&quot; name=&quot;n34&quot;&gt;34&lt;/a&gt;
&lt;a href=&quot;#n35&quot; name=&quot;n35&quot;&gt;35&lt;/a&gt;
&lt;a href=&quot;#n36&quot; name=&quot;n36&quot;&gt;36&lt;/a&gt;
&lt;a href=&quot;#n37&quot; name=&quot;n37&quot;&gt;37&lt;/a&gt;
&lt;a href=&quot;#n38&quot; name=&quot;n38&quot;&gt;38&lt;/a&gt;
&lt;a href=&quot;#n39&quot; name=&quot;n39&quot;&gt;39&lt;/a&gt;
&lt;strong&gt;&lt;a href=&quot;#n40&quot; name=&quot;n40&quot;&gt;40&lt;/a&gt;&lt;/strong&gt;
&lt;a href=&quot;#n41&quot; name=&quot;n41&quot;&gt;41&lt;/a&gt;
&lt;a href=&quot;#n42&quot; name=&quot;n42&quot;&gt;42&lt;/a&gt;
&lt;a href=&quot;#n43&quot; name=&quot;n43&quot;&gt;43&lt;/a&gt;
&lt;a href=&quot;#n44&quot; name=&quot;n44&quot;&gt;44&lt;/a&gt;
&lt;a href=&quot;#n45&quot; name=&quot;n45&quot;&gt;45&lt;/a&gt;
&lt;a href=&quot;#n46&quot; name=&quot;n46&quot;&gt;46&lt;/a&gt;
&lt;a href=&quot;#n47&quot; name=&quot;n47&quot;&gt;47&lt;/a&gt;
&lt;a href=&quot;#n48&quot; name=&quot;n48&quot;&gt;48&lt;/a&gt;
&lt;a href=&quot;#n49&quot; name=&quot;n49&quot;&gt;49&lt;/a&gt;
&lt;strong&gt;&lt;a href=&quot;#n50&quot; name=&quot;n50&quot;&gt;50&lt;/a&gt;&lt;/strong&gt;
&lt;a href=&quot;#n51&quot; name=&quot;n51&quot;&gt;51&lt;/a&gt;
&lt;a href=&quot;#n52&quot; name=&quot;n52&quot;&gt;52&lt;/a&gt;
&lt;a href=&quot;#n53&quot; name=&quot;n53&quot;&gt;53&lt;/a&gt;
&lt;a href=&quot;#n54&quot; name=&quot;n54&quot;&gt;54&lt;/a&gt;
&lt;a href=&quot;#n55&quot; name=&quot;n55&quot;&gt;55&lt;/a&gt;
&lt;a href=&quot;#n56&quot; name=&quot;n56&quot;&gt;56&lt;/a&gt;
&lt;a href=&quot;#n57&quot; name=&quot;n57&quot;&gt;57&lt;/a&gt;
&lt;a href=&quot;#n58&quot; name=&quot;n58&quot;&gt;58&lt;/a&gt;
&lt;a href=&quot;#n59&quot; name=&quot;n59&quot;&gt;59&lt;/a&gt;
&lt;strong&gt;&lt;a href=&quot;#n60&quot; name=&quot;n60&quot;&gt;60&lt;/a&gt;&lt;/strong&gt;
&lt;a href=&quot;#n61&quot; name=&quot;n61&quot;&gt;61&lt;/a&gt;
&lt;a href=&quot;#n62&quot; name=&quot;n62&quot;&gt;62&lt;/a&gt;
&lt;a href=&quot;#n63&quot; name=&quot;n63&quot;&gt;63&lt;/a&gt;
&lt;a href=&quot;#n64&quot; name=&quot;n64&quot;&gt;64&lt;/a&gt;
&lt;a href=&quot;#n65&quot; name=&quot;n65&quot;&gt;65&lt;/a&gt;
&lt;a href=&quot;#n66&quot; name=&quot;n66&quot;&gt;66&lt;/a&gt;
&lt;a href=&quot;#n67&quot; name=&quot;n67&quot;&gt;67&lt;/a&gt;
&lt;a href=&quot;#n68&quot; name=&quot;n68&quot;&gt;68&lt;/a&gt;
&lt;a href=&quot;#n69&quot; name=&quot;n69&quot;&gt;69&lt;/a&gt;
&lt;strong&gt;&lt;a href=&quot;#n70&quot; name=&quot;n70&quot;&gt;70&lt;/a&gt;&lt;/strong&gt;
&lt;a href=&quot;#n71&quot; name=&quot;n71&quot;&gt;71&lt;/a&gt;
&lt;a href=&quot;#n72&quot; name=&quot;n72&quot;&gt;72&lt;/a&gt;
&lt;a href=&quot;#n73&quot; name=&quot;n73&quot;&gt;73&lt;/a&gt;
&lt;a href=&quot;#n74&quot; name=&quot;n74&quot;&gt;74&lt;/a&gt;
&lt;a href=&quot;#n75&quot; name=&quot;n75&quot;&gt;75&lt;/a&gt;
&lt;a href=&quot;#n76&quot; name=&quot;n76&quot;&gt;76&lt;/a&gt;
&lt;a href=&quot;#n77&quot; name=&quot;n77&quot;&gt;77&lt;/a&gt;
&lt;a href=&quot;#n78&quot; name=&quot;n78&quot;&gt;78&lt;/a&gt;
&lt;a href=&quot;#n79&quot; name=&quot;n79&quot;&gt;79&lt;/a&gt;
&lt;strong&gt;&lt;a href=&quot;#n80&quot; name=&quot;n80&quot;&gt;80&lt;/a&gt;&lt;/strong&gt;
&lt;a href=&quot;#n81&quot; name=&quot;n81&quot;&gt;81&lt;/a&gt;
&lt;a href=&quot;#n82&quot; name=&quot;n82&quot;&gt;82&lt;/a&gt;
&lt;a href=&quot;#n83&quot; name=&quot;n83&quot;&gt;83&lt;/a&gt;
&lt;a href=&quot;#n84&quot; name=&quot;n84&quot;&gt;84&lt;/a&gt;
&lt;a href=&quot;#n85&quot; name=&quot;n85&quot;&gt;85&lt;/a&gt;
&lt;a href=&quot;#n86&quot; name=&quot;n86&quot;&gt;86&lt;/a&gt;
&lt;a href=&quot;#n87&quot; name=&quot;n87&quot;&gt;87&lt;/a&gt;
&lt;a href=&quot;#n88&quot; name=&quot;n88&quot;&gt;88&lt;/a&gt;
&lt;a href=&quot;#n89&quot; name=&quot;n89&quot;&gt;89&lt;/a&gt;
&lt;strong&gt;&lt;a href=&quot;#n90&quot; name=&quot;n90&quot;&gt;90&lt;/a&gt;&lt;/strong&gt;
&lt;a href=&quot;#n91&quot; name=&quot;n91&quot;&gt;91&lt;/a&gt;
&lt;a href=&quot;#n92&quot; name=&quot;n92&quot;&gt;92&lt;/a&gt;
&lt;a href=&quot;#n93&quot; name=&quot;n93&quot;&gt;93&lt;/a&gt;
&lt;a href=&quot;#n94&quot; name=&quot;n94&quot;&gt;94&lt;/a&gt;
&lt;a href=&quot;#n95&quot; name=&quot;n95&quot;&gt;95&lt;/a&gt;
&lt;a href=&quot;#n96&quot; name=&quot;n96&quot;&gt;96&lt;/a&gt;
&lt;a href=&quot;#n97&quot; name=&quot;n97&quot;&gt;97&lt;/a&gt;
&lt;a href=&quot;#n98&quot; name=&quot;n98&quot;&gt;98&lt;/a&gt;
&lt;a href=&quot;#n99&quot; name=&quot;n99&quot;&gt;99&lt;/a&gt;
&lt;strong&gt;&lt;a href=&quot;#n100&quot; name=&quot;n100&quot;&gt;100&lt;/a&gt;&lt;/strong&gt;
&lt;a href=&quot;#n101&quot; name=&quot;n101&quot;&gt;101&lt;/a&gt;
&lt;a href=&quot;#n102&quot; name=&quot;n102&quot;&gt;102&lt;/a&gt;
&lt;a href=&quot;#n103&quot; name=&quot;n103&quot;&gt;103&lt;/a&gt;
&lt;a href=&quot;#n104&quot; name=&quot;n104&quot;&gt;104&lt;/a&gt;
&lt;a href=&quot;#n105&quot; name=&quot;n105&quot;&gt;105&lt;/a&gt;
&lt;a href=&quot;#n106&quot; name=&quot;n106&quot;&gt;106&lt;/a&gt;
&lt;a href=&quot;#n107&quot; name=&quot;n107&quot;&gt;107&lt;/a&gt;
&lt;a href=&quot;#n108&quot; name=&quot;n108&quot;&gt;108&lt;/a&gt;
&lt;a href=&quot;#n109&quot; name=&quot;n109&quot;&gt;109&lt;/a&gt;
&lt;strong&gt;&lt;a href=&quot;#n110&quot; name=&quot;n110&quot;&gt;110&lt;/a&gt;&lt;/strong&gt;
&lt;a href=&quot;#n111&quot; name=&quot;n111&quot;&gt;111&lt;/a&gt;
&lt;a href=&quot;#n112&quot; name=&quot;n112&quot;&gt;112&lt;/a&gt;
&lt;a href=&quot;#n113&quot; name=&quot;n113&quot;&gt;113&lt;/a&gt;
&lt;a href=&quot;#n114&quot; name=&quot;n114&quot;&gt;114&lt;/a&gt;
&lt;a href=&quot;#n115&quot; name=&quot;n115&quot;&gt;115&lt;/a&gt;
&lt;a href=&quot;#n116&quot; name=&quot;n116&quot;&gt;116&lt;/a&gt;
&lt;a href=&quot;#n117&quot; name=&quot;n117&quot;&gt;117&lt;/a&gt;
&lt;a href=&quot;#n118&quot; name=&quot;n118&quot;&gt;118&lt;/a&gt;
&lt;a href=&quot;#n119&quot; name=&quot;n119&quot;&gt;119&lt;/a&gt;
&lt;strong&gt;&lt;a href=&quot;#n120&quot; name=&quot;n120&quot;&gt;120&lt;/a&gt;&lt;/strong&gt;
&lt;a href=&quot;#n121&quot; name=&quot;n121&quot;&gt;121&lt;/a&gt;
&lt;a href=&quot;#n122&quot; name=&quot;n122&quot;&gt;122&lt;/a&gt;
&lt;a href=&quot;#n123&quot; name=&quot;n123&quot;&gt;123&lt;/a&gt;
&lt;a href=&quot;#n124&quot; name=&quot;n124&quot;&gt;124&lt;/a&gt;
&lt;a href=&quot;#n125&quot; name=&quot;n125&quot;&gt;125&lt;/a&gt;
&lt;a href=&quot;#n126&quot; name=&quot;n126&quot;&gt;126&lt;/a&gt;
&lt;a href=&quot;#n127&quot; name=&quot;n127&quot;&gt;127&lt;/a&gt;
&lt;a href=&quot;#n128&quot; name=&quot;n128&quot;&gt;128&lt;/a&gt;
&lt;a href=&quot;#n129&quot; name=&quot;n129&quot;&gt;129&lt;/a&gt;
&lt;strong&gt;&lt;a href=&quot;#n130&quot; name=&quot;n130&quot;&gt;130&lt;/a&gt;&lt;/strong&gt;
&lt;a href=&quot;#n131&quot; name=&quot;n131&quot;&gt;131&lt;/a&gt;
&lt;a href=&quot;#n132&quot; name=&quot;n132&quot;&gt;132&lt;/a&gt;
&lt;a href=&quot;#n133&quot; name=&quot;n133&quot;&gt;133&lt;/a&gt;
&lt;a href=&quot;#n134&quot; name=&quot;n134&quot;&gt;134&lt;/a&gt;
&lt;a href=&quot;#n135&quot; name=&quot;n135&quot;&gt;135&lt;/a&gt;
&lt;a href=&quot;#n136&quot; name=&quot;n136&quot;&gt;136&lt;/a&gt;
&lt;a href=&quot;#n137&quot; name=&quot;n137&quot;&gt;137&lt;/a&gt;
&lt;a href=&quot;#n138&quot; name=&quot;n138&quot;&gt;138&lt;/a&gt;
&lt;a href=&quot;#n139&quot; name=&quot;n139&quot;&gt;139&lt;/a&gt;
&lt;strong&gt;&lt;a href=&quot;#n140&quot; name=&quot;n140&quot;&gt;140&lt;/a&gt;&lt;/strong&gt;
&lt;a href=&quot;#n141&quot; name=&quot;n141&quot;&gt;141&lt;/a&gt;
&lt;a href=&quot;#n142&quot; name=&quot;n142&quot;&gt;142&lt;/a&gt;
&lt;a href=&quot;#n143&quot; name=&quot;n143&quot;&gt;143&lt;/a&gt;
&lt;a href=&quot;#n144&quot; name=&quot;n144&quot;&gt;144&lt;/a&gt;
&lt;a href=&quot;#n145&quot; name=&quot;n145&quot;&gt;145&lt;/a&gt;
&lt;a href=&quot;#n146&quot; name=&quot;n146&quot;&gt;146&lt;/a&gt;
&lt;a href=&quot;#n147&quot; name=&quot;n147&quot;&gt;147&lt;/a&gt;
&lt;a href=&quot;#n148&quot; name=&quot;n148&quot;&gt;148&lt;/a&gt;
&lt;a href=&quot;#n149&quot; name=&quot;n149&quot;&gt;149&lt;/a&gt;
&lt;strong&gt;&lt;a href=&quot;#n150&quot; name=&quot;n150&quot;&gt;150&lt;/a&gt;&lt;/strong&gt;
&lt;a href=&quot;#n151&quot; name=&quot;n151&quot;&gt;151&lt;/a&gt;
&lt;a href=&quot;#n152&quot; name=&quot;n152&quot;&gt;152&lt;/a&gt;
&lt;a href=&quot;#n153&quot; name=&quot;n153&quot;&gt;153&lt;/a&gt;
&lt;a href=&quot;#n154&quot; name=&quot;n154&quot;&gt;154&lt;/a&gt;
&lt;a href=&quot;#n155&quot; name=&quot;n155&quot;&gt;155&lt;/a&gt;
&lt;a href=&quot;#n156&quot; name=&quot;n156&quot;&gt;156&lt;/a&gt;
&lt;a href=&quot;#n157&quot; name=&quot;n157&quot;&gt;157&lt;/a&gt;
&lt;a href=&quot;#n158&quot; name=&quot;n158&quot;&gt;158&lt;/a&gt;
&lt;a href=&quot;#n159&quot; name=&quot;n159&quot;&gt;159&lt;/a&gt;
&lt;strong&gt;&lt;a href=&quot;#n160&quot; name=&quot;n160&quot;&gt;160&lt;/a&gt;&lt;/strong&gt;
&lt;a href=&quot;#n161&quot; name=&quot;n161&quot;&gt;161&lt;/a&gt;
&lt;a href=&quot;#n162&quot; name=&quot;n162&quot;&gt;162&lt;/a&gt;
&lt;a href=&quot;#n163&quot; name=&quot;n163&quot;&gt;163&lt;/a&gt;
&lt;a href=&quot;#n164&quot; name=&quot;n164&quot;&gt;164&lt;/a&gt;
&lt;a href=&quot;#n165&quot; name=&quot;n165&quot;&gt;165&lt;/a&gt;
&lt;a href=&quot;#n166&quot; name=&quot;n166&quot;&gt;166&lt;/a&gt;
&lt;a href=&quot;#n167&quot; name=&quot;n167&quot;&gt;167&lt;/a&gt;
&lt;a href=&quot;#n168&quot; name=&quot;n168&quot;&gt;168&lt;/a&gt;
&lt;a href=&quot;#n169&quot; name=&quot;n169&quot;&gt;169&lt;/a&gt;
&lt;strong&gt;&lt;a href=&quot;#n170&quot; name=&quot;n170&quot;&gt;170&lt;/a&gt;&lt;/strong&gt;
&lt;a href=&quot;#n171&quot; name=&quot;n171&quot;&gt;171&lt;/a&gt;
&lt;a href=&quot;#n172&quot; name=&quot;n172&quot;&gt;172&lt;/a&gt;
&lt;a href=&quot;#n173&quot; name=&quot;n173&quot;&gt;173&lt;/a&gt;
&lt;a href=&quot;#n174&quot; name=&quot;n174&quot;&gt;174&lt;/a&gt;
&lt;a href=&quot;#n175&quot; name=&quot;n175&quot;&gt;175&lt;/a&gt;
&lt;a href=&quot;#n176&quot; name=&quot;n176&quot;&gt;176&lt;/a&gt;
&lt;a href=&quot;#n177&quot; name=&quot;n177&quot;&gt;177&lt;/a&gt;
&lt;a href=&quot;#n178&quot; name=&quot;n178&quot;&gt;178&lt;/a&gt;
&lt;a href=&quot;#n179&quot; name=&quot;n179&quot;&gt;179&lt;/a&gt;
&lt;strong&gt;&lt;a href=&quot;#n180&quot; name=&quot;n180&quot;&gt;180&lt;/a&gt;&lt;/strong&gt;
&lt;a href=&quot;#n181&quot; name=&quot;n181&quot;&gt;181&lt;/a&gt;
&lt;a href=&quot;#n182&quot; name=&quot;n182&quot;&gt;182&lt;/a&gt;
&lt;a href=&quot;#n183&quot; name=&quot;n183&quot;&gt;183&lt;/a&gt;
&lt;a href=&quot;#n184&quot; name=&quot;n184&quot;&gt;184&lt;/a&gt;
&lt;a href=&quot;#n185&quot; name=&quot;n185&quot;&gt;185&lt;/a&gt;
&lt;a href=&quot;#n186&quot; name=&quot;n186&quot;&gt;186&lt;/a&gt;
&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line comment&quot;&gt;diff -r old/lib/minitest/spec.rb new/lib/minitest/spec.rb&lt;/span&gt;
&lt;span class=&quot;line head&quot;&gt;&lt;span class=&quot;head&quot;&gt;--- &lt;/span&gt;&lt;span class=&quot;filename&quot;&gt;old/lib/minitest/spec.rb&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line head&quot;&gt;&lt;span class=&quot;head&quot;&gt;+++ &lt;/span&gt;&lt;span class=&quot;filename&quot;&gt;new/lib/minitest/spec.rb&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line change&quot;&gt;&lt;span class=&quot;change&quot;&gt;@@&lt;/span&gt; -312,6 +312,15 &lt;span class=&quot;change&quot;&gt;@@&lt;/span&gt;&lt;/span&gt;
   infect_an_assertion &lt;span class=&quot;symbol&quot;&gt;:assert_includes&lt;/span&gt;, &lt;span class=&quot;symbol&quot;&gt;:must_include&lt;/span&gt;, &lt;span class=&quot;symbol&quot;&gt;:reverse&lt;/span&gt;
 
   &lt;span class=&quot;comment&quot;&gt;##&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;  &lt;span class=&quot;comment&quot;&gt;# See MiniTest::Assertions#assert_equal_unordered&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;  &lt;span class=&quot;comment&quot;&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;  &lt;span class=&quot;comment&quot;&gt;#    collection.must_equal_unordered other&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;  &lt;span class=&quot;comment&quot;&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;  &lt;span class=&quot;comment&quot;&gt;# :method: must_equal_unordered&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;  infect_an_assertion &lt;span class=&quot;symbol&quot;&gt;:assert_equal_unordered&lt;/span&gt;, &lt;span class=&quot;symbol&quot;&gt;:must_equal_unordered&lt;/span&gt;, &lt;span class=&quot;symbol&quot;&gt;:reverse&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;  &lt;span class=&quot;comment&quot;&gt;##&lt;/span&gt;&lt;/span&gt;
   &lt;span class=&quot;comment&quot;&gt;# See MiniTest::Assertions#assert_instance_of&lt;/span&gt;
   &lt;span class=&quot;comment&quot;&gt;#&lt;/span&gt;
   &lt;span class=&quot;comment&quot;&gt;#    obj.must_be_instance_of klass&lt;/span&gt;
&lt;span class=&quot;line comment&quot;&gt;diff -r old/lib/minitest/unit.rb new/lib/minitest/unit.rb&lt;/span&gt;
&lt;span class=&quot;line head&quot;&gt;&lt;span class=&quot;head&quot;&gt;--- &lt;/span&gt;&lt;span class=&quot;filename&quot;&gt;old/lib/minitest/unit.rb&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line head&quot;&gt;&lt;span class=&quot;head&quot;&gt;+++ &lt;/span&gt;&lt;span class=&quot;filename&quot;&gt;new/lib/minitest/unit.rb&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line change&quot;&gt;&lt;span class=&quot;change&quot;&gt;@@&lt;/span&gt; -248,6 +248,33 &lt;span class=&quot;change&quot;&gt;@@&lt;/span&gt;&lt;/span&gt;
     &lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;
 
     &lt;span class=&quot;comment&quot;&gt;##&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;    &lt;span class=&quot;comment&quot;&gt;# Fails unless +a+ contains the same contents as +b+, regardless&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;    &lt;span class=&quot;comment&quot;&gt;# of order.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;    &lt;span class=&quot;comment&quot;&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;    &lt;span class=&quot;comment&quot;&gt;#    assert_equal_unordered %w[a a b c], %w[a b c a] # pass&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;    &lt;span class=&quot;comment&quot;&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;    &lt;span class=&quot;comment&quot;&gt;# NOTE: This uses Hash#== to determine collection equivalence, as&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;    &lt;span class=&quot;comment&quot;&gt;# such, do not expect it to behave the same as +assert_equal+.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;    &lt;span class=&quot;comment&quot;&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;    &lt;span class=&quot;comment&quot;&gt;#    assert_equal [1], [1.0]                         # pass&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;    &lt;span class=&quot;comment&quot;&gt;#    assert_equal({ 1 =&amp;gt; true }, { 1.0 =&amp;gt; true })    # fail&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;    &lt;span class=&quot;comment&quot;&gt;#    assert_equal_unordered [1], [1.0]               # fail&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;    &lt;span class=&quot;keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;function&quot;&gt;assert_equal_unordered&lt;/span&gt; a, b, msg = &lt;span class=&quot;predefined-constant&quot;&gt;nil&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;      msg = message(msg) {&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;        &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;Expected &lt;/span&gt;&lt;span class=&quot;inline&quot;&gt;&lt;span class=&quot;inline-delimiter&quot;&gt;#{&lt;/span&gt;mu_pp a&lt;span class=&quot;inline-delimiter&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt; to be equivalent to &lt;/span&gt;&lt;span class=&quot;inline&quot;&gt;&lt;span class=&quot;inline-delimiter&quot;&gt;#{&lt;/span&gt;mu_pp b&lt;span class=&quot;inline-delimiter&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;      }&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;      assert_kind_of &lt;span class=&quot;constant&quot;&gt;Enumerable&lt;/span&gt;, a&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;      assert_kind_of &lt;span class=&quot;constant&quot;&gt;Enumerable&lt;/span&gt;, b&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;      c = &lt;span class=&quot;constant&quot;&gt;Hash&lt;/span&gt;.new { |h,k| h[k] = &lt;span class=&quot;integer&quot;&gt;0&lt;/span&gt; }; a.each &lt;span class=&quot;keyword&quot;&gt;do&lt;/span&gt; |e| c[e] += &lt;span class=&quot;integer&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;      d = &lt;span class=&quot;constant&quot;&gt;Hash&lt;/span&gt;.new { |h,k| h[k] = &lt;span class=&quot;integer&quot;&gt;0&lt;/span&gt; }; b.each &lt;span class=&quot;keyword&quot;&gt;do&lt;/span&gt; |e| d[e] += &lt;span class=&quot;integer&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;      assert c == d, msg&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;    &lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;    &lt;span class=&quot;comment&quot;&gt;##&lt;/span&gt;&lt;/span&gt;
     &lt;span class=&quot;comment&quot;&gt;# Fails unless +obj+ is an instance of +cls+.&lt;/span&gt;
 
     &lt;span class=&quot;keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;function&quot;&gt;assert_instance_of&lt;/span&gt; cls, obj, msg = &lt;span class=&quot;predefined-constant&quot;&gt;nil&lt;/span&gt;
&lt;span class=&quot;line comment&quot;&gt;diff -r old/test/test_minitest_spec.rb new/test/test_minitest_spec.rb&lt;/span&gt;
&lt;span class=&quot;line head&quot;&gt;&lt;span class=&quot;head&quot;&gt;--- &lt;/span&gt;&lt;span class=&quot;filename&quot;&gt;old/test/test_minitest_spec.rb&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line head&quot;&gt;&lt;span class=&quot;head&quot;&gt;+++ &lt;/span&gt;&lt;span class=&quot;filename&quot;&gt;new/test/test_minitest_spec.rb&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line change&quot;&gt;&lt;span class=&quot;change&quot;&gt;@@&lt;/span&gt; -65,6 +65,20 &lt;span class=&quot;change&quot;&gt;@@&lt;/span&gt;&lt;/span&gt;
     &lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;
   &lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;
 
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;  it &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;needs to be sensible about must_equal_unordered order&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;    &lt;span class=&quot;instance-variable&quot;&gt;@assertion_count&lt;/span&gt; += &lt;span class=&quot;integer&quot;&gt;6&lt;/span&gt; &lt;span class=&quot;comment&quot;&gt;# must_equal_unordered is 4 assertions&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;    [&lt;span class=&quot;integer&quot;&gt;1&lt;/span&gt;, &lt;span class=&quot;integer&quot;&gt;2&lt;/span&gt;, &lt;span class=&quot;integer&quot;&gt;3&lt;/span&gt;].must_equal_unordered([&lt;span class=&quot;integer&quot;&gt;1&lt;/span&gt;, &lt;span class=&quot;integer&quot;&gt;2&lt;/span&gt;, &lt;span class=&quot;integer&quot;&gt;3&lt;/span&gt;]).must_equal &lt;span class=&quot;predefined-constant&quot;&gt;true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;    assert_triggered &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;Expected [1, 2] to be equivalent to [1, 2, 3].&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;      [&lt;span class=&quot;integer&quot;&gt;1&lt;/span&gt;, &lt;span class=&quot;integer&quot;&gt;2&lt;/span&gt;].must_equal_unordered [&lt;span class=&quot;integer&quot;&gt;1&lt;/span&gt;, &lt;span class=&quot;integer&quot;&gt;2&lt;/span&gt;, &lt;span class=&quot;integer&quot;&gt;3&lt;/span&gt;]&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;    &lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;    assert_triggered &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;msg.&lt;/span&gt;&lt;span class=&quot;char&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;Expected [1, 2, 4] to be equivalent to [1, 2, 3].&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;      [&lt;span class=&quot;integer&quot;&gt;1&lt;/span&gt;, &lt;span class=&quot;integer&quot;&gt;2&lt;/span&gt;, &lt;span class=&quot;integer&quot;&gt;4&lt;/span&gt;].must_equal_unordered [&lt;span class=&quot;integer&quot;&gt;1&lt;/span&gt;, &lt;span class=&quot;integer&quot;&gt;2&lt;/span&gt;, &lt;span class=&quot;integer&quot;&gt;3&lt;/span&gt;], &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;msg&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;    &lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;  &lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;&lt;/span&gt;
   it &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;needs to catch an expected exception&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;do&lt;/span&gt;
     &lt;span class=&quot;instance-variable&quot;&gt;@assertion_count&lt;/span&gt; = &lt;span class=&quot;integer&quot;&gt;2&lt;/span&gt;
 
&lt;span class=&quot;line change&quot;&gt;&lt;span class=&quot;change&quot;&gt;@@&lt;/span&gt; -121,6 +135,7 &lt;span class=&quot;change&quot;&gt;@@&lt;/span&gt;&lt;/span&gt;
                         must_be_within_delta
                         must_be_within_epsilon
                         must_equal
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;                        must_equal_unordered&lt;/span&gt;
                         must_include
                         must_match
                         must_output
&lt;span class=&quot;line change&quot;&gt;&lt;span class=&quot;change&quot;&gt;@@&lt;/span&gt; -129,7 +144,7 &lt;span class=&quot;change&quot;&gt;@@&lt;/span&gt;&lt;/span&gt;
                         must_send
                         must_throw)
 
&lt;span class=&quot;line delete&quot;&gt;&lt;span class=&quot;delete&quot;&gt;-&lt;/span&gt;    bad = &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;%w[&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;not raise throw send output be_silent&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;    bad = &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;%w[&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;not raise throw send output be_silent&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;eyecatcher&quot;&gt;&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;content&quot;&gt; equal_unordered&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
 
     expected_wonts = expected_musts.map { |m| m.sub(&lt;span class=&quot;regexp&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;^must&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;/&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;wont&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;'&lt;/span&gt;&lt;/span&gt;) }
     expected_wonts.reject! { |m| m =~ &lt;span class=&quot;regexp&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;wont_&lt;/span&gt;&lt;span class=&quot;inline&quot;&gt;&lt;span class=&quot;inline-delimiter&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;constant&quot;&gt;Regexp&lt;/span&gt;.union(*bad)&lt;span class=&quot;inline-delimiter&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;/&lt;/span&gt;&lt;/span&gt; }
&lt;span class=&quot;line comment&quot;&gt;diff -r old/test/test_minitest_unit.rb new/test/test_minitest_unit.rb&lt;/span&gt;
&lt;span class=&quot;line head&quot;&gt;&lt;span class=&quot;head&quot;&gt;--- &lt;/span&gt;&lt;span class=&quot;filename&quot;&gt;old/test/test_minitest_unit.rb&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line head&quot;&gt;&lt;span class=&quot;head&quot;&gt;+++ &lt;/span&gt;&lt;span class=&quot;filename&quot;&gt;new/test/test_minitest_unit.rb&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line change&quot;&gt;&lt;span class=&quot;change&quot;&gt;@@&lt;/span&gt; -895,6 +895,69 &lt;span class=&quot;change&quot;&gt;@@&lt;/span&gt;&lt;/span&gt;
     assert_equal expected, e.message
   &lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;
 
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;  &lt;span class=&quot;keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;function&quot;&gt;test_assert_equal_unordered_when_comparable_elements&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;    &lt;span class=&quot;instance-variable&quot;&gt;@assertion_count&lt;/span&gt; = &lt;span class=&quot;integer&quot;&gt;3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;    &lt;span class=&quot;instance-variable&quot;&gt;@tc&lt;/span&gt;.assert_equal_unordered [&lt;span class=&quot;integer&quot;&gt;1&lt;/span&gt;, &lt;span class=&quot;integer&quot;&gt;2&lt;/span&gt;, &lt;span class=&quot;integer&quot;&gt;3&lt;/span&gt;], [&lt;span class=&quot;integer&quot;&gt;2&lt;/span&gt;, &lt;span class=&quot;integer&quot;&gt;3&lt;/span&gt;, &lt;span class=&quot;integer&quot;&gt;1&lt;/span&gt;]&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;  &lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;  &lt;span class=&quot;keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;function&quot;&gt;test_assert_equal_unordered_when_not_comparable_elements&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;    &lt;span class=&quot;instance-variable&quot;&gt;@assertion_count&lt;/span&gt; = &lt;span class=&quot;integer&quot;&gt;3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;    &lt;span class=&quot;instance-variable&quot;&gt;@tc&lt;/span&gt;.assert_equal_unordered [&lt;span class=&quot;predefined-constant&quot;&gt;true&lt;/span&gt;, &lt;span class=&quot;predefined-constant&quot;&gt;false&lt;/span&gt;, &lt;span class=&quot;predefined-constant&quot;&gt;true&lt;/span&gt;], [&lt;span class=&quot;predefined-constant&quot;&gt;true&lt;/span&gt;, &lt;span class=&quot;predefined-constant&quot;&gt;true&lt;/span&gt;, &lt;span class=&quot;predefined-constant&quot;&gt;false&lt;/span&gt;]&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;  &lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;  &lt;span class=&quot;keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;function&quot;&gt;test_assert_equal_unordered_when_enumerable_actual&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;    &lt;span class=&quot;instance-variable&quot;&gt;@assertion_count&lt;/span&gt; = &lt;span class=&quot;integer&quot;&gt;3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;    es = &lt;span class=&quot;constant&quot;&gt;Class&lt;/span&gt;.new &lt;span class=&quot;keyword&quot;&gt;do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;      include &lt;span class=&quot;constant&quot;&gt;Enumerable&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;      &lt;span class=&quot;keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;function&quot;&gt;initialize&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;        &lt;span class=&quot;instance-variable&quot;&gt;@elems&lt;/span&gt; = [&lt;span class=&quot;predefined-constant&quot;&gt;true&lt;/span&gt;, &lt;span class=&quot;predefined-constant&quot;&gt;false&lt;/span&gt;, &lt;span class=&quot;predefined-constant&quot;&gt;true&lt;/span&gt;]&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;      &lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;      &lt;span class=&quot;keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;function&quot;&gt;each&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;        &lt;span class=&quot;instance-variable&quot;&gt;@elems&lt;/span&gt;.each { |e| &lt;span class=&quot;keyword&quot;&gt;yield&lt;/span&gt; e }&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;      &lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;    &lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;.new&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;    &lt;span class=&quot;instance-variable&quot;&gt;@tc&lt;/span&gt;.assert_equal_unordered es, [&lt;span class=&quot;predefined-constant&quot;&gt;true&lt;/span&gt;, &lt;span class=&quot;predefined-constant&quot;&gt;true&lt;/span&gt;, &lt;span class=&quot;predefined-constant&quot;&gt;false&lt;/span&gt;]&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;  &lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;  &lt;span class=&quot;keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;function&quot;&gt;test_assert_equal_unordered_triggered_when_actual_has_more_elements_than_expected&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;    &lt;span class=&quot;instance-variable&quot;&gt;@assertion_count&lt;/span&gt; = &lt;span class=&quot;integer&quot;&gt;4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;    e = &lt;span class=&quot;instance-variable&quot;&gt;@tc&lt;/span&gt;.assert_raises &lt;span class=&quot;constant&quot;&gt;MiniTest&lt;/span&gt;::&lt;span class=&quot;constant&quot;&gt;Assertion&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;      &lt;span class=&quot;instance-variable&quot;&gt;@tc&lt;/span&gt;.assert_equal_unordered [&lt;span class=&quot;predefined-constant&quot;&gt;true&lt;/span&gt;, &lt;span class=&quot;predefined-constant&quot;&gt;true&lt;/span&gt;], [&lt;span class=&quot;predefined-constant&quot;&gt;true&lt;/span&gt;]&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;    &lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;    expected = &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;Expected [true, true] to be equivalent to [true].&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;    assert_equal expected, e.message&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;  &lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;  &lt;span class=&quot;keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;function&quot;&gt;test_assert_equal_unordered_triggered_when_actual_has_less_elements_than_expected&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;    &lt;span class=&quot;instance-variable&quot;&gt;@assertion_count&lt;/span&gt; = &lt;span class=&quot;integer&quot;&gt;4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;    e = &lt;span class=&quot;instance-variable&quot;&gt;@tc&lt;/span&gt;.assert_raises &lt;span class=&quot;constant&quot;&gt;MiniTest&lt;/span&gt;::&lt;span class=&quot;constant&quot;&gt;Assertion&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;      &lt;span class=&quot;instance-variable&quot;&gt;@tc&lt;/span&gt;.assert_equal_unordered [&lt;span class=&quot;predefined-constant&quot;&gt;true&lt;/span&gt;], [&lt;span class=&quot;predefined-constant&quot;&gt;true&lt;/span&gt;, &lt;span class=&quot;predefined-constant&quot;&gt;true&lt;/span&gt;]&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;    &lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;    expected = &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;Expected [true] to be equivalent to [true, true].&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;    assert_equal expected, e.message&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;  &lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;  &lt;span class=&quot;keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;function&quot;&gt;test_assert_equal_unordered_triggered_when_actual_has_different_elements_than_expected&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;    &lt;span class=&quot;instance-variable&quot;&gt;@assertion_count&lt;/span&gt; = &lt;span class=&quot;integer&quot;&gt;4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;    e = &lt;span class=&quot;instance-variable&quot;&gt;@tc&lt;/span&gt;.assert_raises &lt;span class=&quot;constant&quot;&gt;MiniTest&lt;/span&gt;::&lt;span class=&quot;constant&quot;&gt;Assertion&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;      &lt;span class=&quot;instance-variable&quot;&gt;@tc&lt;/span&gt;.assert_equal_unordered [&lt;span class=&quot;predefined-constant&quot;&gt;true&lt;/span&gt;, &lt;span class=&quot;predefined-constant&quot;&gt;false&lt;/span&gt;, &lt;span class=&quot;predefined-constant&quot;&gt;true&lt;/span&gt;], [&lt;span class=&quot;predefined-constant&quot;&gt;false&lt;/span&gt;, &lt;span class=&quot;predefined-constant&quot;&gt;false&lt;/span&gt;, &lt;span class=&quot;predefined-constant&quot;&gt;true&lt;/span&gt;]&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;    &lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;    expected = &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;Expected [true, false, true] to be equivalent to [false, false, true].&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;    assert_equal expected, e.message&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;  &lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;&lt;/span&gt;
   &lt;span class=&quot;keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;function&quot;&gt;test_assert_instance_of&lt;/span&gt;
     &lt;span class=&quot;instance-variable&quot;&gt;@tc&lt;/span&gt;.assert_instance_of &lt;span class=&quot;constant&quot;&gt;String&lt;/span&gt;, &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;blah&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
   &lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;line change&quot;&gt;&lt;span class=&quot;change&quot;&gt;@@&lt;/span&gt; -1272,10 +1335,11 &lt;span class=&quot;change&quot;&gt;@@&lt;/span&gt;&lt;/span&gt;
     methods = &lt;span class=&quot;constant&quot;&gt;MiniTest&lt;/span&gt;::&lt;span class=&quot;constant&quot;&gt;Assertions&lt;/span&gt;.public_instance_methods
     methods.map! { |m| m.to_s } &lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;Symbol&lt;/span&gt; === methods.first
 
&lt;span class=&quot;line delete&quot;&gt;&lt;span class=&quot;delete&quot;&gt;-&lt;/span&gt;    ignores = &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;%w(&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;assert_block assert_no_match assert_not_equal&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line delete&quot;&gt;&lt;span class=&quot;delete&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;content&quot;&gt;                 assert_not_nil assert_not_same assert_nothing_raised&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line delete&quot;&gt;&lt;span class=&quot;delete&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;content&quot;&gt;                 assert_nothing_thrown assert_output assert_raise&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line delete&quot;&gt;&lt;span class=&quot;delete&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;content&quot;&gt;                 assert_raises assert_send assert_silent assert_throws&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;    ignores = &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;%w(&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;assert_block assert_equal_unordered assert_no_match&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;content&quot;&gt;                 assert_not_equal assert_not_nil assert_not_same&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;content&quot;&gt;                 assert_nothing_raised assert_nothing_thrown&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;content&quot;&gt;                 assert_output assert_raise assert_raises&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;insert&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;content&quot;&gt;                 assert_send assert_silent assert_throws&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
 
     asserts = methods.grep(&lt;span class=&quot;regexp&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;^assert&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;/&lt;/span&gt;&lt;/span&gt;).sort - ignores
     refutes = methods.grep(&lt;span class=&quot;regexp&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;^refute&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;/&lt;/span&gt;&lt;/span&gt;).sort - ignores
&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;

</content>
    </entry>
  
    <entry>
      <id>http://blog.zenspider.com/releases/2012/03/image_science-version-1-2-2-has-been-released.html</id>
      <title>image_science version 1.2.2 has been released!</title>
      <updated>2012-03-13T16:33:17-07:00</updated>

      <link rel="alternate" href="http://blog.zenspider.com/releases/2012/03/image_science-version-1-2-2-has-been-released.html"/>

      <published>2012-03-13T16:33:17-07:00</published>
      <content type="html">&lt;p&gt;ImageScience is a clean and happy Ruby library that generates
thumbnails &amp;ndash; and kicks the living crap out of RMagick. Oh, and it
doesn&amp;rsquo;t leak memory like a sieve. :)&lt;/p&gt;

&lt;p&gt;For more information including build steps, see http://seattlerb.rubyforge.org/&lt;/p&gt;

&lt;p&gt;Changes:&lt;/p&gt;

&lt;h3 id=&quot;section&quot;&gt;1.2.2 / 2012-03-13&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;1 minor enhancement:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Extended build to look for homebrew setup (hcatlin)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;2 bug fixes:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Fixed 1.9 warnings, clang warnings, etc&amp;hellip;&lt;/li&gt;
      &lt;li&gt;Fixed compilation error when ruby&amp;rsquo;s config mandates C89 style decls. (nocode)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://seattlerb.rubyforge.org/ImageScience.html&quot;&gt;http://seattlerb.rubyforge.org/ImageScience.html&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://rubyforge.org/projects/seattlerb&quot;&gt;http://rubyforge.org/projects/seattlerb&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
  
</feed>

