| |
| import logging |
|
|
|
|
| def console(soffice='soffice'): |
| import uno |
| import unokit.contexts |
| import unokit.services |
| import oxt_tool.remote |
|
|
| with oxt_tool.remote.new_remote_context(soffice=soffice) as context: |
| desktop = unokit.services.css.frame.Desktop() |
| def new_textdoc(): |
| return desktop.loadComponentFromURL('private:factory/swriter', |
| '_blank', 0, tuple()) |
| from unokit.util import dump, dumpdir |
| local = dict(uno=uno, context=context, |
| css=unokit.services.css, dump=dump, dumpdir=dumpdir, |
| desktop=desktop, new_textdoc=new_textdoc) |
| __import__('code').interact(banner='oxt-console', local=local) |
|
|
|
|
| def dict_to_namedvalue(d): |
| import uno |
| nv = list() |
| for n, v in d.items(): |
| if isinstance(v, dict): |
| v = dict_to_namedvalue(v) |
| item = uno.createUnoStruct('com.sun.star.beans.NamedValue') |
| item.Name = n |
| item.Value = v |
| nv.append(item) |
| return tuple(nv) |
|
|
|
|
| def test_remotely(soffice, discover_dirs, extra_path, logconf_path): |
| import sys |
| import os |
| import os.path |
| import discover |
| import oxt_tool.remote |
|
|
| logger = logging.getLogger('unokit') |
| logger.addHandler(logging.StreamHandler()) |
| logger.setLevel(logging.INFO) |
|
|
| logfmt = logging.Formatter(('frontend %5d ' % os.getpid()) |
| +'%(message)s') |
| logchn = logging.StreamHandler() |
| logchn.setFormatter(logfmt) |
| logger = logging.getLogger('frontend') |
| logger.addHandler(logchn) |
| logger.setLevel(logging.INFO) |
|
|
| working_dir = sys.argv[1] |
| working_dir = os.path.abspath(working_dir) |
|
|
| for path in sys.path: |
| logger.info('sys.path: %s', path) |
|
|
| if logconf_path: |
| logconf_path = os.path.abspath(logconf_path) |
|
|
| backend_path = sys.modules['oxt_tool'].__file__ |
| backend_path = os.path.dirname(backend_path) |
| backend_path = os.path.join(backend_path, 'backend.py') |
| backend_name = 'backend.TestRunnerJob' |
|
|
| tss = [] |
| for d in discover_dirs: |
| d = os.path.abspath(d) |
| logger.info('discover tests: %s', d) |
| testloader = discover.DiscoveringTestLoader() |
| testsuite = testloader.discover(d) |
| tss.append(testsuite) |
| import unittest |
| testsuite = unittest.TestSuite(tss) |
|
|
| with oxt_tool.remote.new_remote_context(soffice=soffice) as context: |
| logger.info('remote context created') |
| factory = load_component(backend_path, backend_name) |
| if factory: |
| backendjob = factory.createInstanceWithContext(context) |
| if backendjob: |
| import cPickle |
| from unokit.adapters import OutputStreamToFileLike |
| pickled_testsuite = cPickle.dumps(testsuite) |
| outputstream = OutputStreamToFileLike(sys.stderr) |
| logstream = OutputStreamToFileLike(sys.stderr) |
| args = dict(outputstream=outputstream, |
| logstream=logstream, |
| pickled_testsuite=pickled_testsuite, |
| extra_path=tuple(extra_path), |
| logconf_path=logconf_path, |
| working_dir=working_dir) |
| args = dict_to_namedvalue(args) |
| result = backendjob.execute(args) |
| result = str(result) |
| result = cPickle.loads(result) |
| return 0 if result['successful'] else 1 |
| return -1 |
|
|
|
|
| def load_component(component_path, component_name): |
| import os |
| import os.path |
| import uno |
| from unokit.services import css |
| loader = css.loader.Python() |
| if loader: |
| component_path = os.path.abspath(component_path) |
| component_url = uno.systemPathToFileUrl(component_path) |
|
|
| return loader.activate(component_name, '', |
| component_url, None) |
|
|
|
|
| def console_in_proc(soffice='soffice'): |
| import os |
| import unohelper |
| from com.sun.star.task import XJob |
| import oxt_tool.remote |
|
|
| logfmt = logging.Formatter(('frontend %5d ' % os.getpid()) |
| +'%(message)s') |
| logchn = logging.StreamHandler() |
| logchn.setFormatter(logfmt) |
| logger = logging.getLogger('frontend') |
| logger.addHandler(logchn) |
| logger.setLevel(logging.INFO) |
|
|
| class ConsoleInput(unohelper.Base, XJob): |
|
|
| def __init__(self, context): |
| self.context = context |
|
|
| def execute(self, arguments): |
| prompt, = arguments |
| try: |
| return raw_input(prompt.Value) |
| except EOFError: |
| return None |
|
|
| import sys |
| import os.path |
| backend_path = sys.modules['oxt_tool'].__file__ |
| backend_path = os.path.dirname(backend_path) |
| backend_path = os.path.join(backend_path, 'backend.py') |
| backend_name = 'backend.ConsoleJob' |
|
|
| with oxt_tool.remote.new_remote_context(soffice=soffice) as context: |
| logger.info('remote context created') |
| factory = load_component(backend_path, backend_name) |
| if factory: |
| backendjob = factory.createInstanceWithContext(context) |
| if backendjob: |
| from unokit.adapters import OutputStreamToFileLike |
| outstream = OutputStreamToFileLike(sys.stderr) |
| args = dict(inp=ConsoleInput(context), |
| outstream=outstream) |
| args = dict_to_namedvalue(args) |
| backendjob.execute(args) |
|
|
|
|
| class LoEnviron(object): |
|
|
| def __init__(self, program_dir): |
| self.program_dir = program_dir |
|
|
| @property |
| def rc_ext(self): |
| import sys |
| if sys.platform == 'win32': |
| return '.ini' |
| else: |
| return 'rc' |
|
|
|
|
| @property |
| def fundamentalrc(self): |
| import os.path |
| filename = 'fundamental' + self.rc_ext |
| return os.path.join(self.program_dir, filename) |
|
|
|
|
| @property |
| def ure_bootstrap(self): |
| return 'vnd.sun.star.pathname:' + self.fundamentalrc |
|
|
|
|
| def run_in_lo(soffice='soffice'): |
| import os |
| import sys |
| import os.path |
|
|
| uno_pythonpath = os.environ['UNO_PYTHONPATH'].split(os.pathsep) |
| sys.path.extend(uno_pythonpath) |
|
|
| loenv = LoEnviron(os.environ['LO_PROGRAM']) |
| os.environ['URE_BOOTSTRAP'] = loenv.ure_bootstrap |
|
|
| import oxt_tool.remote |
|
|
| logger = logging.getLogger('unokit') |
| logger.addHandler(logging.StreamHandler()) |
| logger.setLevel(logging.INFO) |
|
|
| logger = logging.getLogger('oxt_tool') |
| logger.addHandler(logging.StreamHandler()) |
| logger.setLevel(logging.INFO) |
|
|
| logfmt = logging.Formatter(('frontend %5d ' % os.getpid()) |
| +'%(message)s') |
| logchn = logging.StreamHandler() |
| logchn.setFormatter(logfmt) |
| logger = logging.getLogger('frontend') |
| logger.addHandler(logchn) |
| logger.setLevel(logging.INFO) |
|
|
| for path in sys.path: |
| logger.info('sys.path: %s', path) |
|
|
| working_dir = os.getcwd() |
| working_dir = os.path.abspath(working_dir) |
| argv = list(sys.argv[1:]) |
|
|
| if argv[0].startswith('--logfile='): |
| logfile = argv[0][len('--logfile='):] |
| argv = argv[1:] |
| else: |
| logfile = None |
| argv[0] = os.path.abspath(argv[0]) |
| print argv |
|
|
| backend_path = sys.modules['oxt_tool'].__file__ |
| backend_path = os.path.dirname(backend_path) |
| backend_path = os.path.join(backend_path, 'backend.py') |
| backend_name = 'backend.RemoteRunJob' |
|
|
| with oxt_tool.remote.new_remote_context(soffice=soffice) as context: |
| logger.info('remote context created') |
| factory = load_component(backend_path, backend_name) |
| if factory: |
| backendjob = factory.createInstanceWithContext(context) |
| if backendjob: |
| import cPickle |
| from unokit.adapters import OutputStreamToFileLike |
| from unokit.adapters import InputStreamFromFileLike |
| stdin = InputStreamFromFileLike(sys.stdin) |
| stdout = OutputStreamToFileLike(sys.stdout) |
| stderr = OutputStreamToFileLike(sys.stderr) |
| path = cPickle.dumps(sys.path) |
| argv = cPickle.dumps(argv) |
| args = dict(logfile=logfile, |
| working_dir=working_dir, |
| path=path, |
| argv=argv, |
| stdin=stdin, |
| stdout=stdout, |
| stderr=stderr) |
| args = dict_to_namedvalue(args) |
| return backendjob.execute(args) |
| return -1 |
|
|
|
|
| def install(unopkg='unopkg'): |
| import sys |
| cmd = [unopkg, 'add', '-v', '-s'] |
| cmd.extend(sys.argv[1:]) |
| cmd = [('"%s"' % x) if ' ' not in x else x |
| for x in cmd] |
| cmd = ' '.join(cmd) |
| import os |
| return os.system(cmd) |
|
|
|
|
| class Console(object): |
| def __init__(self, buildout, name, options): |
| import os.path |
| self.__name = name |
| self.__logger = logging.getLogger(name) |
| self.__bindir = buildout['buildout']['bin-directory'] |
|
|
| soffice = options.get('soffice', 'soffice').strip() |
| if not os.path.exists(soffice): |
| self.__skip = True |
| self.__logger.info('soffice not found at: %s', soffice) |
| self.__logger.info('installation will be skipped') |
| return |
|
|
| in_proc = options.get('in_proc', 'true').strip().lower() |
| in_proc = in_proc in ['true', 'yes', '1'] |
|
|
| self.__python = options.get('python', '').strip() |
| self.__soffice = soffice |
| self.__in_proc = in_proc |
| self.__skip = False |
|
|
| def install(self): |
| if self.__skip: |
| self.__logger.info('skipped') |
| return [] |
|
|
| from zc.buildout import easy_install |
| import pkg_resources |
| import sys |
| ws = [pkg_resources.get_distribution(dist) |
| for dist in ['unokit', 'oxt.tool']] |
| if self.__in_proc: |
| func = 'console_in_proc' |
| else: |
| func = 'console' |
| entrypoints = [(self.__name, 'oxt_tool', func)] |
| arguments = '%r' % self.__soffice |
| if self.__python: |
| python = self.__python |
| else: |
| python = sys.executable |
| return easy_install.scripts(entrypoints, |
| ws, python, self.__bindir, |
| arguments=arguments) |
|
|
| update = install |
|
|
|
|
| class TestRunner(object): |
| def __init__(self, buildout, name, options): |
| import os.path |
| self.__name = name |
| self.__logger = logging.getLogger(name) |
| self.__bindir = buildout['buildout']['bin-directory'] |
| self.__skip = False |
| self.__python = options.get('python', '').strip() |
|
|
| self.__soffice = options.get('soffice', 'soffice').strip() |
| if not os.path.exists(self.__soffice): |
| self.__skip = True |
| self.__logger.info('soffice not found at: %s', self.__soffice) |
| self.__logger.info('installation will be skipped') |
| return |
| self.__discover = options['discover'].split() |
| self.__extra_path = options['extra_path'].split() |
| self.__logconf_path = options.get('logconf_path') |
|
|
| def install(self): |
| if self.__skip: |
| self.__logger.info('skipped') |
| return [] |
|
|
| from zc.buildout import easy_install |
| import pkg_resources |
| import sys |
| ws = [pkg_resources.get_distribution(dist) |
| for dist in ['unokit', 'oxt.tool', 'discover']] |
| entrypoints = [(self.__name, 'oxt_tool', 'test_remotely')] |
| arguments = '%r, %r, %r, %r' |
| arguments = arguments % (self.__soffice, |
| self.__discover, |
| self.__extra_path, |
| self.__logconf_path) |
| if self.__python: |
| python = self.__python |
| else: |
| python = sys.executable |
| return easy_install.scripts(entrypoints, |
| ws, python, self.__bindir, |
| arguments=arguments) |
|
|
| update = install |
|
|
|
|
| class Installer(object): |
| def __init__(self, buildout, name, options): |
| import os.path |
| self.__name = name |
| self.__logger = logging.getLogger(name) |
| self.__bindir = buildout['buildout']['bin-directory'] |
|
|
| unopkg = options.get('unopkg', 'unopkg').strip() |
| if not os.path.exists(unopkg): |
| self.__skip = True |
| self.__logger.info('unopkg not found at: %s', unopkg) |
| self.__logger.info('installation will be skipped') |
| return |
|
|
| self.__unopkg = unopkg |
| self.__skip = False |
|
|
| def install(self): |
| if self.__skip: |
| self.__logger.info('skipped') |
| return [] |
|
|
| from zc.buildout import easy_install |
| import pkg_resources |
| import sys |
| ws = [pkg_resources.get_distribution(dist) |
| for dist in ['unokit', 'oxt.tool']] |
| entrypoints = [(self.__name, 'oxt_tool', 'install')] |
| arguments = '%r' % self.__unopkg |
| return easy_install.scripts(entrypoints, |
| ws, sys.executable, self.__bindir, |
| arguments=arguments) |
|
|
| update = install |
|
|