def _osx_create_app(self, xul_path, path, title):

        # Get app of firefox
        if 'Contents/MacOS' not in xul_path:
            raise NotImplementedError('Cannot deal with real xulrunner yet')
        xul_app = op.dirname(op.dirname(op.dirname(xul_path)))
        if not xul_app.endswith('.app'):
            raise TypeError('The xulrunner application must end in .app.')

        # Clear destination
        if op.isdir(path):
            shutil.rmtree(path)
        os.mkdir(path)

        # Make dir structure
        os.mkdir(op.join(path, 'Contents'))
        os.mkdir(op.join(path, 'Contents', 'MacOS'))
        os.mkdir(op.join(path, 'Contents', 'Resources'))

        # Make a link for all the files
        for dirpath, dirnames, filenames in os.walk(xul_app):
            relpath = op.relpath(dirpath, xul_app)
            if '.app' in relpath:
                continue
            if relpath.endswith('MacOS') or relpath.endswith('Resources'):
                for fname in filenames:
                    filename1 = op.join(xul_app, relpath, fname)
                    filename2 = op.join(path, relpath, fname)
                    os.symlink(filename1, filename2)
        # Make xulrunner exe
        os.symlink(op.join(xul_app, 'Contents', 'MacOS', 'firefox'),
                   op.join(path, 'Contents', 'MacOS', 'xulrunner'))
        # Make info.plist
        info = INFO_PLIST.format(name=title)
        with open(op.join(path, 'Contents', 'info.plist'), 'wb') as f:
            f.write(info.encode())
        # Make icon - ensured by launch function
        if self._kwargs.get('icon'):
            icon = self._kwargs.get('icon')
            icon.write(op.join(path, 'Contents', 'Resources', 'app.icns'))
Create osx app
dataset/ETHPy150Open zoofIO/flexx/flexx/webruntime/xul.py/XulRuntime._osx_create_app