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}"><{text}></a>'''.format( tag_path=relative_tag_path, text=text)
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}"><{text}></a>'''.format(tag_path=relative_tag_path, text=text)
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}"><{text}></a>""".format( tag_path=relative_tag_path, text=text)
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)
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
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
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))
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))
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)
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)
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")
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'])
def relto(self, context, v): base = dirname(context.get('.request.path', '/')) return relativefrom(base, text_type(v))
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)
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)
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'])