# = HumaneUpcoming.rb - A Humane Upcoming Library # # Muness Alrubaie mailto:muness@gmail.com # # == Why # # Entering repeating items through upcoming is a royal pain. # Using the API requires you to get the IDs for everything used (metro, venue and so on) # This API attempts to alleviate these issues - just use the metro and venue name and it figures the ID out for you. # Of course, if you want to, you can go ahead and use IDs instead of names # Date and time fields can be of any form accepted by GNU programs # (See http://www.gnu.org/software/shishi/manual/html_node/Date-input-formats.html#Date-input-formats) require 'upcoming/upcoming' require 'cgi' require 'date' Copyright = 'Copyleft 2006 Muness Alrubaie ' Version = '0.1' class HumaneUpcoming @@apiObj = Upcoming::Upcoming.new('3853ee0982') def initialize(user,password) @apiObj = Upcoming::Upcoming.new('3853ee0982',user,password) end # Add an event to upcoming. Use the metro,venue and category name (not the ID). # Example: #event_name = 'Continuous Integration' #metro_name = 'Columbus OH' #venue_name = 'OCLC Kilgour' #category_name = 'Education' #start_date = '2006-02-14' #end_date = '' #start_time = '18:30' #end_time = '20:00' #description = 'Continuous Integration prevents human error and should be in every software developer\'s toolkit. We\'ll discuss some of the pitfalls of implementing continuous integration systems, as well as the benefits. We\'ll compare and contrast various Java based open source CI solutions and if time permits we\'ll do a hands on download, compilation, and configuration of CruiseControl that at the end of it will have projects being checked out of CVS and Subversion repositories, and building Java projects using Ant, and Maven.' # #add_event(event_name,metro_name,venue_name,category_name,start_date,end_date,start_time,end_time,description) def add_event(event_name,metro_name,venue_name,category_name,start_date,end_date='',start_time='',end_time='',description='') metro = get_metro(metro_name) venue = get_venue(venue_name,metro_name) category = HumaneUpcoming.get_category(category_name) #puts "Adding:", "-------", event_name, metro.id, venue.id, category.id,start_date, end_date, start_time, end_time, description, "-------" @apiObj.addEvent(event_name, metro.id, venue.id, category.id,start_date, end_date, start_time, end_time, description) end def HumaneUpcoming.get_category(category_name) categories = get_category_list if (category_name =~ /\d/) category = categories.find { |category| category.id == category_name } else category = categories.find { |category| category.name == category_name } end return category end # Get the venue specified. Optionally, limits the search to the metro provided. def get_venue(venue_name,metro_name = '') if (venue_name =~ /\d+/) venue = @apiObj.getVenueInfo(venue_name)[0] else venue_name = CGI.escape(venue_name) metro_id = '' if (metro_name != '') metro = get_metro(metro_name) metro_id = metro.id end venueList = @apiObj.searchVenues(search_text = venue_name, '', '', metro_id, privateVenues = false) #Add error handling - array should be of size 1 only, otherwise, throw an error venue = venueList[0] end return venue end def get_events(search_text,metro_name='',venue_name='') metro_id = '' if (metro_name != '') metro = get_metro(metro_name) metro_id = metro.id end venue_id = '' if (venue_name != '') venue = get_venue(venue_name) venue_id = venue.id end search_text = CGI.escape(search_text) events = @apiObj.searchEvents(search_text,'','',metro_id,venue_id) end def events_to_csv(events) events.each{|event| puts event_to_csv(event) } end def event_to_csv(event) venue = get_venue(event.venue_id) metro = get_metro(event.metro_id) category = HumaneUpcoming.get_category(event.category_id) "#{event.start_date},#{event.start_time},#{event.end_time},#{event.name},#{metro.name},#{venue.name},#{category.name},#{event.description}" end def export_events(event_text,metro_name='',venue_name='') events=get_events(event_text,metro_name='',venue_name='') events_to_csv(events) end # Get the metro specified. def get_metro(metro_name) if (metro_name =~ /\d+/) metro = @apiObj.getMetroInfo(metro_name)[0] else metro_name = CGI.escape(metro_name) metroList = @apiObj.searchMetros(metro_name) #Add error handling - array should be of size 1 only, otherwise, throw an error metro = metroList[0] end return metro end # Add a venue to Upcoming. #Example: #add_venue("Columbus OH","Columbus Marriott North","6500 Doubletree Avenue","Columbus","43229-1145","614-885-1885", " http://marriott.com/property/propertypage/cmhno") def add_venue(metro_name,venue_name,venue_address,venue_city,venue_zip = '',venue_phone='', venue_url = '') venue_name = CGI.escape(venue_name) venue_address = CGI.escape(venue_address) venue_city = CGI.escape(venue_city) venue_zip = CGI.escape(venue_zip) venue_phone = CGI.escape(venue_phone) venue_url = CGI.escape(venue_url) metro = get_metro(metro_name) venue = @apiObj.addVenue(venue_name, venue_address, venue_city, metro.id, venuezip = '', venuephone = '', venueurl = '') end # Get the list of categories accepted by Upcoming. def HumaneUpcoming.get_category_list categories = @@apiObj.getCategoryList() end #TODO: Replace fields with an event_details class #Parse a CSV and gives back the fields therein. #csv format: #,,,,,,, # can span multiple lines (as long as they don't have more than 6 commas per line). #Example: #(start_date,start_time,end_time,event_name,metro_name,venue_name,category_name,description,end_date)=csv_to_event_details(input) def csv_to_event_details(csv) array = csv.split(",",8) return array[0],array[1],array[2],array[3],array[4],array[5],array[6],array[7],'' end #Loop through all the entries in a CSV adding all the events listed. See csv_to_event_details for the expected csv format def import_csv(filename) file = File.new(filename) array = [] while input = file.gets array.push(input) end description_hack_array = [] for i in 0 ... array.length if (array[i] =~ /,.*,.*,.*,.*,.*,.*/) description_hack_array.push(array[i]) else description_hack_array[description_hack_array.length-1] += array[i] end end description_hack_array.each{|line| (start_date,start_time,end_time,event_name,metro_name,venue_name,category_name,description,end_date)=csv_to_event_details(easy_date_time(line)) add_event(event_name,metro_name,venue_name,category_name,start_date,end_date,start_time,end_time,description) } end end