File: cratesio.py

package info (click to toggle)
python-nvchecker 2.16-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 736 kB
  • sloc: python: 4,801; makefile: 25
file content (40 lines) | stat: -rw-r--r-- 1,278 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# MIT licensed
# Copyright (c) 2013-2020 lilydjwg <lilydjwg@gmail.com>, et al.

import re

import structlog

from nvchecker.api import RichResult

logger = structlog.get_logger(logger_name=__name__)


API_URL = 'https://crates.io/api/v1/crates/%s'
# https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string
VERSION_PATTERN = r'^(?P<major>0|[1-9]\d*)\.(?P<minor>0|[1-9]\d*)\.(?P<patch>0|[1-9]\d*)(?:-(?P<prerelease>(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+(?P<buildmetadata>[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$'


async def get_version(name, conf, *, cache, **kwargs):
  name = conf.get('cratesio') or name
  use_pre_release = conf.get('use_pre_release', False)
  data = await cache.get_json(API_URL % name)
  results = []
  for v in data['versions']:
    if v['yanked']:
      continue
    version = v['num']
    match = re.fullmatch(VERSION_PATTERN, version)
    if match is None:
      logger.warning('ignoring invalid version', version=version)
      continue
    if not use_pre_release and match.group('prerelease'):
      continue
    results.append(
      RichResult(
        version=version,
        url=f'https://crates.io/crates/{name}/{version}',
      )
    )

  return results