Skip to content

Commit

Permalink
Add new XBlock runtime service 'MilestonesService'
Browse files Browse the repository at this point in the history
  • Loading branch information
kevinjkim committed Jul 19, 2016
1 parent d63216f commit 8313a28
Show file tree
Hide file tree
Showing 3 changed files with 84 additions and 1 deletion.
46 changes: 46 additions & 0 deletions milestones/services.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
"""
A wrapper class around requested methods exposed in api.py
"""

import types

from milestones import api as milestones_api


class MilestonesService(object): # pylint: disable=too-few-public-methods
"""
An xBlock service for xBlocks to talk to the Milestones subsystem.
NOTE: This is a Singleton class. We should only have one instance of it!
"""

_instance = None

REQUESTED_FUNCTIONS = [
'get_course_content_milestones',
]

def __new__(cls, *args, **kwargs):
"""
This is the class factory to make sure this is a Singleton
"""
if not cls._instance:
cls._instance = super(MilestonesService, cls).__new__(cls, *args, **kwargs)
return cls._instance

def __init__(self):
"""
Class initializer, which just inspects the libraries and exposes the same functions
listed in REQUESTED_FUNCTIONS
"""
self._bind_to_requested_functions()

def _bind_to_requested_functions(self):
"""
bind module functions. Since we use underscores to mean private methods, let's exclude those.
"""
for attr_name in self.REQUESTED_FUNCTIONS:
attr = getattr(milestones_api, attr_name, None)
if isinstance(attr, types.FunctionType) and not attr_name.startswith('_'):
if not hasattr(self, attr_name):
setattr(self, attr_name, attr)
37 changes: 37 additions & 0 deletions milestones/tests/test_services.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
"""
Test for the xBlock service
"""

import unittest
import types

from milestones.services import MilestonesService
from milestones import api as milestones_api


class TestMilestonesService(unittest.TestCase): # pylint: disable=too-many-public-methods
"""
Tests for MilestonesService
"""
def test_basic(self):
"""
See if the MilestonesService exposes the expected methods
"""

service = MilestonesService()

for attr_name in dir(milestones_api):
attr = getattr(milestones_api, attr_name, None)
if isinstance(attr, types.FunctionType) and not attr_name.startswith('_'):
if attr_name in MilestonesService.REQUESTED_FUNCTIONS:
self.assertTrue(hasattr(service, attr_name))
else:
self.assertFalse(hasattr(service, attr_name))

def test_singleton(self):
"""
Test to make sure the MilestonesService is a singleton.
"""
service1 = MilestonesService()
service2 = MilestonesService()
self.assertIs(service1, service2)
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

setup(
name='edx-milestones',
version='0.1.8',
version='0.1.9',
description='Significant events module for Open edX',
long_description=open('README.md').read(),
author='edX',
Expand Down

0 comments on commit 8313a28

Please sign in to comment.