class TestLocator(TestCase): ''' Test the locator via the assembler. ''' class UnknownEntity(object): pass def setUp(self): self.locator = Locator() self.transformer = Transformer(self.locator) self.assembler = Assembler(self.transformer) def tearDown(self): del self.locator del self.transformer del self.assembler def test_checker(self): entity = self.__make_good_entity() self.assertFalse(self.locator.has('poo')) self.assertRaises(UnknownEntityError, self.locator.get, ('poo')) def test_before_activation(self): entity = self.__make_good_entity() self.locator.set('poo', entity) self.assertTrue(self.locator.has('poo')) self.assertFalse(entity.activated) def test_after_activation(self): entity = self.__make_good_entity() self.locator.set('poo', entity) self.assertIsInstance(self.locator.get('poo'), PlainOldObject) self.assertTrue(entity.activated) def test_good_locator_xml_on_entity_registration(self): self.__prepare_good_locator_from_xml() self.assertTrue(self.locator.has('poo')) self.assertTrue(self.locator.has('poow-1')) self.assertTrue(self.locator.has('poow-2')) self.assertTrue(self.locator.has('dioc')) self.assertTrue(self.locator.has('dioe')) def test_good_locator_xml_on_class_injection(self): self.__prepare_good_locator_from_xml() self.assertEqual(self.locator.get('dioc').r, PlainOldObject) def test_good_locator_xml_on_class_injection(self): self.__prepare_good_locator_from_xml() self.assertIsInstance(self.locator.get('dioe').e, PlainOldObjectWithParameters) def test_entities_with_same_class(self): self.__prepare_good_locator_from_xml() self.assertIsInstance(self.locator.get('poow-1'), PlainOldObjectWithParameters) self.assertIsInstance(self.locator.get('poow-2'), PlainOldObjectWithParameters) self.assertNotEquals(self.locator.get('poow-1').method(), self.locator.get('poow-2').method()) self.assertEquals('%.2f' % self.locator.get('poow-1').method(), '0.67') self.assertEquals(self.locator.get('poow-2').method(), 35) def __make_good_entity(self): return Entity( 'poo', Loader('dummy.core.PlainOldObject') ) def __get_data_path(self, filename): return abspath(join(dirname(__file__), '..', 'data', filename)) def __load_from_xml(self, path_from_data): test_file = self.__get_data_path(path_from_data) self.assembler.load(test_file) def __prepare_good_locator_from_xml(self): self.__load_from_xml('locator.xml')
class Container(object): def __init__(self, locator=None): self.logger = get_logger('{}.{}'.format(__name__, self.__class__.__name__)) self.locator = Locator() self.transformer = Transformer(self.locator) self.assembler = Assembler(self.transformer) self.default_services = [ ('finder', 'tori.common.Finder', [], {}), ('renderer', 'tori.template.service.RenderingService', [], {}), ('db', 'passerine.db.manager.ManagerFactory', [], {}) ] self.cache_map = None self._register_default_services() @contextmanager def passive_mode(self): self.assembler.activate_passive_loading() yield self.assembler.deactivate_passive_loading() def get(self, id): return self.locator.get(id) def load(self, *paths): with self.passive_mode(): [ self.assembler.load(path) for path in paths ] self.cache_map = None def all(self): if not self.cache_map: self.cache_map = { i: self.locator.get(i) for i in self.locator.entity_identifiers } return self.cache_map def _register_default_services(self): for entity_id, package_path, args, kwargs in self.default_services: try: entity = self._create_entity(entity_id, package_path, *args, **kwargs) self.locator.set(entity_id, entity) except ImportError as exception: if entity_id == "db": self.logger.info('Ignored {} as package "passerine" is neither available or loadable (containing errors).'.format(package_path)) continue raise ImportError('Failed to register {} ({})'.format(entity_id, package_path)) def _create_entity(self, id, package_path, *args, **kwargs): loader = Loader(package_path) return Entity(id, loader, *args, **kwargs)