Example #1
0
    def render_close(self, data, text=None):
        if 'context' not in data:
            return "<code>{}</code>".format(text)
        context = data['context']
        path = dirname(context.get('.request.path', '/'))
        urls = context['.urls']
        tag_name = text.strip()
        xmlns = None
        if '{' in tag_name:
            xmlns, tag_name = self._re_namespace.match(tag_name).groups()
            if '://' not in xmlns:
                xmlns = self._join(namespaces.default, xmlns)
            text = tag_name
            tag_name = "{{{}}}{}".format(xmlns, tag_name)

        if xmlns is None:
            xmlns = self.attribs.strip()
            if '://' not in xmlns:
                xmlns = self._join(namespaces.default, xmlns)
            tag_name = "{{{}}}{}".format(xmlns, tag_name)
        try:
            tag_path = urls['tag'][tag_name]
            relative_tag_path = relativefrom(path, tag_path)
        except KeyError as e:
            return "<code>{}</code>".format(text)
        else:
            return '''<a class="tag" href="{tag_path}">&lt;{text}&gt;</a>'''.format(
                tag_path=relative_tag_path, text=text)
Example #2
0
    def render_close(self, data, text=None):
        if 'context' not in data:
            return "<code>{}</code>".format(text)
        context = data['context']
        path = dirname(context.get('.request.path', '/'))
        urls = context['.urls']
        tag_name = text.strip()
        xmlns = None
        if '{' in tag_name:
            xmlns, tag_name = self._re_namespace.match(tag_name).groups()
            if '://' not in xmlns:
                xmlns = self._join(namespaces.default, xmlns)
            text = tag_name
            tag_name = "{{{}}}{}".format(xmlns, tag_name)

        if xmlns is None:
            xmlns = self.attribs.strip()
            if '://' not in xmlns:
                xmlns = self._join(namespaces.default, xmlns)
            tag_name = "{{{}}}{}".format(xmlns, tag_name)
        try:
            tag_path = urls['tag'][tag_name]
            relative_tag_path = relativefrom(path, tag_path)
        except KeyError as e:
            return "<code>{}</code>".format(text)
        else:
            return '''<a class="tag" href="{tag_path}">&lt;{text}&gt;</a>'''.format(tag_path=relative_tag_path, text=text)
Example #3
0
    def render_close(self, data, text=None):
        if "context" not in data:
            return "<code>{}</code>".format(text)
        context = data["context"]
        path = dirname(context.get(".request.path", "/"))
        urls = context[".urls"]
        tag_name = text.strip()
        xmlns = None
        if "{" in tag_name:
            xmlns, tag_name = self._re_namespace.match(tag_name).groups()
            if "://" not in xmlns:
                xmlns = self._join(namespaces.default, xmlns)
            text = tag_name
            tag_name = "{{{}}}{}".format(xmlns, tag_name)

        if xmlns is None:
            xmlns = self.attribs.strip()
            if "://" not in xmlns:
                xmlns = self._join(namespaces.default, xmlns)
            tag_name = "{{{}}}{}".format(xmlns, tag_name)
        try:
            tag_path = urls["tag"][tag_name]
            relative_tag_path = relativefrom(path, tag_path)
        except KeyError as e:
            return "<code>{}</code>".format(text)
        else:
            return """<a class="tag" href="{tag_path}">&lt;{text}&gt;</a>""".format(
                tag_path=relative_tag_path, text=text)
Example #4
0
    def test_realtivefrom(self):
        tests = [
            ("/", "/foo.html", "foo.html"),
            ("/foo", "/foo/bar.html", "bar.html"),
            ("/foo/bar/", "/egg.html", "../../egg.html"),
            ("/a/b/c/d", "e", "../../../../e"),
            ("/a/b/c/d", "a/d", "../../../d"),
            ("/docs/", "tags/index.html", "../tags/index.html"),
            ("foo/bar", "baz/index.html", "../../baz/index.html"),
            ("", "a", "a"),
            ("a", "b/c", "../b/c"),
        ]

        for base, path, result in tests:
            self.assertEqual(relativefrom(base, path), result)
Example #5
0
    def install_package(self, download_fs, output_fs, packages, cfg=None):
        args = self.args
        changed_server_xml = False
        installed = []

        for package_name, (app_name, mount,
                           package_select) in packages.items():

            if package_select["system"]:
                install_location = None
                package_select["location"] = "<builtin>"
            else:
                package_name = package_select["name"]
                install_version = versioning.Version(package_select["version"])

                filename = "{}-{}.{}".format(package_name, install_version,
                                             package_select["md5"])
                download_url = package_select["download"]
                # package_filename = download_url.rsplit('/', 1)[-1]

                install_location = relativefrom(
                    self.location,
                    join(self.location, args.output, package_select["name"]),
                )
                package_select["location"] = install_location

            with download_fs.open(filename, "rb") as package_file:
                with ZipFS(package_file) as package_fs:
                    with output_fs.makedir(package_select["name"],
                                           recreate=True) as lib_fs:
                        lib_fs.removetree("/")
                        fs.copy.copy_dir(package_fs, "/", lib_fs, "/")
                        installed.append((package_select, mount))

            if not args.no_add:
                server_xml = cfg.get("project", "startup")
                changed_server_xml = installer.install(
                    project_path=self.location,
                    server_xml_location=cfg.get("project", "location"),
                    server_xml=server_xml,
                    server_name=args.server,
                    lib_path=install_location,
                    lib_name=package_name,
                    app_name=app_name,
                    mount=mount,
                )

        return changed_server_xml, installed
Example #6
0
    def install_package(self, download_fs, output_fs, packages, cfg=None):
        args = self.args
        changed_server_xml = False
        installed = []

        for package_name, (app_name, mount,
                           package_select) in packages.items():

            if package_select['system']:
                install_location = None
                package_select['location'] = '<builtin>'
            else:
                package_name = package_select['name']
                install_version = versioning.Version(package_select['version'])

                filename = "{}-{}.{}".format(package_name, install_version,
                                             package_select['md5'])
                download_url = package_select['download']
                #package_filename = download_url.rsplit('/', 1)[-1]

                install_location = relativefrom(
                    self.location,
                    join(self.location, args.output, package_select['name']))
                package_select['location'] = install_location

            with download_fs.open(filename, 'rb') as package_file:
                with ZipFS(package_file) as package_fs:
                    with output_fs.makedir(package_select['name'],
                                           recreate=True) as lib_fs:
                        lib_fs.removetree('/')
                        fs.copy.copy_dir(package_fs, '/', lib_fs, '/')
                        installed.append((package_select, mount))

            if not args.no_add:
                server_xml = cfg.get('project', 'startup')
                changed_server_xml =\
                    installer.install(project_path=self.location,
                                      server_xml_location=cfg.get('project', 'location'),
                                      server_xml=server_xml,
                                      server_name=args.server,
                                      lib_path=install_location,
                                      lib_name=package_name,
                                      app_name=app_name,
                                      mount=mount)

        return changed_server_xml, installed
Example #7
0
 def render_close(self, data, text=None):
     doc_name = self.attribs.strip()
     fragment = None
     if "#" in doc_name:
         doc_name, fragment = doc_name.split("#", 1)
     if "docs" not in data:
         return doc_name
     doc = data["docs"].get("doc.{}".format(doc_name))
     if not doc:
         return doc_name
     title = doc.data.get("title", doc_name)
     urls = data["urls"]
     url = urls["doc"].get(doc_name, "")
     if fragment is not None:
         url = url + "#" + fragment
     context = data["context"]
     path = dirname(context.get(".request.path", "/"))
     return self._format.format(title=title, url=relativefrom(path, url))
Example #8
0
 def render_close(self, data, text=None):
     doc_name = self.attribs.strip()
     fragment = None
     if '#' in doc_name:
         doc_name, fragment = doc_name.split('#', 1)
     if 'docs' not in data:
         return doc_name
     doc = data['docs'].get('doc.{}'.format(doc_name))
     if not doc:
         return doc_name
     title = doc.data.get('title', doc_name)
     urls = data['urls']
     url = urls['doc'].get(doc_name, '')
     if fragment is not None:
         url = url + '#' + fragment
     context = data['context']
     path = dirname(context.get('.request.path', '/'))
     return self._format.format(title=title, url=relativefrom(path, url))
Example #9
0
 def render_close(self, data, text=None):
     doc_name = self.attribs.strip()
     fragment = None
     if '#' in doc_name:
         doc_name, fragment = doc_name.split('#', 1)
     if 'docs' not in data:
         return doc_name
     doc = data['docs'].get('doc.{}'.format(doc_name))
     if not doc:
         return doc_name
     title = doc.data.get('title', doc_name)
     urls = data['urls']
     url = urls['doc'].get(doc_name, '')
     if fragment is not None:
         url = url + '#' + fragment
     context = data['context']
     path = dirname(context.get('.request.path', '/'))
     return self._format.format(title=title, url=relativefrom(path, url))
Example #10
0
File: bbcode.py Project: esaye/moya
 def render_open(self, data):
     doc_name = self.attribs.strip()
     anchor = None
     if '#' in doc_name:
         doc_name, anchor = doc_name.split('#', 1)
     if 'docs' not in data:
         return doc_name
     doc = data['docs'].get('doc.{}'.format(doc_name))
     if not doc:
         return doc_name
     title = doc.data.get('title', doc_name)
     urls = data['urls']
     url = urls['doc'].get(doc_name, '')
     context = data['context']
     path = dirname(context.get('.request.path', '/'))
     if anchor:
         url = "{}#{}".format(url, anchor)
     return '''<a href="{url}" title="{title}">'''.format(url=relativefrom(path, url), title=title)
Example #11
0
 def render_open(self, data):
     doc_name = self.attribs.strip()
     anchor = None
     if "#" in doc_name:
         doc_name, anchor = doc_name.split("#", 1)
     if "docs" not in data:
         return doc_name
     doc = data["docs"].get("doc.{}".format(doc_name))
     if not doc:
         return doc_name
     title = doc.data.get("title", doc_name)
     urls = data["urls"]
     url = urls["doc"].get(doc_name, "")
     context = data["context"]
     path = dirname(context.get(".request.path", "/"))
     if anchor:
         url = "{}#{}".format(url, anchor)
     return """<a href="{url}" title="{title}">""".format(url=relativefrom(
         path, url),
                                                          title=title)
Example #12
0
    def run_install(self):
        args = self.args
        console = self.console
        installed = []
        install_package = args.package

        install_select = package_select = self.call('package.select', package=install_package)
        install_notes = package_select['notes']

        if package_select['version'] is None:
            raise CommandError("no install candidate for '{}', run 'moya-pm list' to see available packages".format(install_package))

        package_name = package_select['name']
        install_version = versioning.Version(package_select['version'])

        filename = package_select['md5']
        download_url = package_select['download']
        package_filename = download_url.rsplit('/', 1)[-1]

        libs = []
        output_fs = fsopendir(args.output)
        force = args.force

        installed_libs = {}

        archive = None
        if not args.download:
            try:
                application = WSGIApplication(self.location, args.settings, disable_autoreload=True)
                archive = application.archive
                if archive is None:
                    console.text('unable to load project, use the --force switch to force installation')
                    return -1
            except Exception as e:
                if not args.force:
                    console.exception(e)
                    console.text('unable to load project, use the --force switch to force installation')
                    return -1
            else:
                libs = [(lib.long_name, lib.version, lib.install_location)
                        for lib in archive.libs.values() if lib.long_name == package_name]

                installed_libs = archive.libs.copy()

                if not force:
                    for name, version, location in libs:
                        if name == package_name:
                            if version > install_version:
                                if not args.force:
                                    raise CommandError("a newer version ({}) is already installed, use --force to force installation".format(version))
                            elif install_version == version:
                                if not args.force:
                                    raise CommandError("version {} is already installed, use --force to force installation".format(version))
                            else:
                                if not args.upgrade:
                                    raise CommandError("an older version ({}) is installed, use --upgrade to force upgrade".format(version))
                            force = True

        username = self.settings.get('upload', 'username', None)
        password = self.settings.get('upload', 'password', None)
        if username and password:
            auth = (username, password)
        else:
            auth = None

        install_app = args.app or package_name.split('.')[-1]
        packages = dependencies.gather_dependencies(self.rpc,
                                                    install_app,
                                                    args.mount,
                                                    install_package,
                                                    console,
                                                    no_deps=args.no_deps)

        if not args.no_add:
            for package_name, (app_name, mount, package_select) in packages.items():
                if package_select['version'] is None:
                    raise CommandError("no install candidate for required package '{}', run 'moya-pm list {}' to see available packages".format(package_name, package_name))

        download_temp_fs = TempFS()
        for package_name, (app_name, mount, package_select) in packages.items():

            package_name = package_select['name']
            install_version = versioning.Version(package_select['version'])

            filename = "{}-{}.{}".format(package_name, install_version, package_select['md5'])
            download_url = package_select['download']
            package_filename = download_url.rsplit('/', 1)[-1]

            with download_temp_fs.open(filename, 'wb') as package_file:
                checksum = downloader.download(download_url,
                                               package_file,
                                               console=console,
                                               auth=auth,
                                               verify_ssl=False,
                                               msg="requesting {name}=={version}".format(**package_select))
                if checksum != package_select['md5']:
                    raise CommandError("md5 checksum of download doesn't match server! download={}, server={}".format(checksum, package_select['md5']))

            if args.download:
                with fsopendir(args.download) as dest_fs:
                    fs.utils.copyfile(download_temp_fs, filename, dest_fs, package_filename)

        if args.download:
            return 0

        changed_server_xml = False
        for package_name, (app_name, mount, package_select) in packages.items():

            package_name = package_select['name']
            install_version = versioning.Version(package_select['version'])

            filename = "{}-{}.{}".format(package_name, install_version, package_select['md5'])
            download_url = package_select['download']
            package_filename = download_url.rsplit('/', 1)[-1]

            install_location = relativefrom(self.location, pathjoin(self.location, args.output, package_select['name']))
            package_select['location'] = install_location

            with download_temp_fs.open(filename, 'rb') as package_file:
                with ZipFS(package_file, 'r') as package_fs:
                    with output_fs.makeopendir(package_select['name']) as lib_fs:
                        #if not lib_fs.isdirempty('/') and not force:
                        #    raise CommandError("install directory is not empty, use --force to erase and overwrite")
                        fs.utils.remove_all(lib_fs, '/')
                        fs.utils.copydir(package_fs, lib_fs)
                        installed.append((package_select, mount))

            if not args.no_add and archive:
                server_xml = archive.cfg.get('project', 'startup')
                changed_server_xml =\
                    installer.install(project_path=self.location,
                                      server_xml_location=archive.cfg.get('project', 'location'),
                                      server_xml=server_xml,
                                      server_name=application.server_ref,
                                      lib_path=install_location,
                                      lib_name=package_name,
                                      app_name=app_name,
                                      mount=mount)

        table = []
        for _package, mount in installed:
            table.append([Cell("{name}=={version}".format(**_package), fg="magenta", bold=True),
                          Cell(_package['location'], fg="blue", bold=True),
                          Cell(mount or '', fg="cyan", bold=True)])

        if table:
            console.table(table, ['package', 'location', 'mount'])

        if install_notes:
            console.table([[install_notes]], ['{} v{} release notes'.format(install_select['name'], install_select['version'])])

        if changed_server_xml:
            console.text("moya-pm modified '{}' -- please check changes".format(server_xml), fg="green", bold="yes")
Example #13
0
File: moyapi.py Project: esaye/moya
    def run_install(self):
        args = self.args
        console = self.console

        installed = []

        for install_package in args.package:

            #console.div("installing {}".format(install_package), bold=True, fg="magenta")
            package_select = self.call('package.select', package=install_package)

            if package_select['version'] is None:
                raise CommandError("no install candidate for '{}', run 'moya-pm list' to see available packages".format(install_package))

            package_name = package_select['name']
            install_version = versioning.Version(package_select['version'])

            filename = package_select['md5']
            download_url = package_select['download']
            package_filename = download_url.rsplit('/', 1)[-1]

            libs = []
            output_fs = fsopendir(args.output)

            application = WSGIApplication(self.location, args.settings, disable_autoreload=True)
            archive = application.archive

            libs = [(lib.long_name, lib.version, lib.install_location)
                    for lib in archive.libs.values() if lib.long_name == package_name]

            force = args.force
            if not force:
                for name, version, location in libs:
                    if name == package_name:
                        if version > install_version:
                            if not args.force:
                                raise CommandError("a newer version ({}) is already installed, use --force to force installation".format(version))
                        elif install_version == version:
                            if not args.force:
                                raise CommandError("version {} is already installed, use --force to force installation".format(version))
                        else:
                            if not args.upgrade:
                                raise CommandError("an older version ({}) is installed, user --upgrade to force upgrade".format(version))
                        force = True

            username = self.settings.get('upload', 'username', None)
            password = self.settings.get('upload', 'password', None)
            if username and password:
                auth = (username, password)
            else:
                auth = None

            with TempFS('moyapi') as temp_fs:
                with temp_fs.open(filename, 'wb') as package_file:
                    checksum = downloader.download(download_url,
                                                   package_file,
                                                   console=console,
                                                   auth=auth,
                                                   verify_ssl=False)
                if checksum != package_select['md5']:
                    raise CommandError("md5 checksum of download doesn't match server! download={}, server={}".format(checksum, package_select['md5']))

                if args.download:
                    with fsopendir(args.download) as dest_fs:
                        fs.utils.copyfile(temp_fs, filename, dest_fs, package_filename)
                    return 0

                install_location = relativefrom(self.location, pathjoin(self.location, args.output, package_select['name']))
                package_select['location'] = install_location

                with temp_fs.open(filename, 'rb') as package_file:
                    with ZipFS(package_file, 'r') as package_fs:
                        with output_fs.makeopendir(package_select['name']) as lib_fs:
                            if not lib_fs.isdirempty('/') and not force:
                                raise CommandError("install directory is not empty, use --force to erase and overwrite")
                            fs.utils.remove_all(lib_fs, '/')
                            fs.utils.copydir(package_fs, lib_fs)
                            installed.append(package_select)

        table = []
        for _package in installed:
            table.append([Cell("{name}=={version}".format(**_package), fg="magenta", bold=True),
                          Cell(_package['location'], fg="blue", bold=True),
                          Cell(_package['notes'], italic=True)])

        if table:
            console.table(table, ['package', 'location', 'release notes'])
Example #14
0
 def relto(self, context, v):
     base = dirname(context.get('.request.path', '/'))
     return relativefrom(base, text_type(v))
Example #15
0
 def get_relative_path(self, path):
     """Get a relative path from the project base"""
     base = self.project_fs.getsyspath("/", allow_none=True)
     if base is None:
         return path
     return relativefrom(base, path)
Example #16
0
 def relto(self, context, v):
     base = dirname(context.get('.request.path', '/'))
     return relativefrom(base, text_type(v))
Example #17
0
 def get_relative_path(self, path):
     """Get a relative path from the project base"""
     base = self.project_fs.getsyspath('/', allow_none=True)
     if base is None:
         return path
     return relativefrom(base, path)
Example #18
0
    def run_install(self):
        args = self.args
        console = self.console

        console.div("installing {}".format(args.package), bold=True, fg="magenta")
        package_select = self.call('package.select', package=args.package)

        if package_select['version'] is None:
            raise CommandError("no install candidate for '{}', run 'moya-pm list' to see available packages".format(args.package))

        package_name = package_select['name']
        install_version = versioning.Version(package_select['version'])


        filename = package_select['md5']
        download_url = package_select['download']
        package_filename = download_url.rsplit('/', 1)[-1]

        libs = []
        output_fs = fsopendir(args.output)

        application = WSGIApplication(self.location, args.settings)
        archive = application.archive

        libs = [(lib.long_name, lib.version, lib.install_location)
                for lib in archive.libs.values() if lib.long_name == package_name]

        force = args.force
        if not force:
            for name, version, location in libs:
                if name == package_name:
                    if install_version > version:
                        if not args.force:
                            raise CommandError("a newer version ({}) is already installed, use --force to force installation".format(version))
                    elif install_version == version:
                        if not args.force:
                            raise CommandError("version {} is already installed, use --force to force installation".format(version))
                    else:
                        if not args.upgrade:
                            raise CommandError("an older version ({}) is installed, user --upgrade to force upgrade".format(version))
                    force = True

        installed = []

        username = self.settings.get('upload', 'username', None)
        password = self.settings.get('upload', 'password', None)
        if username and password:
            auth = (username, password)
        else:
            auth = None

        with TempFS('moyapi') as temp_fs:
            with temp_fs.open(filename, 'wb') as package_file:
                checksum = downloader.download(download_url,
                                               package_file,
                                               console=console,
                                               auth=auth)
            if checksum != package_select['md5']:
                raise CommandError("md5 checksum of download doesn't match server! download={}, server={}".format(checksum, package_select['md5']))

            if args.download:
                with fsopendir(args.download) as dest_fs:
                    fs.utils.copyfile(temp_fs, filename, dest_fs, package_filename)
                return 0

            install_location = relativefrom(self.location, pathjoin(self.location, args.output, package_select['name']))
            package_select['location'] = install_location

            with temp_fs.open(filename, 'rb') as package_file:
                with ZipFS(package_file, 'r') as package_fs:
                    with output_fs.makeopendir(package_select['name']) as lib_fs:
                        if not lib_fs.isdirempty('/') and not force:
                            raise CommandError("install directory is not empty, use --force to overwrite")
                        fs.utils.copydir(package_fs, lib_fs)
                        installed.append(package_select)

        table = []
        for package in installed:
            table.append([Cell("{name}=={version}".format(**package), fg="magenta", bold=True),
                          Cell(package['location'], fg="blue", bold=True),
                          Cell(package['notes'], italic=True)])

        if table:
            console.table(table, ['package', 'location', 'release notes'])