示例#1
0
    def __init__(self):
        assert isinstance(self.assembly,
                          Assembly), 'Invalid assembly %s' % self.assembly
        super().__init__(self)

        self.done = False

        self.resolvers = {}
        self.extensions = {}
        self.wrappers = {}
        self.calls = []
        if self.assembly.reportUnused: self.report = ReportUnused()
        else: self.report = ReportNone()

        sources = resolversFor(dict(register=Register, Invoker=Invoker))
        for processor in self.assembly.processors:
            assert isinstance(processor,
                              IProcessor), 'Invalid processor %s' % processor
            processor.register(sources, self.resolvers, self.extensions,
                               self.calls, self.report)
        for processor in self.processors:
            processor.finalized(sources, self.resolvers, self.extensions,
                                self.report)

        solve(self.resolvers, sources)

        for name, resolver in self.resolvers.items():
            self.wrappers[name] = ResolverWrapper(resolver)
示例#2
0
 def introspectProcessing() -> Processing:
     assert introspectContexts(), 'At least a set of contexts is required'
     contexts = iter(introspectContexts())
     resolvers = resolversFor(next(contexts))
     for context in contexts: solve(resolvers, context)
     
     return assemblyIntrospection().create(**resolvers)
示例#3
0
    def introspectProcessing() -> Processing:
        assert introspectContexts(), 'At least a set of contexts is required'
        contexts = iter(introspectContexts())
        resolvers = resolversFor(next(contexts))
        for context in contexts:
            solve(resolvers, context)

        return assemblyIntrospection().create(**resolvers)
示例#4
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))
示例#5
0
 def __init__(self):
     assert isinstance(self.name, str), 'Invalid name %s' % self.name
     assert isinstance(self.verifier, IVerifier), 'Invalid verifier %s' % self.verifier
     assert isinstance(self.descriptions, list), 'Invalid descriptions %s' % self.descriptions
     
     resolvers = resolversForDescriptions(self.descriptions)
     self.verifier.prepare(resolvers)
     solve(resolvers, dict(Invoker=Invoker))
     
     super().__init__(**resolvers)
示例#6
0
    def __init__(self):
        assert isinstance(self.name, str), 'Invalid name %s' % self.name
        assert isinstance(self.verifier,
                          IVerifier), 'Invalid verifier %s' % self.verifier
        assert isinstance(self.descriptions,
                          list), 'Invalid descriptions %s' % self.descriptions

        resolvers = resolversForDescriptions(self.descriptions)
        self.verifier.prepare(resolvers)
        solve(resolvers, dict(Invoker=Invoker))

        super().__init__(**resolvers)
示例#7
0
    def process(self, chain, export: DefineExport, **keyargs):
        '''
        @see: HandlerProcessor.process
        
        Process the export.
        '''
        assert isinstance(export, DefineExport), 'Invalid export %s' % export

        if export.Target:
            assert isinstance(export.Target,
                              IResolver), 'Invalid target %s' % export.Target
            export.Target = export.Target.solve(self.Target)
        else:
            export.Target = self.Target

        if export.arg is None: export.arg = {}
        solve(export.arg, self.arg)
示例#8
0
 def __init__(self):
     assert isinstance(self.assembly, Assembly), 'Invalid assembly %s' % self.assembly
     super().__init__(self)
     
     self.done = False
     
     self.resolvers = {}
     self.extensions = {}
     self.wrappers = {}
     self.calls = []
     if self.assembly.reportUnused: self.report = ReportUnused()
     else: self.report = ReportNone()
     
     sources = resolversFor(dict(register=Register, Invoker=Invoker))
     for processor in self.assembly.processors:
         assert isinstance(processor, IProcessor), 'Invalid processor %s' % processor
         processor.register(sources, self.resolvers, self.extensions, self.calls, self.report)
     for processor in self.processors:
         processor.finalized(sources, self.resolvers, self.extensions, self.report)
     
     solve(self.resolvers, sources)
     
     for name, resolver in self.resolvers.items(): self.wrappers[name] = ResolverWrapper(resolver)
示例#9
0
 def finalized(self, sources, resolvers, extensions, report):
     '''
     @see: IProcessor.finalized
     '''
     assert not self.done, 'Cannot register anymore the service registering has been performed already'
     assert isinstance(sources, dict), 'Invalid sources %s' % sources
     assert isinstance(resolvers, dict), 'Invalid resolvers %s' % resolvers
     assert isinstance(extensions, dict), 'Invalid extensions %s' % extensions
     
     solve(self.resolvers, self.filter(sources))
     solve(self.resolvers, self.filter(resolvers))
     solve(self.resolvers, self.filter(extensions))
示例#10
0
    def finalized(self, sources, resolvers, extensions, report):
        '''
        @see: IProcessor.finalized
        '''
        assert not self.done, 'Cannot register anymore the service registering has been performed already'
        assert isinstance(sources, dict), 'Invalid sources %s' % sources
        assert isinstance(resolvers, dict), 'Invalid resolvers %s' % resolvers
        assert isinstance(extensions,
                          dict), 'Invalid extensions %s' % extensions

        solve(self.resolvers, self.filter(sources))
        solve(self.resolvers, self.filter(resolvers))
        solve(self.resolvers, self.filter(extensions))
示例#11
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))