def run_doctests(self): """ Actually runs the doctests. This function is called by :meth:`run`. EXAMPLES:: sage: from sage.doctest.control import DocTestDefaults, DocTestController sage: from sage.env import SAGE_SRC sage: import os sage: dirname = os.path.join(SAGE_SRC, 'sage', 'rings', 'homset.py') sage: DD = DocTestDefaults() sage: DC = DocTestController(DD, [dirname]) sage: DC.expand_files_into_sources() sage: DC.run_doctests() Doctesting 1 file. sage -t .../sage/rings/homset.py [... tests, ... s] ---------------------------------------------------------------------- All tests passed! ---------------------------------------------------------------------- Total time for all tests: ... seconds cpu time: ... seconds cumulative wall time: ... seconds """ nfiles = 0 nother = 0 for F in self.sources: if isinstance(F, FileDocTestSource): nfiles += 1 else: nother += 1 if self.sources: filestr = ", ".join(([count_noun(nfiles, "file")] if nfiles else []) + ([count_noun(nother, "other source")] if nother else [])) threads = " using %s threads"%(self.options.nthreads) if self.options.nthreads > 1 else "" iterations = [] if self.options.global_iterations > 1: iterations.append("%s global iterations"%(self.options.global_iterations)) if self.options.file_iterations > 1: iterations.append("%s file iterations"%(self.options.file_iterations)) iterations = ", ".join(iterations) if iterations: iterations = " (%s)"%(iterations) self.log("Doctesting %s%s%s."%(filestr, threads, iterations)) self.reporter = DocTestReporter(self) self.dispatcher = DocTestDispatcher(self) N = self.options.global_iterations for it in range(N): try: self.timer = Timer().start() self.dispatcher.dispatch() except KeyboardInterrupt: it = N - 1 break finally: self.timer.stop() self.reporter.finalize() self.cleanup(it == N - 1) else: self.log("No files to doctest") self.reporter = DictAsObject(dict(error_status=0))