Pastie now auto-senses if line-wrap is a bad or good idea. Feedback?
## mark a section (Learn more)
require 'test/unit' require 'happymapper' module OPML class Outline include HappyMapper tag 'outline' attribute :title, String attribute :text, String attribute :type, String attribute :xmlUrl, String attribute :htmlUrl, String has_many :outlines, Outline end class Section include HappyMapper tag 'section' attribute :title, String attribute :text, String has_many :outlines, Outline end end class TestHappyOPML < Test::Unit::TestCase def setup @xml =<<-EOXML <?xml version="1.0" encoding="UTF-8"?> <opml version="1.0"> <head> <title>mikewoodhouse subscriptions in Google Reader</title> </head> <body> <outline title="ruby" text="ruby"> <outline text="RailsTips - Home" title="RailsTips - Home" type="rss" xmlUrl="http://feeds.feedburner.com/railstips" htmlUrl="http://railstips.org/"/> </outline> </body> </opml> EOXML end def test_as_supplied_by_google_reader sections = OPML::Outline.parse(@xml) # Outline#parse gets all the sections ("outer" outlines) AND all the "inner" outlines too # so we have to delete the inner ones because we want them to be held in the outer ones # as stipulated by the has_many assert_equal 2, sections.size # size is 2 because it parsed both outlines sections.delete_if { |section| section.outlines.size == 0 } assert_equal 1, sections.size # should have removed 1 section = sections.first assert_equal 1, section.outlines.size assert_equal "ruby", section.title assert_equal "ruby", section.text outline = section.outlines.first assert_equal "RailsTips - Home", outline.title assert_equal "RailsTips - Home", outline.text assert_equal "rss", outline.type assert_equal "http://feeds.feedburner.com/railstips", outline.xmlUrl assert_equal "http://railstips.org/", outline.htmlUrl end def test_with_section_outlines_renamed # this is what happens when we (somewhat kludgily) hack the XML to make the # "outer" outlines into "sections"... new_xml = @xml.gsub(/outline title/, 'section title').gsub!(/\/outline/, '/section') # now we can use the Section class: sections = OPML::Section.parse(new_xml) assert_kind_of Array, sections assert_equal 1, sections.size assert_equal 1, sections.first.outlines.size assert_equal "ruby", sections.first.title assert_equal "ruby", sections.first.text end end
This paste will be private.
From the Design Piracy series on my blog: