require 'rubygems' require 'digest/md5' require 'activesupport' class SkeduResource def self.array_accessor(symbol, klass=nil) symbol = symbol.to_sym unless symbol.is_a?(Symbol) # @array_symbols ||= [] # @array_symbols << symbol define_method("add_#{symbol.to_s.singularize}") do |thing| if (klass.nil? || (klass != String)) && (!thing.is_a? symbol.to_s.classify.constantize) raise "Not a #{symbol.to_s.classify}: #{thing.inspect}" end ivar = "@#{symbol}".to_sym arr = instance_variable_get(ivar) if arr.nil? arr = [] instance_variable_set(ivar, arr) end arr << thing end define_method("#{symbol}") do instance_variable_get("@#{symbol}".to_sym) end end def clean_json(str) return nil if str.nil? clean_str = str.gsub(/"/,'\"').strip clean_str.gsub(/[\n\r]/,' '). gsub(/\s{2,}/,' '). gsub(/\t/,' ') end def clean_html(str) return nil if str.nil? str.gsub(/<\/?[^>]*>/, '').strip end def clean(str) clean_json(clean_html(str)) end def date_parse(str) return nil if str.nil? dt = DateTime.parse(clean(str)) dt.strftime('%Y-%m-%d %H:%M') end end class Event < SkeduResource attr_accessor :name, :guid, :url, :contact, :is_public, :syncable, :description, :basic_description, :background_image_url, :navbar_image_url array_accessor :venues def to_json return <<-EVENT_JSON { "name": "#{clean(@name)}", "guid": "#{clean(@guid) || Digest::MD5.hexdigest(title).upcase}", "public": "#{clean(@public) || 'false'}", "syncable": "#{clean(@syncable) || 'false'}", "description": "#{clean_json(@description)}", "basic_description": "#{clean(@basic_description)}", "url": "#{clean(@url)}", "backgroundImageURL": "#{clean(@background_image_url)}", "navbarImageURL": "#{clean(@navbar_image_url)}", "venues": [ #{@venues.map{|s| s.to_json}.join(",\n")} ] } EVENT_JSON end end class Venue < SkeduResource attr_accessor :name, :description, :location, :phone_number array_accessor :sessions def to_json return <<-VENUE_JSON { "venue": "#{clean(@name)}", "description": "#{clean_json(@description)}", "location": #{@location.to_json}, "sessions": [ #{@sessions.map{|s| s.to_json}.join(",\n")} ] } VENUE_JSON end end class Session < SkeduResource attr_accessor :title, :start_time, :end_time, :description, :hashtag, :speaker, :category array_accessor :audio_urls, String array_accessor :youtube_urls, String def to_json @description ||= '' @speaker ||= '' @category ||= '' clean_long(:@speaker, 80) clean_long(:@title, 128) return <<-JSON { "title": "#{@title}", "startTime": "#{date_parse(@start_time)}", "endTime": "#{date_parse(@end_time)}", "category": "#{clean(@category)}", "speaker": "#{@speaker}", "description": "#{clean_json(@description)}", "images": [], "audios": [], "videos": [] } JSON end def clean_long(attribute, max) s = instance_variable_get(attribute) instance_variable_set(attribute, clean(s)) if s.length > max @description = "

#{s}

#{@description}" instance_variable_set(attribute, s[0..(max-4)]+'...') end end def to_s puts "-- Title: #{title}" puts " Start: #{start_time}" puts " End: #{end_time}" puts " Track: #{track}" puts " Speaker: #{speaker}" puts " Desc: #{body}" end end class Location < SkeduResource attr_accessor :address1, :address2, :city, :region, :postal_code def to_json return <<-JSON { "address1": "#{clean(@address1)}", "address2": "#{clean(@address2)}", "city": "#{clean(@city)}", "region": "#{clean_json(@region)}", "postalCode": "#{clean(@postal_code)}" } JSON end end __END__ if __FILE__ == $0 e = Event.new v = Venue.new e.add_venue(v) s = Session.new s.title = "Something really long orem ipsum dolor sit amet, consectetur adipiscing elit. Nullam vulputate suscipit nibh a tempus. Mauris posuere ultricies nisi, volutpat dignissim nisl lobortis vel. Donec tempus interdum metus vel placerat. Quisque vel euismod mi. In hac habitasse platea dictumst. In hac habitasse platea dictumst. Integer laoreet cursus nulla, sit amet consectetur orci rhoncus vel. Proin sit amet porttitor sapien. Sed aliquam ante et urna placerat venenatis. Vivamus eu nisl ante. Aenean arcu dui, consequat quis ornare a, tempor vel leo. Nulla imperdiet ullamcorper massa, et ultricies felis luctus sit amet. Donec at augue ac orci blandit sodales. Cras dictum volutpat arcu, in egestas augue porttitor sed. Etiam sagittis risus id arcu tincidunt mollis." s.description = 'The main description' s.add_audio_url('mp3') v.add_session s puts e.to_json end