Commit 509ae29d by Dennis Jen Committed by GitHub

Added course summaries endpoint. (#29)

* Added course summaries endpoint.
parent fb3e1d47
...@@ -5,6 +5,7 @@ import requests.exceptions ...@@ -5,6 +5,7 @@ import requests.exceptions
from analyticsclient.constants import data_format as DF from analyticsclient.constants import data_format as DF
from analyticsclient.course import Course from analyticsclient.course import Course
from analyticsclient.course_summaries import CourseSummaries
from analyticsclient.exceptions import ClientError, InvalidRequestError, NotFoundError, TimeoutError from analyticsclient.exceptions import ClientError, InvalidRequestError, NotFoundError, TimeoutError
from analyticsclient.module import Module from analyticsclient.module import Module
from analyticsclient.status import Status from analyticsclient.status import Status
...@@ -40,6 +41,7 @@ class Client(object): ...@@ -40,6 +41,7 @@ class Client(object):
self.timeout = timeout self.timeout = timeout
self.status = Status(self) self.status = Status(self)
self.course_summaries = lambda: CourseSummaries(self)
self.courses = lambda course_id: Course(self, course_id) self.courses = lambda course_id: Course(self, course_id)
self.modules = lambda course_id, module_id: Module(self, course_id, module_id) self.modules = lambda course_id, module_id: Module(self, course_id, module_id)
......
import urllib
import analyticsclient.constants.data_format as DF
class CourseSummaries(object):
"""Course summaries."""
def __init__(self, client):
"""
Initialize the CourseSummaries client.
Arguments:
client (analyticsclient.client.Client): The client to use to access remote resources.
"""
self.client = client
def course_summaries(self, course_ids=None, fields=None, data_format=DF.JSON):
"""
Get list of summaries.
Arguments:
course_ids: Array of course IDs as strings to return. Default is to return all.
fields: Array of fields to return. Default is to return all.
"""
query_params = {}
for query_arg, data in zip(['course_ids', 'fields'], [course_ids, fields]):
if data:
query_params[query_arg] = ','.join(data)
path = 'course_summaries/'
querystring = urllib.urlencode(query_params)
if querystring:
path += '?{0}'.format(querystring)
return self.client.get(path, data_format=data_format)
import ddt
import httpretty
from analyticsclient.tests import ClientTestCase
@ddt.ddt
class CourseSummariesTests(ClientTestCase):
def setUp(self):
super(CourseSummariesTests, self).setUp()
self.base_uri = self.get_api_url('course_summaries/')
self.course_summaries_client = self.client.course_summaries()
httpretty.enable()
def verify_last_querystring_equal(self, expected_query):
"""
Convenience method for asserting the last request was made with the
expected query parameters.
"""
self.assertDictEqual(httpretty.last_request().querystring, expected_query)
def expected_query(self, course_ids=None, fields=None):
"""Packs the query arguments into expected format for http pretty."""
query = {}
for field, data in zip(['course_ids', 'fields'], [course_ids, fields]):
if data is not None:
query[field] = [','.join(data)]
return query
@httpretty.activate
def test_all_summaries_url(self):
"""Course summaries can be called without parameters."""
httpretty.register_uri(httpretty.GET, self.base_uri, body='{}')
self.course_summaries_client.course_summaries()
@httpretty.activate
@ddt.data(
['edx/demo/course'],
['edx/demo/course', 'another/demo/course']
)
def test_courses_ids(self, course_ids):
"""Course summaries can be called with course IDs"""
uri_template = '{uri}?course_ids={ids}'
uri = uri_template.format(uri=self.base_uri, ids=course_ids)
httpretty.register_uri(httpretty.GET, uri, body='{}')
self.course_summaries_client.course_summaries(course_ids=course_ids)
self.verify_last_querystring_equal(self.expected_query(course_ids=course_ids))
@httpretty.activate
@ddt.data(
['course_id'],
['course_id', 'enrollment_modes']
)
def test_fields(self, fields):
"""Course summaries can be called with fields."""
uri_template = '{uri}?fields={fields}'
uri = uri_template.format(uri=self.base_uri, fields=fields[0])
httpretty.register_uri(httpretty.GET, uri, body='{}')
self.course_summaries_client.course_summaries(fields=fields)
self.verify_last_querystring_equal(self.expected_query(fields=fields))
@httpretty.activate
@ddt.data(
(['edx/demo/course'], ['course_id']),
(['edx/demo/course', 'another/demo/course'], ['course_id', 'enrollment_modes'])
)
@ddt.unpack
def test_all_parameters(self, course_ids, fields):
"""Course summaries can be called with both fields and course IDs."""
httpretty.reset()
uri_template = '{uri}?course_ids={ids}fields={fields}'
uri = uri_template.format(uri=self.base_uri, ids=course_ids, fields=fields)
httpretty.register_uri(httpretty.GET, uri, body='{}')
self.course_summaries_client.course_summaries(course_ids=course_ids, fields=fields)
self.verify_last_querystring_equal(self.expected_query(course_ids=course_ids, fields=fields))
...@@ -2,6 +2,7 @@ requests==2.2.0 ...@@ -2,6 +2,7 @@ requests==2.2.0
# Testing # Testing
coverage==3.7.1 coverage==3.7.1
ddt==1.1.1
nose==1.3.3 nose==1.3.3
httpretty==0.8.0 httpretty==0.8.0
pep8==1.7.0 pep8==1.7.0
......
...@@ -2,7 +2,7 @@ from distutils.core import setup ...@@ -2,7 +2,7 @@ from distutils.core import setup
setup( setup(
name='edx-analytics-data-api-client', name='edx-analytics-data-api-client',
version='0.9.0', version='0.10.0',
packages=['analyticsclient', 'analyticsclient.constants'], packages=['analyticsclient', 'analyticsclient.constants'],
url='https://github.com/edx/edx-analytics-data-api-client', url='https://github.com/edx/edx-analytics-data-api-client',
description='Client used to access edX analytics data warehouse', description='Client used to access edX analytics data warehouse',
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment