Skip to content

Commit 8d3b6ad

Browse files
authored
Merge pull request #277 from ilai-deutel/cratesio-prerelease
crates.io: skip pre-releases, list option
2 parents 3abe5ad + 5b56145 commit 8d3b6ad

File tree

7 files changed

+60
-10
lines changed

7 files changed

+60
-10
lines changed

docs/usage.rst

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -661,6 +661,11 @@ Check `crates.io <https://crates.io/>`_ for updates.
661661
cratesio
662662
The crate name on crates.io, e.g. ``tokio``.
663663

664+
use_pre_release
665+
Whether to accept pre release. Default is false.
666+
667+
This source supports :ref:`list options`.
668+
664669
Check Local Pacman Database
665670
~~~~~~~~~~~~~~~~~~~~~~~~~~~
666671
::

nvchecker_source/cratesio.py

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,40 @@
11
# MIT licensed
22
# Copyright (c) 2013-2020 lilydjwg <[email protected]>, et al.
33

4+
import re
5+
6+
import structlog
7+
48
from nvchecker.api import RichResult
59

10+
logger = structlog.get_logger(logger_name=__name__)
11+
12+
613
API_URL = 'https://crates.io/api/v1/crates/%s'
14+
# https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string
15+
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-]+)*))?$'
16+
717

818
async def get_version(name, conf, *, cache, **kwargs):
919
name = conf.get('cratesio') or name
20+
use_pre_release = conf.get('use_pre_release', False)
1021
data = await cache.get_json(API_URL % name)
11-
version = [v['num'] for v in data['versions'] if not v['yanked']][0]
12-
return RichResult(
13-
version = version,
14-
url = f'https://crates.io/crates/{name}/{version}',
15-
)
22+
results = []
23+
for v in data['versions']:
24+
if v['yanked']:
25+
continue
26+
version = v['num']
27+
match = re.fullmatch(VERSION_PATTERN, version)
28+
if match is None:
29+
logger.warning('ignoring invalid version', version=version)
30+
continue
31+
if not use_pre_release and match.group('prerelease'):
32+
continue
33+
results.append(
34+
RichResult(
35+
version=version,
36+
url=f'https://crates.io/crates/{name}/{version}',
37+
)
38+
)
39+
40+
return results

tests/test_android_sdk.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ async def test_android_package(get_version):
1717
"source": "android_sdk",
1818
"android_sdk": "cmake;",
1919
"repo": "package",
20-
}) == "3.22.1"
20+
}) == "3.30.3"
2121

2222

2323
async def test_android_package_channel(get_version):

tests/test_archpkg.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@ async def test_archpkg_provided(get_version):
2626

2727
@pytest.mark.flaky
2828
async def test_archpkg_provided_strip(get_version):
29-
assert await get_version("jsoncpp", {
29+
int(await get_version("jsoncpp", {
3030
"source": "archpkg",
3131
"provided": "libjsoncpp.so",
3232
"strip_release": True,
33-
}) == "25"
33+
}))
3434

tests/test_cratesio.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,23 @@ async def test_cratesio(get_version):
88
assert await get_version("example", {
99
"source": "cratesio",
1010
}) == "1.1.0"
11+
12+
async def test_cratesio_list(get_version):
13+
assert await get_version("example", {
14+
"source": "cratesio",
15+
"include_regex": r"^1\.0.*",
16+
}) == "1.0.2"
17+
18+
async def test_cratesio_skip_prerelease(get_version):
19+
with pytest.raises(RuntimeError, match='include_regex matched no versions'):
20+
await get_version("cargo-lock", {
21+
"source": "cratesio",
22+
"include_regex": r".*-.*",
23+
})
24+
25+
async def test_cratesio_use_prerelease(get_version):
26+
await get_version("cargo-lock", {
27+
"source": "cratesio",
28+
"use_pre_release": "true",
29+
"include_regex": r".*-.*",
30+
})

tests/test_launchpad.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,4 @@ async def test_launchpad(get_version):
1212
}
1313
)
1414

15-
assert version == '3.8.7'
15+
assert version == '3.8.8'

tests/test_pypi.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ async def test_pypi_list(get_version):
2525
assert await get_version("urllib3", {
2626
"source": "pypi",
2727
"include_regex": "^1\\..*",
28-
}) == "1.26.19"
28+
}) == "1.26.20"
2929

3030
async def test_pypi_invalid_version(get_version):
3131
await get_version("sympy", {

0 commit comments

Comments
 (0)