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)
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)
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))
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)
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)
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))
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))