class Coursera::CourseraApi

This class is in charge of the work involving using Coursera API

Constants

BATCH_SIZE
COURSERA_CATOLOG_API_URL

Public Class Methods

courses() click to toggle source
# File lib/share_learning/coursera_api.rb, line 15
def self.courses
  return @courses if @courses
  @courses = retrieve_all_courses
end
total_course_num() click to toggle source
# File lib/share_learning/coursera_api.rb, line 11
def self.total_course_num
  @total_course_num = retrieve_total_course_num
end

Private Class Methods

new_batch_merged(retrieved_courses, course_start) click to toggle source
# File lib/share_learning/coursera_api.rb, line 55
def self.new_batch_merged(retrieved_courses, course_start)
  # Use the API to get courses response on Coursera
  retrieved_batch =
    query_a_batch_of_courses(course_start)
  # Parse the response to get the desired courses data
  parsed_batch = parse_batch_result(course_start, retrieved_batch)
  # Merge the parsed batch of courses
  retrieved_courses.merge(parsed_batch)
end
number_of_batches() click to toggle source
# File lib/share_learning/coursera_api.rb, line 49
def self.number_of_batches
  result = retrieve_total_course_num / BATCH_SIZE
  result += 1 unless (@total_course_num % BATCH_SIZE).zero?
  result
end
parse_batch_result(course_start, retrieved_batch) click to toggle source
# File lib/share_learning/coursera_api.rb, line 78
def self.parse_batch_result(course_start, retrieved_batch)
  # Create an parsed dump
  parsed_courses = {}
  count = course_start
  retrieved_batch[:courses].each do |course|
    parsed_courses[count] = parse_course(course)
    count += 1
  end
  parsed_courses
end
parse_course(course) click to toggle source
# File lib/share_learning/coursera_api.rb, line 89
def self.parse_course(course)
  parsed_course = {}
  parsed_course[:course_type] = course['courseType']
  parsed_course[:course_id] = course['id']
  parsed_course[:course_slug] = course['slug']
  parsed_course[:course_name] = course['name']
  parsed_course[:link] =
    COURSERA_COURSE_LINK_BASE + course['slug']
  parsed_course[:description] = course['description']
  parsed_course[:photo_url] = course['photoUrl']
  parsed_course
end
query_a_batch_of_courses(course_start) click to toggle source
# File lib/share_learning/coursera_api.rb, line 65
def self.query_a_batch_of_courses(course_start)
  # Create an API response dump
  retrieved_batch = {}
  query_response =
    HTTP.get(COURSERA_CATOLOG_API_URL,
             params: { start: course_start,
                       limit: BATCH_SIZE,
                       fields: 'description,photoUrl' })
  body_str = query_response.body.to_s
  retrieved_batch[:courses] = JSON.parse(body_str)['elements']
  retrieved_batch
end
retrieve_all_courses() click to toggle source
# File lib/share_learning/coursera_api.rb, line 32
def self.retrieve_all_courses
  # Create an dump for retrieved courses
  retrieved_courses = {}
  # Set the relating numbers
  batch_start = 0
  # Retrieve courses batch by batch
  number_of_batches.times do
    # Jump out the loop if we know there is not any courses left
    break if batch_start >= @total_course_num

    retrieved_courses = new_batch_merged(retrieved_courses, batch_start)
    # Increase the course number to start with next batch
    batch_start += BATCH_SIZE
  end
  retrieved_courses
end
retrieve_total_course_num() click to toggle source
# File lib/share_learning/coursera_api.rb, line 20
def self.retrieve_total_course_num
  return @total_course_num if @total_course_num
  # Retrieve the total number of courses on the catlog
  course_start_num = 0
  course_num_limit = 0
  query_response =
    HTTP.get(COURSERA_CATOLOG_API_URL,
             params: { start: course_start_num,
                       limit: course_num_limit })
  JSON.parse(query_response.body.to_s)['paging']['total']
end