Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ GEM
ethon (0.7.0)
ffi (>= 1.3.0)
ffi (1.9.3)
json (1.7.7)
json (2.0.3)
rspec (2.13.0)
rspec-core (~> 2.13.0)
rspec-expectations (~> 2.13.0)
Expand All @@ -24,3 +24,6 @@ DEPENDENCIES
json
rspec
typhoeus

BUNDLED WITH
1.14.6
52 changes: 26 additions & 26 deletions lib/canvas-api.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,40 +6,40 @@

module Canvas
class API
def initialize(args={})
def initialize(args={})
@host = args[:host] && args[:host].to_s
@token = args[:token] && args[:token].to_s
@client_id = args[:client_id] && args[:client_id].to_s
@secret = args[:secret] && args[:secret].to_s
@insecure = !!args[:insecure]
raise "host required" unless @host
raise "invalid host, protocol required" unless @host.match(/^http/)
raise "invalid host" unless @host.match(/^https?:\/\/[^\/]+$/)
raise "invalid host (try changing to #{host.match(/^https?:\/\/[^\/]+/)})" unless @host.match(/^https?:\/\/[^\/]+$/)
raise "token or client_id required" if !@token && !@client_id
raise "secret required for client_id configuration" if @client_id && !@secret
end

attr_accessor :host
attr_accessor :token
attr_accessor :client_id

def masquerade_as(user_id)
@as_user_id = user_id && user_id.to_s
end

def stop_masquerading
@as_user_id = nil
end

def self.encode_id(prefix, id)
return nil unless prefix && id
"hex:#{prefix}:" + id.to_s.unpack("H*")[0]
end

def encode_id(prefix, id)
Canvas::API.encode_id(prefix, id)
end

def oauth_url(callback_url, scopes="")
raise "client_id required for oauth flow" unless @client_id
raise "secret required for oauth flow" unless @secret
Expand All @@ -49,11 +49,11 @@ def oauth_url(callback_url, scopes="")
scopes = scopes.length > 0 ? "&scopes=#{CGI.escape(scopes)}" : ""
"#{@host}/login/oauth2/auth?client_id=#{@client_id}&response_type=code&redirect_uri=#{CGI.escape(callback_url)}#{scopes}"
end

def login_url(callback_url)
oauth_url(callback_url, "/auth/userinfo")
end

def retrieve_access_token(code, callback_url)
raise "client_id required for oauth flow" unless @client_id
raise "secret required for oauth flow" unless @secret
Expand All @@ -67,11 +67,11 @@ def retrieve_access_token(code, callback_url)
end
res
end

def logout
!!delete("/login/oauth2/token")['logged_out']
end

def validate_call(endpoint)
raise "token required for api calls" unless @token
raise "missing host" unless @host
Expand All @@ -80,7 +80,7 @@ def validate_call(endpoint)
raise "invalid endpoint" unless endpoint.match(/^\/api\/v\d+\//) unless @token == 'ignore'
raise "invalid endpoint" unless (URI.parse(endpoint) rescue nil)
end

def generate_uri(endpoint, params=nil)
validate_call(endpoint)
unless @token == "ignore"
Expand All @@ -102,7 +102,7 @@ def generate_uri(endpoint, params=nil)
@http.use_ssl = @uri.scheme == 'https'
@uri
end

def retrieve_response(request)
request.options[:headers]['User-Agent'] = "CanvasAPI Ruby"
if @insecure
Expand All @@ -122,7 +122,7 @@ def retrieve_response(request)
if !response.code.to_s.match(/2\d\d/)
json['message'] ||= "unexpected error"
json['status'] ||= response.code.to_s
raise ApiError.new("#{json['status']} #{json['message']}")
raise ApiError.new("#{json['status']} #{json['message']}")
end
else
json = ResultSet.new(self, json)
Expand All @@ -133,12 +133,12 @@ def retrieve_response(request)
end
json
end

# Semi-hack so I can write better specs
def get_request(endpoint)
Typhoeus::Request.new(@uri.to_s, method: :get)
end

def get(endpoint, params=nil)
generate_uri(endpoint, params)
request = get_request(endpoint)
Expand All @@ -152,15 +152,15 @@ def delete(endpoint, params={})
request.options[:body] = clean_params(params)
retrieve_response(request)
end

def put(endpoint, params={})
query_parameters = params.is_a?(Hash) ? params['query_parameters'] || params[:query_parameters] : {}
generate_uri(endpoint, query_parameters)
request = Typhoeus::Request.new(@uri.to_s, method: :put)
request.options[:body] = clean_params(params)
retrieve_response(request)
end

def post(endpoint, params={})
query_parameters = params.is_a?(Hash) ? params['query_parameters'] || params[:query_parameters] : {}
generate_uri(endpoint, query_parameters)
Expand Down Expand Up @@ -198,7 +198,7 @@ def clean_params(params, prefix=nil)
end
res
end

def upload_file_from_local(endpoint, file, opts={})
raise "Missing File object" unless file.is_a?(File)
params = {
Expand All @@ -212,7 +212,7 @@ def upload_file_from_local(endpoint, file, opts={})
elsif opts[:parent_folder_path] || opts['parent_folder_path']
params[:parent_folder_path] = opts[:parent_folder_path] || opts['parent_folder_path']
end

res = post(endpoint, params)
if !res['upload_url']
raise ApiError.new("Unexpected error: #{res['message'] || 'no upload URL returned'}")
Expand All @@ -222,7 +222,7 @@ def upload_file_from_local(endpoint, file, opts={})
res = get(status_path)
res
end

def multipart_upload(url, upload_params, params, file)
req = Typhoeus::Request.new(url, method: :post)
upload_params.each do |k, v|
Expand All @@ -235,7 +235,7 @@ def multipart_upload(url, upload_params, params, file)
raise ApiError.new("Unexpected error: #{res.body}") if !res.headers['Location']
res.headers['Location']
end

def upload_file_from_url(endpoint, opts)
asynch = opts.delete('asynch') || opts.delete(:asynch)
['url', 'name', 'size'].each do |k|
Expand Down Expand Up @@ -277,11 +277,11 @@ def initialize(api, arr)
end
attr_accessor :next_endpoint
attr_accessor :link

def more?
!!next_endpoint
end

def next_page!
ResultSet.new(@api, []) unless next_endpoint
more = @api.get(next_endpoint)
Expand Down Expand Up @@ -321,4 +321,4 @@ def recursively_generate_pairs(h, prefix, pairs)
end
end
end
end
end
12 changes: 6 additions & 6 deletions spec/init_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,23 +5,23 @@
expect { Canvas::API.new }.to raise_error(RuntimeError, "host required")
expect { Canvas::API.new(:host => nil) }.to raise_error(RuntimeError, "host required")
end

it "should error if invalid host provided" do
expect { Canvas::API.new(:host => "canvas.example.com") }.to raise_error(RuntimeError, "invalid host, protocol required")
expect { Canvas::API.new(:host => "ftp://canvas.example.com") }.to raise_error(RuntimeError, "invalid host, protocol required")
expect { Canvas::API.new(:host => "http://canvas.example.com/") }.to raise_error(RuntimeError, "invalid host")
expect { Canvas::API.new(:host => "http://canvas.example.com/") }.to raise_error(RuntimeError, "invalid host")
expect { Canvas::API.new(:host => "http://canvas.example.com/") }.to raise_error(RuntimeError, "invalid host (try changing to http://canvas.example.com)")
expect { Canvas::API.new(:host => "http://canvas.example.com/") }.to raise_error(RuntimeError, "invalid host (try changing to http://canvas.example.com)")
end

it "should error if no token or client id provided" do
expect { Canvas::API.new(:host => "http://canvas.example.com") }.to raise_error(RuntimeError, "token or client_id required")
expect { Canvas::API.new(:host => "http://canvas.example.com", :token => nil) }.to raise_error(RuntimeError, "token or client_id required")
end

it "should accept valid configurations" do
expect { Canvas::API.new(:host => "http://canvas.example.com", :token => "abc") }.to_not raise_error
expect { Canvas::API.new(:host => "http://canvas.api.of.coolness.example.com", :client_id => 123) }.to raise_error(RuntimeError, "secret required for client_id configuration")
expect { Canvas::API.new(:host => "http://canvas.api.of.coolness.example.com", :client_id => 123, :secret => "abc") }.to_not raise_error
end
end

end