diff env/lib/python3.7/site-packages/planemo/shed_lint.py @ 5:9b1c78e6ba9c draft default tip

"planemo upload commit 6c0a8142489327ece472c84e558c47da711a9142"
author shellac
date Mon, 01 Jun 2020 08:59:25 -0400
parents 79f47841a781
children
line wrap: on
line diff
--- a/env/lib/python3.7/site-packages/planemo/shed_lint.py	Thu May 14 16:47:39 2020 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,359 +0,0 @@
-"""Logic related to linting shed repositories."""
-from __future__ import absolute_import
-
-import os
-import xml.etree.ElementTree as ET
-
-import yaml
-from galaxy.tool_util.lint import lint_tool_source_with
-from galaxy.tool_util.linters.help import rst_invalid
-from galaxy.util import unicodify
-
-from planemo.io import info
-from planemo.lint import (
-    handle_lint_complete,
-    lint_urls,
-    lint_xsd,
-    setup_lint,
-)
-from planemo.shed import (
-    CURRENT_CATEGORIES,
-    REPO_TYPE_SUITE,
-    REPO_TYPE_TOOL_DEP,
-    REPO_TYPE_UNRESTRICTED,
-    validate_repo_name,
-    validate_repo_owner,
-)
-from planemo.shed2tap import base
-from planemo.tool_lint import (
-    handle_tool_load_error,
-)
-from planemo.tools import yield_tool_sources
-from planemo.xml import XSDS_PATH
-
-
-TOOL_DEPENDENCIES_XSD = os.path.join(XSDS_PATH, "tool_dependencies.xsd")
-REPO_DEPENDENCIES_XSD = os.path.join(XSDS_PATH, "repository_dependencies.xsd")
-
-
-VALID_REPOSITORY_TYPES = [
-    REPO_TYPE_UNRESTRICTED,
-    REPO_TYPE_TOOL_DEP,
-    REPO_TYPE_SUITE,
-]
-
-SHED_METADATA = [
-    "description",
-    "long_description",
-    "remote_repository_url",
-    "homepage_url",
-    "categories",
-]
-
-
-def lint_repository(ctx, realized_repository, **kwds):
-    """Lint a realized shed repository.
-
-    See :mod:`planemo.shed` for details on constructing a realized
-    repository data structure.
-    """
-    failed = False
-    path = realized_repository.real_path
-    info("Linting repository %s" % path)
-    lint_args, lint_ctx = setup_lint(ctx, **kwds)
-    lint_ctx.lint(
-        "lint_expansion",
-        lint_expansion,
-        realized_repository,
-    )
-    lint_ctx.lint(
-        "lint_expected_files",
-        lint_expected_files,
-        realized_repository,
-    )
-    lint_ctx.lint(
-        "lint_tool_dependencies_xsd",
-        lint_tool_dependencies_xsd,
-        realized_repository,
-    )
-    lint_ctx.lint(
-        "lint_tool_dependencies_sha256sum",
-        lint_tool_dependencies_sha256sum,
-        realized_repository,
-    )
-    lint_ctx.lint(
-        "lint_tool_dependencies_actions",
-        lint_tool_dependencies_actions,
-        realized_repository,
-    )
-    lint_ctx.lint(
-        "lint_repository_dependencies",
-        lint_repository_dependencies,
-        realized_repository,
-    )
-    lint_ctx.lint(
-        "lint_shed_yaml",
-        lint_shed_yaml,
-        realized_repository,
-    )
-    lint_ctx.lint(
-        "lint_readme",
-        lint_readme,
-        realized_repository,
-    )
-    if kwds["urls"]:
-        lint_ctx.lint(
-            "lint_urls",
-            lint_tool_dependencies_urls,
-            realized_repository,
-        )
-    if kwds["tools"]:
-        tools_failed = lint_repository_tools(ctx, realized_repository, lint_ctx, lint_args)
-        failed = failed or tools_failed
-    if kwds["ensure_metadata"]:
-        lint_ctx.lint(
-            "lint_shed_metadata",
-            lint_shed_metadata,
-            realized_repository,
-        )
-    return handle_lint_complete(lint_ctx, lint_args, failed=failed)
-
-
-def lint_repository_tools(ctx, realized_repository, lint_ctx, lint_args):
-    path = realized_repository.path
-    for (tool_path, tool_source) in yield_tool_sources(ctx, path,
-                                                       recursive=True):
-        original_path = tool_path.replace(path, realized_repository.real_path)
-        info("+Linting tool %s" % original_path)
-        if handle_tool_load_error(tool_path, tool_source):
-            return True
-        lint_tool_source_with(
-            lint_ctx,
-            tool_source,
-            extra_modules=lint_args["extra_modules"]
-        )
-
-
-def lint_expansion(realized_repository, lint_ctx):
-    missing = realized_repository.missing
-    if missing:
-        msg = "Failed to expand inclusions %s" % missing
-        lint_ctx.warn(msg)
-    else:
-        lint_ctx.info("Included files all found.")
-
-
-def lint_shed_metadata(realized_repository, lint_ctx):
-    found_all = True
-    for key in SHED_METADATA:
-        if key not in realized_repository.config:
-            found_all = False
-            lint_ctx.warn(
-                "Missing shed metadata field [%s] for repository" % key
-            )
-    if found_all:
-        lint_ctx.info(
-            "Found all shed metadata fields required for automated repository "
-            "creation and/or updates."
-        )
-
-
-def lint_readme(realized_repository, lint_ctx):
-    path = realized_repository.real_path
-    readme_rst = os.path.join(path, "README.rst")
-    readme = os.path.join(path, "README")
-    readme_txt = os.path.join(path, "README.txt")
-
-    readme_found = False
-    for readme in [readme_rst, readme, readme_txt]:
-        if os.path.exists(readme):
-            readme_found = readme
-
-    readme_md = os.path.join(path, "README.md")
-    if not readme_found and os.path.exists(readme_md):
-        lint_ctx.warn("Tool Shed doesn't render markdown, "
-                      "README.md is invalid readme.")
-        return
-
-    if not readme_found:
-        # TODO: filter on TYPE and make this a warning if
-        # unrestricted repository - need to update iuc standards
-        # first though.
-        lint_ctx.info("No README found skipping.")
-        return
-
-    if readme_found.endswith(".rst"):
-        with open(readme_found, "r") as fh:
-            readme_text = fh.read()
-        invalid_rst = rst_invalid(readme_text)
-        if invalid_rst:
-            template = "Invalid restructured text found in README [%s]."
-            msg = template % invalid_rst
-            lint_ctx.warn(msg)
-            return
-        lint_ctx.info("README found containing valid reStructuredText.")
-    else:
-        lint_ctx.info("README found containing plain text.")
-
-
-def lint_tool_dependencies_urls(realized_repository, lint_ctx):
-    path = realized_repository.real_path
-    tool_dependencies = os.path.join(path, "tool_dependencies.xml")
-    if not os.path.exists(tool_dependencies):
-        lint_ctx.info("No tool_dependencies.xml, skipping.")
-        return
-
-    root = ET.parse(tool_dependencies).getroot()
-    lint_urls(root, lint_ctx)
-
-
-def lint_tool_dependencies_sha256sum(realized_repository, lint_ctx):
-    tool_dependencies = os.path.join(realized_repository.real_path, "tool_dependencies.xml")
-    if not os.path.exists(tool_dependencies):
-        lint_ctx.info("No tool_dependencies.xml, skipping.")
-        return
-
-    root = ET.parse(tool_dependencies).getroot()
-
-    count = 0
-    for action in root.findall(".//action"):
-        assert action.tag == "action"
-        if action.attrib.get('type', '') not in ['download_by_url', 'download_file']:
-            continue
-        url = action.text.strip()
-        checksum = action.attrib.get('sha256sum', '')
-        if not checksum:
-            lint_ctx.warn("Missing checksum for %s" % url)
-        elif len(checksum) != 64 or not set("0123456789abcdef").issuperset(checksum.lower()):
-            lint_ctx.error("Invalid checksum %r for %s" % (checksum, url))
-        else:
-            # TODO - See planned --verify option to check it matches
-            # lint_ctx.info("SHA256 checkum listed for %s" % url)
-            count += 1
-    if count:
-        lint_ctx.info("Found %i download action(s) with SHA256 checksums" % count)
-
-
-def lint_tool_dependencies_xsd(realized_repository, lint_ctx):
-    path = realized_repository.real_path
-    tool_dependencies = os.path.join(path, "tool_dependencies.xml")
-    if not os.path.exists(tool_dependencies):
-        lint_ctx.info("No tool_dependencies.xml, skipping.")
-        return
-    lint_xsd(lint_ctx, TOOL_DEPENDENCIES_XSD, tool_dependencies)
-
-
-def lint_tool_dependencies_actions(realized_repository, lint_ctx):
-    path = realized_repository.real_path
-    tool_dependencies = os.path.join(path, "tool_dependencies.xml")
-    if not os.path.exists(tool_dependencies):
-        lint_ctx.info("No tool_dependencies.xml, skipping.")
-        return
-    try:
-        base.Dependencies(tool_dependencies)
-        lint_ctx.info("Parsed tool dependencies.")
-    except Exception as e:
-        import sys
-        import traceback
-        exc_type, exc_value, exc_traceback = sys.exc_info()
-        traceback.print_tb(exc_traceback, limit=1, file=sys.stdout)
-        traceback.print_exc()
-        template = "Problem parsing tool_dependenies.xml [%s]"
-        msg = template % unicodify(e)
-        lint_ctx.warn(msg)
-        return
-
-
-def lint_expected_files(realized_repository, lint_ctx):
-    if realized_repository.is_package:
-        if not os.path.exists(realized_repository.tool_dependencies_path):
-            lint_ctx.warn("Package repository does not contain a "
-                          "tool_dependencies.xml file.")
-
-    if realized_repository.is_suite:
-        if not os.path.exists(realized_repository.repo_dependencies_path):
-            lint_ctx.warn("Suite repository does not contain a "
-                          "repository_dependencies.xml file.")
-
-
-def lint_repository_dependencies(realized_repository, lint_ctx):
-    path = realized_repository.real_path
-    repo_dependencies = os.path.join(path, "repository_dependencies.xml")
-    if not os.path.exists(repo_dependencies):
-        lint_ctx.info("No repository_dependencies.xml, skipping.")
-        return
-    lint_xsd(lint_ctx, REPO_DEPENDENCIES_XSD, repo_dependencies)
-
-
-def lint_shed_yaml(realized_repository, lint_ctx):
-    path = realized_repository.real_path
-    shed_yaml = os.path.join(path, ".shed.yml")
-    if not os.path.exists(shed_yaml):
-        lint_ctx.info("No .shed.yml file found, skipping.")
-        return
-    try:
-        with open(shed_yaml, "r") as fh:
-            yaml.safe_load(fh)
-    except Exception as e:
-        lint_ctx.warn("Failed to parse .shed.yml file [%s]" % unicodify(e))
-        return
-    lint_ctx.info(".shed.yml found and appears to be valid YAML.")
-    _lint_shed_contents(lint_ctx, realized_repository)
-
-
-def _lint_shed_contents(lint_ctx, realized_repository):
-    config = realized_repository.config
-
-    def _lint_if_present(key, func, *args):
-        value = config.get(key, None)
-        if value is not None:
-            msg = func(value, *args)
-            if msg:
-                lint_ctx.warn(msg)
-
-    _lint_if_present("owner", validate_repo_owner)
-    _lint_if_present("name", validate_repo_name)
-    _lint_if_present("type", _validate_repo_type, config["name"])
-    _lint_if_present("categories", _validate_categories, realized_repository)
-
-
-def _validate_repo_type(repo_type, name):
-    if repo_type not in VALID_REPOSITORY_TYPES:
-        return "Invalid repository type specified [%s]" % repo_type
-
-    is_dep = repo_type == "tool_dependency_definition"
-    is_suite = repo_type == "repository_suite_definition"
-    if is_dep and not name.startswith("package_"):
-        return ("Tool dependency definition repositories should have names "
-                "starting with package_")
-    if is_suite and not name.startswith("suite_"):
-        return ("Repository suite definition repositories should have names "
-                "starting with suite_")
-    if name.startswith("package_") or name.startswith("suite_"):
-        if repo_type == "unrestricted":
-            return ("Repository name indicated specialized repository type "
-                    "but repository is listed as unrestricted.")
-
-
-def _validate_categories(categories, realized_repository):
-    msg = None
-    if len(categories) == 0:
-        msg = "Repository should specify one or more categories."
-    else:
-        for category in categories:
-            unknown_categories = []
-            if category not in CURRENT_CATEGORIES:
-                unknown_categories.append(category)
-            if unknown_categories:
-                msg = "Categories [%s] unknown." % unknown_categories
-        if realized_repository.is_package:
-            if "Tool Dependency Packages" not in categories:
-                msg = ("Packages should be placed and should only be placed "
-                       "in the category 'Tool Dependency Packages'.")
-
-    return msg
-
-
-__all__ = (
-    "lint_repository",
-)