tag:www.rhnh.net,2008:/patch
Patch - Xavier Shay's Blog
2009-09-10T20:09:39Z
Enki
Xavier Shay
notreal@rhnh.net
tag:www.rhnh.net,2008:Post/802
2009-09-01T23:42:00Z
2009-09-10T20:09:39Z
BacktraceCleaner and gems in rails
<p><strong><span class="caps">UPDATE</span>:</strong> Fixed the monkey-patch to match the latest version of the patch, and to explicitly require Rails::BacktraceCleaner before patching it to make sure it has been loaded</p>
<p>If there’s one thing my mother taught me, if you’re going to clean something up you may as well do it properly. Be thorough, cover every surface.</p>
<p><code>Rails::BacktraceCleaner</code> is a bit sloppy when it comes to gem directories. It misses all sorts of dust – hyphens, underscores, upper case letters, numbers. That’s not going to earn any pocket money. Let’s teach it a lesson.</p><table class="CodeRay"><tr>
<td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt>
</tt>2<tt>
</tt>3<tt>
</tt>4<tt>
</tt>5<tt>
</tt>6<tt>
</tt>7<tt>
</tt>8<tt>
</tt>9<tt>
</tt><strong>10</strong><tt>
</tt>11<tt>
</tt>12<tt>
</tt>13<tt>
</tt>14<tt>
</tt>15<tt>
</tt>16<tt>
</tt>17<tt>
</tt>18<tt>
</tt>19<tt>
</tt></pre></td>
<td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"><span class="c"># config/initializers/this_is_what_a_gem_looks_like.rb</span><tt>
</tt>require <span class="s"><span class="dl">'</span><span class="k">rails/backtrace_cleaner</span><span class="dl">'</span></span><tt>
</tt><tt>
</tt><span class="r">module</span> <span class="cl">Rails</span><tt>
</tt> <span class="r">class</span> <span class="cl">BacktraceCleaner</span> < <span class="co">ActiveSupport</span>::<span class="co">BacktraceCleaner</span><tt>
</tt> private<tt>
</tt> <span class="co">GEM_REGEX</span> = <span class="s"><span class="dl">"</span><span class="k">([A-Za-z0-9_-]+)-([0-9.]+)</span><span class="dl">"</span></span><tt>
</tt><tt>
</tt> <span class="r">def</span> <span class="fu">add_gem_filters</span><tt>
</tt> <span class="co">Gem</span>.path.each <span class="r">do</span> |path|<tt>
</tt> <span class="c"># http://gist.github.com/30430</span><tt>
</tt> add_filter { |line| line.sub(<span class="rx"><span class="dl">/</span><span class="k">(</span><span class="il"><span class="idl">#{</span>path<span class="idl">}</span></span><span class="k">)</span><span class="ch">\/</span><span class="k">gems</span><span class="ch">\/</span><span class="il"><span class="idl">#{</span><span class="co">GEM_REGEX</span><span class="idl">}</span></span><span class="ch">\/</span><span class="k">(.*)</span><span class="dl">/</span></span>, <span class="s"><span class="dl">'</span><span class="k">\2</span><span class="k"> (</span><span class="k">\3</span><span class="k">) </span><span class="k">\4</span><span class="dl">'</span></span>)}<tt>
</tt> <span class="r">end</span><tt>
</tt><tt>
</tt> vendor_gems_path = <span class="co">Rails</span>::<span class="co">GemDependency</span>.unpacked_path.sub(<span class="s"><span class="dl">"</span><span class="il"><span class="idl">#{</span><span class="co">RAILS_ROOT</span><span class="idl">}</span></span><span class="k">/</span><span class="dl">"</span></span>,<span class="s"><span class="dl">'</span><span class="dl">'</span></span>)<tt>
</tt> add_filter { |line| line.sub(<span class="rx"><span class="dl">/</span><span class="k">(</span><span class="il"><span class="idl">#{</span>vendor_gems_path<span class="idl">}</span></span><span class="k">)</span><span class="ch">\/</span><span class="il"><span class="idl">#{</span><span class="co">GEM_REGEX</span><span class="idl">}</span></span><span class="ch">\/</span><span class="k">(.*)</span><span class="dl">/</span></span>, <span class="s"><span class="dl">'</span><span class="k">\2</span><span class="k"> (</span><span class="k">\3</span><span class="k">) [v] </span><span class="k">\4</span><span class="dl">'</span></span>)}<tt>
</tt> <span class="r">end</span><tt>
</tt> <span class="r">end</span><tt>
</tt><span class="r">end</span><tt>
</tt></pre></td>
</tr></table>
<p>I’ve <a href="https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/3129-patch-better-cleaning-of-gem-directories">submitted a patch to rails</a>, please review if you like.</p>
<p>Kudos to <a href="http://matthewtodd.org/">Matthew Todd</a> for pairing with me on this.</p>