Commit b99e9ae2 by Nimisha Asthagiri

Block Transformers: Transformers Version Hash

TNL-6519
parent 71cce9bb
...@@ -3,13 +3,14 @@ Test helpers for testing course block transformers. ...@@ -3,13 +3,14 @@ Test helpers for testing course block transformers.
""" """
from mock import patch from mock import patch
from course_modes.models import CourseMode from course_modes.models import CourseMode
from lms.djangoapps.courseware.access import has_access
from openedx.core.lib.block_structure.transformers import BlockStructureTransformers from openedx.core.lib.block_structure.transformers import BlockStructureTransformers
from openedx.core.lib.block_structure.tests.helpers import clear_registered_transformers_cache
from student.tests.factories import CourseEnrollmentFactory, UserFactory from student.tests.factories import CourseEnrollmentFactory, UserFactory
from xmodule.modulestore import ModuleStoreEnum from xmodule.modulestore import ModuleStoreEnum
from xmodule.modulestore.django import modulestore from xmodule.modulestore.django import modulestore
from xmodule.modulestore.tests.factories import CourseFactory, ItemFactory from xmodule.modulestore.tests.factories import CourseFactory, ItemFactory
from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase
from lms.djangoapps.courseware.access import has_access
from ...api import get_course_blocks from ...api import get_course_blocks
...@@ -30,6 +31,7 @@ class TransformerRegistryTestMixin(object): ...@@ -30,6 +31,7 @@ class TransformerRegistryTestMixin(object):
def tearDown(self): def tearDown(self):
self.patcher.stop() self.patcher.stop()
clear_registered_transformers_cache()
class CourseStructureTestCase(TransformerRegistryTestMixin, ModuleStoreTestCase): class CourseStructureTestCase(TransformerRegistryTestMixin, ModuleStoreTestCase):
......
...@@ -7,6 +7,7 @@ from xmodule.modulestore.exceptions import ItemNotFoundError ...@@ -7,6 +7,7 @@ from xmodule.modulestore.exceptions import ItemNotFoundError
from ..block_structure import BlockStructureBlockData from ..block_structure import BlockStructureBlockData
from ..transformer import BlockStructureTransformer, FilteringTransformerMixin from ..transformer import BlockStructureTransformer, FilteringTransformerMixin
from ..transformer_registry import TransformerRegistry
class MockXBlock(object): class MockXBlock(object):
...@@ -164,11 +165,19 @@ class MockFilteringTransformer(FilteringTransformerMixin, BlockStructureTransfor ...@@ -164,11 +165,19 @@ class MockFilteringTransformer(FilteringTransformerMixin, BlockStructureTransfor
return [block_structure.create_universal_filter()] return [block_structure.create_universal_filter()]
def clear_registered_transformers_cache():
"""
Test helper to clear out any cached values of registered transformers.
"""
TransformerRegistry.get_write_version_hash.cache.clear()
@contextmanager @contextmanager
def mock_registered_transformers(transformers): def mock_registered_transformers(transformers):
""" """
Context manager for mocking the transformer registry to return the given transformers. Context manager for mocking the transformer registry to return the given transformers.
""" """
clear_registered_transformers_cache()
with patch( with patch(
'openedx.core.lib.block_structure.transformer_registry.TransformerRegistry.get_registered_transformers' 'openedx.core.lib.block_structure.transformer_registry.TransformerRegistry.get_registered_transformers'
) as mock_available_transforms: ) as mock_available_transforms:
......
...@@ -7,7 +7,7 @@ from nose.plugins.attrib import attr ...@@ -7,7 +7,7 @@ from nose.plugins.attrib import attr
from unittest import TestCase from unittest import TestCase
from ..transformer_registry import TransformerRegistry from ..transformer_registry import TransformerRegistry
from .helpers import MockTransformer, mock_registered_transformers from .helpers import MockTransformer, mock_registered_transformers, clear_registered_transformers_cache
class TestTransformer1(MockTransformer): class TestTransformer1(MockTransformer):
...@@ -37,6 +37,10 @@ class TransformerRegistryTestCase(TestCase): ...@@ -37,6 +37,10 @@ class TransformerRegistryTestCase(TestCase):
""" """
Test cases for TransformerRegistry. Test cases for TransformerRegistry.
""" """
def tearDown(self):
super(TransformerRegistryTestCase, self).tearDown()
clear_registered_transformers_cache()
@ddt.data( @ddt.data(
# None case # None case
([], []), ([], []),
...@@ -61,3 +65,18 @@ class TransformerRegistryTestCase(TestCase): ...@@ -61,3 +65,18 @@ class TransformerRegistryTestCase(TestCase):
TransformerRegistry.find_unregistered(transformers), TransformerRegistry.find_unregistered(transformers),
set(expected_unregistered), set(expected_unregistered),
) )
def test_write_version_hash(self):
# hash with TestTransformer1
with mock_registered_transformers([TestTransformer1]):
version_hash_1 = TransformerRegistry.get_write_version_hash()
self.assertEqual(version_hash_1, '+2nc5o2YRerVfAtItQBQ/6jVkkw=')
# should return the same value again
self.assertEqual(version_hash_1, TransformerRegistry.get_write_version_hash())
# hash with TestTransformer1 and TestTransformer2
with mock_registered_transformers([TestTransformer1, TestTransformer2]):
version_hash_2 = TransformerRegistry.get_write_version_hash()
self.assertEqual(version_hash_2, '5GwhvmSM9hknjUslzPnKDA5QaCo=')
self.assertNotEqual(version_hash_1, version_hash_2)
...@@ -59,7 +59,7 @@ class TestBlockStructureTransformers(ChildrenMapTestMixin, TestCase): ...@@ -59,7 +59,7 @@ class TestBlockStructureTransformers(ChildrenMapTestMixin, TestCase):
with patch( with patch(
'openedx.core.lib.block_structure.tests.helpers.MockTransformer.collect' 'openedx.core.lib.block_structure.tests.helpers.MockTransformer.collect'
) as mock_collect_call: ) as mock_collect_call:
self.transformers.collect(block_structure=MagicMock()) BlockStructureTransformers.collect(block_structure=MagicMock())
self.assertTrue(mock_collect_call.called) self.assertTrue(mock_collect_call.called)
def test_transform(self): def test_transform(self):
......
...@@ -2,7 +2,11 @@ ...@@ -2,7 +2,11 @@
Block Structure Transformer Registry implemented using the platform's Block Structure Transformer Registry implemented using the platform's
PluginManager. PluginManager.
""" """
from base64 import b64encode
from hashlib import sha1
from openedx.core.lib.api.plugins import PluginManager from openedx.core.lib.api.plugins import PluginManager
from openedx.core.lib.cache_utils import memoized
class TransformerRegistry(PluginManager): class TransformerRegistry(PluginManager):
...@@ -31,6 +35,22 @@ class TransformerRegistry(PluginManager): ...@@ -31,6 +35,22 @@ class TransformerRegistry(PluginManager):
return set() return set()
@classmethod @classmethod
@memoized
def get_write_version_hash(cls):
"""
Returns a deterministic hash value of the WRITE_VERSION of all
registered transformers.
"""
hash_obj = sha1()
sorted_transformers = sorted(cls.get_registered_transformers(), key=lambda t: t.name())
for transformer in sorted_transformers:
hash_obj.update(transformer.name().encode('utf-8'))
hash_obj.update(str(transformer.WRITE_VERSION))
return b64encode(hash_obj.digest())
@classmethod
def find_unregistered(cls, transformers): def find_unregistered(cls, transformers):
""" """
Find and returns the names of all the transformers from the Find and returns the names of all the transformers from the
......
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