<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: Jlong's Code Snippets</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Fri, 25 Jul 2008 00:36:30 GMT</pubDate>
    <description>DZone Snippets: Jlong's Code Snippets</description>
    <item>
      <title>Object#subclasses</title>
      <link>http://snippets.dzone.com/posts/show/2992</link>
      <description>Find every subclass of an object. Limit the query to direct descendants by setting direct to true.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;require 'test/unit'&lt;br /&gt;&lt;br /&gt;class Object&lt;br /&gt;  def self.subclasses(direct = false)&lt;br /&gt;    classes = []&lt;br /&gt;    if direct&lt;br /&gt;      ObjectSpace.each_object(Class) do |c|&lt;br /&gt;        next unless c.superclass == self&lt;br /&gt;        classes &lt;&lt; c&lt;br /&gt;      end&lt;br /&gt;    else&lt;br /&gt;      ObjectSpace.each_object(Class) do |c|&lt;br /&gt;        next unless c.ancestors.include?(self) and (c != self)&lt;br /&gt;        classes &lt;&lt; c&lt;br /&gt;      end&lt;br /&gt;    end&lt;br /&gt;    classes&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;class TrackSubclassesTest &lt; Test::Unit::TestCase&lt;br /&gt;&lt;br /&gt;  class A; end&lt;br /&gt;  class B &lt; A; end&lt;br /&gt;  class C &lt; B; end&lt;br /&gt;  class D &lt; A; end&lt;br /&gt;  class E; end&lt;br /&gt;  class F &lt; E; end&lt;br /&gt;  &lt;br /&gt;  def test_subclasses&lt;br /&gt;    assert_equal [F], E.subclasses&lt;br /&gt;    assert_equal [C], B.subclasses&lt;br /&gt;    assert_equal [B, D], A.subclasses(true).sort_by { |c| c.name }&lt;br /&gt;    assert_equal [B, C, D], A.subclasses.sort_by { |c| c.name }&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Mon, 13 Nov 2006 20:13:04 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/2992</guid>
      <author>jlong (John W. Long)</author>
    </item>
    <item>
      <title>Rails and Vim</title>
      <link>http://snippets.dzone.com/posts/show/2338</link>
      <description>A simple command for opening related Rails project files in Vim:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#!/usr/bin/env ruby&lt;br /&gt;&lt;br /&gt;if ARGV.empty?&lt;br /&gt;  puts "usage: #{File.basename($0)} string" &lt;br /&gt;  puts "  Scans related Rails directories for " + &lt;br /&gt;         "files begining with string " &lt;br /&gt;  puts "  and opens them in vi." &lt;br /&gt;  exit&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;files = []&lt;br /&gt;ignore = [/CVS$/]&lt;br /&gt;&lt;br /&gt;# Find models or controllers that match args&lt;br /&gt;ARGV.each do |arg|&lt;br /&gt;  models = Dir["app/models/#{arg}*"]&lt;br /&gt;  controllers = Dir["app/controllers/#{arg}*"]&lt;br /&gt;  files += models + controllers&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;# Remove duplicates&lt;br /&gt;files.sort!.uniq!&lt;br /&gt;&lt;br /&gt;# Add unit tests for models&lt;br /&gt;files.grep(%r{app/models/(.*?).rb}) do&lt;br /&gt;  tests = Dir["test/unit/#{$1}_test.rb"]&lt;br /&gt;  files += tests&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;# Add views and functional tests for controllers&lt;br /&gt;files.grep(%r{app/controllers/(.*?)_controller.rb}) do&lt;br /&gt;  views = Dir["app/views/#{$1}/*"]&lt;br /&gt;  tests = Dir["test/functional/#{$1}_controller_test.rb"]&lt;br /&gt;  files += views + tests&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;# Add views and fixtures for mailers&lt;br /&gt;files.grep(%r{app/models/(.*?_mailer).rb}) do&lt;br /&gt;  views = Dir["app/views/#{$1}/*"]&lt;br /&gt;  fixtures = Dir["test/fixtures/#{$1}/*"]&lt;br /&gt;  files += views + fixtures&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;# Again remove duplicates&lt;br /&gt;files.sort!.uniq!&lt;br /&gt;&lt;br /&gt;# Remove files that match ignore list&lt;br /&gt;files.delete_if do |filename|&lt;br /&gt;  result = false&lt;br /&gt;  ignore.each do |i|&lt;br /&gt;    if filename =~ i&lt;br /&gt;      result = true&lt;br /&gt;      break&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;  result&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;system "vi -o #{files.join(' ')}" &lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Drop it in a file called "edit" in your path and you can open related rails files with a few key strokes:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;# open AccountController and related tests and views:&lt;br /&gt;edit account_c&lt;br /&gt;&lt;br /&gt;# open AccountMailer and related tests, views, and fixtures:&lt;br /&gt;edit account_m&lt;br /&gt;&lt;br /&gt;# open everything related to accounts:&lt;br /&gt;edit account&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;A detailed explanation here: &lt;a href="http://wiseheartdesign.com/articles/2006/07/27/rails-and-vim/"&gt;http://wiseheartdesign.com/articles/2006/07/27/rails-and-vim/&lt;/a&gt;.&lt;br /&gt;</description>
      <pubDate>Sat, 29 Jul 2006 03:00:20 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/2338</guid>
      <author>jlong (John W. Long)</author>
    </item>
    <item>
      <title>Testing Rails Validations</title>
      <link>http://snippets.dzone.com/posts/show/1170</link>
      <description>&lt;code&gt;&lt;br /&gt;#&lt;br /&gt;# Useful for testing Rails ActiveRecord validations. For more information see:&lt;br /&gt;# http://wiseheartdesign.com/articles/2006/01/16/testing-rails-validations/&lt;br /&gt;#&lt;br /&gt;module ValidationTestHelper&lt;br /&gt;  def assert_valid(field, message, *values)&lt;br /&gt;    __model_check__&lt;br /&gt;    values.each do |value|&lt;br /&gt;      o = __setup_model__(field, value)&lt;br /&gt;      if o.valid?&lt;br /&gt;        assert_block { true }&lt;br /&gt;      else&lt;br /&gt;        messages = [o.errors[field]].flatten&lt;br /&gt;        assert_block("unexpected invalid field &lt;#{o.class}##{field}&gt;, value: &lt;#{value.inspect}&gt;, errors: &lt;#{o.errors[field].inspect}&gt;.") { false }&lt;br /&gt;      end&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  def assert_invalid(field, message, *values)&lt;br /&gt;    __model_check__&lt;br /&gt;    values.each do |value|&lt;br /&gt;      o = __setup_model__(field, value)&lt;br /&gt;      if o.valid?&lt;br /&gt;        assert_block("field &lt;#{o.class}##{field}&gt; should be invalid for value &lt;#{value.inspect}&gt; with message &lt;#{message.inspect}&gt;") { false }&lt;br /&gt;      else&lt;br /&gt;        messages = [o.errors[field]].flatten&lt;br /&gt;        assert_block("field &lt;#{o.class}##{field}&gt; with value &lt;#{value.inspect}&gt; expected validation error &lt;#{message.inspect}&gt;, but got errors &lt;#{messages.inspect}&gt;") { messages.include?(message) }&lt;br /&gt;      end&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  def __model_check__&lt;br /&gt;    raise "@model must be assigned in order to use validation assertions" if @model.nil?&lt;br /&gt;    &lt;br /&gt;    o = @model.dup&lt;br /&gt;    raise "@model must be valid before calling a validation assertion, instead @model contained the following errors #{o.errors.instance_variable_get('@errors').inspect}" unless o.valid?&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  def __setup_model__(field, value)&lt;br /&gt;    o = @model.dup&lt;br /&gt;    attributes = o.instance_variable_get('@attributes')&lt;br /&gt;    o.instance_variable_set('@attributes', attributes.dup)&lt;br /&gt;    o.send("#{field}=", value)&lt;br /&gt;    o&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Tue, 17 Jan 2006 20:25:14 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/1170</guid>
      <author>jlong (John W. Long)</author>
    </item>
  </channel>
</rss>
