Sha256: 9a6fbfa377db440ea14479c8a8565e897b0432fa389653a251a9404c802dfc09

Contents?: true

Size: 1.45 KB

Versions: 4

Compression:

Stored size: 1.45 KB

Contents

module Clever
  # Superclass of API resources in the Clever API
  class APIResource < CleverObject
    def self.url
      if self == APIResource
        fail NotImplementedError, 'APIResource is an abstract class. You should perform actions '\
          'on its subclasses (School, Student, etc.)'
      end
      shortname = name.split('::')[-1]
      "v1.1/#{CGI.escape shortname.downcase}s"
    end

    def url
      id = self['id']
      unless id
        fail InvalidRequestError.new(
          "Could not determine which URL to request: #{self.class} instance has " \
          "invalid ID: #{id.inspect}", 'id')
      end
      "#{self.class.url}/#{CGI.escape id}"
    end

    def refresh
      response = Clever.request :get, url
      refresh_from response[:data]
      self
    end

    def links
      response = Clever.request :get, url
      response[:links]
    end

    def self.retrieve(id)
      instance = new id
      instance.refresh
      instance
    end

    def get_linked_resources(resource_type, filters = {})
      Util.convert_to_clever_object Clever.request(:get, get_uri(resource_type), filters)[:data]
    end

    class << self; attr_reader :linked_resources; end
    def initialize(id)
      super id

      resources = self.class.linked_resources || []
      resources.each do |resource|
        self.class.send :define_method, resource do |filters = {}|
          get_linked_resources resource.to_s, filters
        end
      end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
clever-ruby-0.6.0 lib/clever-ruby/api_resource.rb
clever-ruby-0.5.0 lib/clever-ruby/api_resource.rb
clever-ruby-0.4.1 lib/clever-ruby/api_resource.rb
clever-ruby-0.4.0 lib/clever-ruby/api_resource.rb