Ejemplo n.º 1
0
    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))
Ejemplo n.º 2
0
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)
Ejemplo n.º 3
0
    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)
Ejemplo n.º 4
0
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)
Ejemplo n.º 5
0
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):
Ejemplo n.º 6
0
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):
Ejemplo n.º 7
0
    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))
Ejemplo n.º 8
0
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])