Mercurial > repos > shellac > guppy_basecaller
diff env/lib/python3.7/site-packages/planemo/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/lint.py Thu May 14 16:47:39 2020 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,178 +0,0 @@ -"""Utilities to help linting various targets.""" -from __future__ import absolute_import - -import os - -import requests -from galaxy.tool_util.lint import LintContext -from six.moves.urllib.request import urlopen - -import planemo.linters.biocontainer_registered -import planemo.linters.conda_requirements -import planemo.linters.doi -import planemo.linters.urls -import planemo.linters.xsd -from planemo.io import error -from planemo.shed import find_urls_for_xml -from planemo.xml import validation - - -def build_lint_args(ctx, **kwds): - """Handle common report, error, and skip linting arguments.""" - report_level = kwds.get("report_level", "all") - fail_level = kwds.get("fail_level", "warn") - skip = kwds.get("skip", None) - if skip is None: - skip = ctx.global_config.get("lint_skip", "") - if isinstance(skip, list): - skip = ",".join(skip) - - skip_types = [s.strip() for s in skip.split(",")] - lint_args = dict( - level=report_level, - fail_level=fail_level, - extra_modules=_lint_extra_modules(**kwds), - skip_types=skip_types, - ) - return lint_args - - -# TODO: Move this back to tool_lint. -def _lint_extra_modules(**kwds): - linters = [] - if kwds.get("xsd", True): - linters.append(planemo.linters.xsd) - - if kwds.get("doi", False): - linters.append(planemo.linters.doi) - - if kwds.get("urls", False): - linters.append(planemo.linters.urls) - - if kwds.get("conda_requirements", False): - linters.append(planemo.linters.conda_requirements) - - if kwds.get("biocontainer", False): - linters.append(planemo.linters.biocontainer_registered) - - return linters - - -def setup_lint(ctx, **kwds): - """Setup lint_args and lint_ctx to begin linting a target.""" - lint_args = build_lint_args(ctx, **kwds) - lint_ctx = LintContext(lint_args["level"]) - return lint_args, lint_ctx - - -def handle_lint_complete(lint_ctx, lint_args, failed=False): - """Complete linting of a target and decide exit code.""" - if not failed: - failed = lint_ctx.failed(lint_args["fail_level"]) - if failed: - error("Failed linting") - return 1 if failed else 0 - - -def lint_dois(tool_xml, lint_ctx): - """Find referenced DOIs and check they have valid with https://doi.org.""" - dois = find_dois_for_xml(tool_xml) - for publication in dois: - is_doi(publication, lint_ctx) - - -def find_dois_for_xml(tool_xml): - dois = [] - for element in tool_xml.getroot().findall("citations"): - for citation in list(element): - if citation.tag == 'citation' and citation.attrib.get('type', '') == 'doi': - dois.append(citation.text) - return dois - - -def is_doi(publication_id, lint_ctx): - """Check if dx.doi knows about the ``publication_id``.""" - base_url = "https://doi.org" - if publication_id is None: - lint_ctx.error('Empty DOI citation') - return - publication_id = publication_id.strip() - doiless_publication_id = publication_id.split("doi:", 1)[-1] - if not doiless_publication_id: - lint_ctx.error('Empty DOI citation') - return - url = "%s/%s" % (base_url, doiless_publication_id) - r = requests.get(url) - if r.status_code == 200: - if publication_id != doiless_publication_id: - lint_ctx.error("%s is valid, but Galaxy expects DOI without 'doi:' prefix" % publication_id) - else: - lint_ctx.info("%s is a valid DOI" % publication_id) - elif r.status_code == 404: - lint_ctx.error("%s is not a valid DOI" % publication_id) - else: - lint_ctx.warn("dx.doi returned unexpected status code %d" % r.status_code) - - -def lint_xsd(lint_ctx, schema_path, path): - """Lint XML at specified path with supplied schema.""" - name = lint_ctx.object_name or os.path.basename(path) - validator = validation.get_validator(require=True) - validation_result = validator.validate(schema_path, path) - if not validation_result.passed: - msg = "Invalid XML found in file: %s. Errors [%s]" - msg = msg % (name, validation_result.output) - lint_ctx.error(msg) - else: - lint_ctx.info("File validates against XML schema.") - - -def lint_urls(root, lint_ctx): - """Find referenced URLs and verify they are valid.""" - urls, docs = find_urls_for_xml(root) - - # This is from Google Chome on macOS, current at time of writing: - BROWSER_USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36" - - def validate_url(url, lint_ctx, user_agent=None): - is_valid = True - if url.startswith('http://') or url.startswith('https://'): - if user_agent: - headers = {"User-Agent": user_agent, 'Accept': '*/*'} - else: - headers = None - r = None - try: - r = requests.get(url, headers=headers, stream=True) - r.raise_for_status() - next(r.iter_content(1000)) - except Exception as e: - if r and r.status_code == 429: - # too many requests - pass - else: - is_valid = False - lint_ctx.error("Error '%s' accessing %s" % (e, url)) - else: - try: - with urlopen(url) as handle: - handle.read(100) - except Exception as e: - is_valid = False - lint_ctx.error("Error '%s' accessing %s" % (e, url)) - if is_valid: - lint_ctx.info("URL OK %s" % url) - - for url in urls: - validate_url(url, lint_ctx) - for url in docs: - validate_url(url, lint_ctx, BROWSER_USER_AGENT) - - -__all__ = ( - "build_lint_args", - "handle_lint_complete", - "lint_dois", - "lint_urls", - "lint_xsd", -)