pennlabs/penn-sdk-ruby

View on GitHub
lib/penn_sdk.rb

Summary

Maintainability
A
0 mins
Test Coverage
require "penn_sdk/version"
require "httparty"

module PennSDK
  class Base
    include HTTParty
    base_uri 'https://esb.isc-seo.upenn.edu/8091/open_data/'

    def initialize(username, password)
      if not username or not password
        raise "Username and password required"
      end
      @username = username
      @password = password
      @headers = {
        "Authorization-Bearer" => username,
        "Authorization-Token"  => password,
        "Content-Type"         => "application/json; charset=utf-8"
      }
    end

    def api(endpoint, query={})
      result = self.class.get(endpoint, query: query, headers: @headers)
      if not result["service_meta"]["error_text"].empty?
        raise result["service_meta"]["error_text"]
      else
        return result["result_data"]
      end
    end
  end

  class Registrar < Base
    ENDPOINTS = {
      :catalog       => '/course_info',
      :search        => '/course_section_search',
      :search_params => '/course_section_search_parameters'
    }

    def course(dept, course_number)
      api("#{ENDPOINTS[:catalog]}/#{dept}/#{course_number}")
    end

    def section(dept, course_number, section_number)
      api(ENDPOINTS[:search], {"course_id" => dept + course_number + section_number})
    end

    def searchParams
      api(ENDPOINTS[:search_params])
    end
  end

  class Directory < Base
    ENDPOINTS = {
      :search  => '/directory',
      :details => '/directory_person_details'
    }

    def search(params)
      api(ENDPOINTS[:search], params)
    end

    def details(person)
      api("#{ENDPOINTS[:details]}/#{person}")[0]
    end
  end

  class Dining < Base
    ENDPOINTS = {
      :venues => '/dining/venues',
      :menus  => '/dining/menus'
    }

    def venues
      api(ENDPOINTS[:venues])["document"]["venue"]
    end

    def daily_menu(venue)
      api("#{ENDPOINTS[:menus]}/daily/#{venue}")["Document"]
    end

    def weekly_menu(venue)
      api("#{ENDPOINTS[:menus]}/weekly/#{venue}")["Document"]
    end
  end

  class Transit < Base
    ENDPOINTS = {
      :stops   => '/transit/stopinventory',
      :config  => '/transit/511/Configuration',
      :predict => '/transit/511/Prediction',
      :arrived => '/transit/511/Arrived'
    }

    def stops
      api(ENDPOINTS[:stops])
    end

    def config
      api(ENDPOINTS[:config])
    end

    def predict
      api(ENDPOINTS[:predict])
    end

    def arrived
      api(ENDPOINTS[:arrived])
    end
  end

  class News < Base
    ENDPOINTS = {
      :news => '/news_events_maps'
    }

    def search(description)
      api(ENDPOINTS[:news], {:source => "news", :description => description})
    end
  end

  class Map < Base
    ENDPOINTS = {
      :maps        => '/maps',
      :map_events  => '/news_events_maps',
      :map_filters => '/map_filter_parameters'
    }

    def search(params)
      api(ENDPOINTS[:maps], params)
    end

    def params
      api(ENDPOINTS[:map_filters])[0]
    end
  end
end