def registerServices(self, services): ''' Register the services. ''' if not self.done: self.done = True if checkIf(self.resolvers, LIST_UNAVAILABLE): raise AssemblyError('Injected assembly \'%s\' has unavailable attributes:\n%s' % (self.assembly.name, reportFor(self.resolvers, LIST_UNAVAILABLE))) solve(self.resolvers, self.extensions) self.processing = Processing(self.calls, create(self.resolvers)) reportAss = self.report.open('injected assembly \'%s\'' % self.assembly.name) reportAss.add(self.resolvers) if self.assembly.reportUnused: message = self.report.report() if message: log.info('\n%s\n' % message) else: log.info('Nothing to report for \'%s\', everything fits nicely', self.assembly.name) # We clean up the data that is not needed anymore del self.resolvers del self.extensions del self.wrappers del self.calls del self.report exclude, aborted = set(), 0 while True: suggestions = [] register = self.processing.ctx.register(services=iter(services), exclude=exclude, doSuggest=lambda *args: suggestions.append(args)) try: self.assembled = self.processing.execute(FILL_ALL, register=register) break except Abort as e: assert isinstance(e, Abort) found = set() for reason in e.reasons: if isinstance(reason, Invoker): assert isinstance(reason, Invoker) assert isinstance(reason.id, str), 'Invalid invoker id %s' % reason.id if reason.id in exclude: log.error('Already excluded %s', reason) return found.add(reason.id) if not found: log.error('Could not locate any invoker reason in %s', e.reasons) return exclude.update(found) aborted += 1 log.info('Finalized assemblers after %i aborts' % aborted) if suggestions: log.warn('Available suggestions:\n%s', '\n'.join(suggest[0] % suggest[1:] for suggest in suggestions))
class C(Context): p2 = defines(int) class D(Context): p2 = defines(str) class F(D): p3 = defines(str) class E(F, D): p2 = optional(str) p3 = optional(str) resolvers = resolversFor(dict(I=B)) merge(resolvers, dict(I=F)) ctx = create(resolvers) I = ctx['I'] # -------------------------------------------------------------------- class TestDesign(unittest.TestCase): def testContext(self): i = I() self.assertIsInstance(i, Context) self.assertNotIsInstance(i, A) self.assertIsInstance(i, B) self.assertNotIsInstance(i, C) self.assertIsInstance(i, D) self.assertIsInstance(i, F) self.assertIsInstance(i, E)
The invoker to be used for calling the service. ''') class Response(Context): ''' The response context. ''' # ---------------------------------------------------------------- Defined code = defines(str) status = defines(int) isSuccess = defines(bool) allows = defines(list, doc=''' @rtype: list[string] Contains the allow list for the methods. ''') ctx = create(Resolvers(contexts=dict(Request=Request, Response=Response))) Request, Response = ctx['Request'], ctx['Response'] # -------------------------------------------------------------------- class TestMethodInvoker(unittest.TestCase): def testMethodInvoker(self): handler = MethodInvokerHandler() ioc.initialize(handler) request, response = Request(), Response() node = NodeRoot() request.method, request.path = HTTP_GET, Path([], node) def callProcess(chain, **keyargs): handler.process(**keyargs)
class D(Context): p2 = defines(str) class F(D): p3 = defines(str) class E(F, D): p2 = optional(str) p3 = optional(str) resolvers = resolversFor(dict(I=B)) merge(resolvers, dict(I=F)) ctx = create(resolvers) I = ctx['I'] # -------------------------------------------------------------------- class TestDesign(unittest.TestCase): def testContext(self): i = I() self.assertIsInstance(i, Context) self.assertNotIsInstance(i, A) self.assertIsInstance(i, B) self.assertNotIsInstance(i, C) self.assertIsInstance(i, D) self.assertIsInstance(i, F) self.assertIsInstance(i, E)
class Response(Context): ''' The response context. ''' # ---------------------------------------------------------------- Defined code = defines(str) status = defines(int) isSuccess = defines(bool) allows = defines(list, doc=''' @rtype: list[string] Contains the allow list for the methods. ''') ctx = create(Resolvers(contexts=dict(Request=Request, Response=Response))) Request, Response = ctx['Request'], ctx['Response'] # -------------------------------------------------------------------- class TestMethodInvoker(unittest.TestCase): def testMethodInvoker(self): handler = MethodInvokerHandler() ioc.initialize(handler) request, response = Request(), Response() node = NodeRoot() request.method, request.path = HTTP_GET, Path([], node) def callProcess(chain, **keyargs):
from ally.core.spec.resources import Normalizer, Converter from ally.design.processor.attribute import defines from ally.design.processor.context import Context, create from ally.design.processor.execution import Chain from ally.design.processor.spec import Resolvers import unittest # -------------------------------------------------------------------- class Content(Context): normalizer = defines(Normalizer) converter = defines(Converter) ctx = create(Resolvers(contexts=dict(Content=Content))) Content = ctx['Content'] # -------------------------------------------------------------------- class TestTextConversion(unittest.TestCase): def testTextConversion(self): handler = ConversionSetHandler() handler.normalizer = Normalizer() handler.converter = Converter() ioc.initialize(handler) requestCnt, response = Content(), Content() def callProcess(chain, **keyargs):
def registerServices(self, services): ''' Register the services. ''' if not self.done: self.done = True if checkIf(self.resolvers, LIST_UNAVAILABLE): raise AssemblyError( 'Injected assembly \'%s\' has unavailable attributes:\n%s' % (self.assembly.name, reportFor(self.resolvers, LIST_UNAVAILABLE))) solve(self.resolvers, self.extensions) self.processing = Processing(self.calls, create(self.resolvers)) reportAss = self.report.open('injected assembly \'%s\'' % self.assembly.name) reportAss.add(self.resolvers) if self.assembly.reportUnused: message = self.report.report() if message: log.info('\n%s\n' % message) else: log.info( 'Nothing to report for \'%s\', everything fits nicely', self.assembly.name) # We clean up the data that is not needed anymore del self.resolvers del self.extensions del self.wrappers del self.calls del self.report exclude, aborted = set(), 0 while True: suggestions = [] register = self.processing.ctx.register( services=iter(services), exclude=exclude, doSuggest=lambda *args: suggestions.append(args)) try: self.assembled = self.processing.execute(FILL_ALL, register=register) break except Abort as e: assert isinstance(e, Abort) found = set() for reason in e.reasons: if isinstance(reason, Invoker): assert isinstance(reason, Invoker) assert isinstance( reason.id, str), 'Invalid invoker id %s' % reason.id if reason.id in exclude: log.error('Already excluded %s', reason) return found.add(reason.id) if not found: log.error('Could not locate any invoker reason in %s', e.reasons) return exclude.update(found) aborted += 1 log.info('Finalized assemblers after %i aborts' % aborted) if suggestions: log.warn( 'Available suggestions:\n%s', '\n'.join(suggest[0] % suggest[1:] for suggest in suggestions))
from ally.container import ioc from ally.core.impl.processor.text_conversion import ConversionSetHandler from ally.core.spec.resources import Normalizer, Converter from ally.design.processor.attribute import defines from ally.design.processor.context import Context, create from ally.design.processor.execution import Chain from ally.design.processor.spec import Resolvers import unittest # -------------------------------------------------------------------- class Content(Context): normalizer = defines(Normalizer) converter = defines(Converter) ctx = create(Resolvers(contexts=dict(Content=Content))) Content = ctx['Content'] # -------------------------------------------------------------------- class TestTextConversion(unittest.TestCase): def testTextConversion(self): handler = ConversionSetHandler() handler.normalizer = Normalizer() handler.converter = Converter() ioc.initialize(handler) requestCnt, response = Content(), Content() def callProcess(chain, **keyargs): handler.process(**keyargs) chain = Chain([callProcess])