module WonderCroc class Client def find_folder_by_id folder_id @subfolders.each { |subfolder| return subfolder if subfolder and subfolder.find_by_id folder_id} return nil end end # A folder is a folder that resides in a NewsGator location. # It can contain subscriptions and other folders. class Folder attr_accessor :folder_id, :name attr_reader :unread_count def initialize name, id raise ArgumentException unless name @name = name @folder_id = id @unread_count = 0 @subfolders = [] end def to_str return @name if @unread_count == 0 return "#{@name} (#{@unread_count})" end def subfolders return @subfolders end def << subfolder @subfolders << subfolder end def merge array @subfolders += array if array end def find_by_id id return self if @folder_id == id @subfolders.each { |subfolder| return subfolder if subfolder.find_by_id id} end end class Client # Return a list of all folders in the user's subscription. def get_folders new_connection_to "/Folder.aspx" send_request :get @folders = folders_from_xml(@response).subfolders end private def folders_from_xml xml root_folder = Folder.new 'Root', -1 doc = REXML::Document.new xml doc.elements.each('opml/body/outline') do |e| dir = Folder.new e.attributes['title'], e.attributes['ng:id'] dir.merge subfolders(e) root_folder << dir end return root_folder end def subfolders element return nil if element.elements.size == 0 folders = [] element.each do |e| folder = Folder.new(e.attributes['title'], e.attributes['ng:id']) folder.merge subfolders(e) folders << folder end return folders.compact end end end