Merge pull request #102 from figsoda/fetchcrate

add fetchCrate support
This commit is contained in:
Jörg Thalheim 2022-11-14 16:25:54 +01:00 committed by GitHub
commit 3a5f9c529a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 64 additions and 1 deletions

View File

@ -6,6 +6,7 @@ designed to work with nixpkgs but also other package sets.
## Features
- automatically figure out the latest version of packages from:
- crates.io
- github.com
- gitlab.com or other instances that uses fetchFromGitLab
- pypi

View File

@ -78,7 +78,7 @@ def nix_prefetch(expr: str) -> str:
[
"nix-build",
"--expr",
f'({expr}).overrideAttrs (_: {{ outputHash = ""; outputHashAlgo = "sha256"; }})',
f'let src = {expr}; in (src.overrideAttrs or (f: src // f src)) (_: {{ outputHash = ""; outputHashAlgo = "sha256"; }})',
],
extra_env=extra_env,
check=False,

View File

@ -3,6 +3,7 @@ from typing import List, Callable, Optional
import re
from ..errors import VersionError
from .crate import fetch_crate_versions
from .github import fetch_github_versions
from .gitlab import fetch_gitlab_versions
from .pypi import fetch_pypi_versions
@ -21,6 +22,7 @@ from .version import VersionPreference, Version
# return None
fetchers: List[Callable[[ParseResult], List[Version]]] = [
fetch_crate_versions,
fetch_pypi_versions,
fetch_github_versions,
fetch_gitlab_versions,

View File

@ -0,0 +1,19 @@
import json
import urllib.request
from typing import List
from urllib.parse import ParseResult
from ..utils import info
from .version import Version
def fetch_crate_versions(url: ParseResult) -> List[Version]:
if url.netloc != "crates.io":
return []
parts = url.path.split("/")
package = parts[4]
crate_url = f"https://crates.io/api/v1/crates/{package}/versions"
info(f"fetch {crate_url}")
resp = urllib.request.urlopen(crate_url)
data = json.loads(resp.read())
return [Version(version["num"]) for version in data["versions"]]

27
tests/test_crate.py Normal file
View File

@ -0,0 +1,27 @@
#!/usr/bin/env python3
from nix_update.options import Options
from nix_update.update import update
import subprocess
import conftest
def test_update(helpers: conftest.Helpers) -> None:
with helpers.testpkgs() as path:
opts = Options(attribute="crate", import_path=str(path))
update(opts)
version = subprocess.run(
[
"nix",
"eval",
"--raw",
"--extra-experimental-features",
"nix-command",
"-f",
path,
"crate.version",
],
text=True,
stdout=subprocess.PIPE,
)
assert version.stdout.strip() >= "8.5.2"

13
tests/testpkgs/crate.nix Normal file
View File

@ -0,0 +1,13 @@
{ rustPlatform, fetchCrate }:
rustPlatform.buildRustPackage rec {
pname = "fd-find";
version = "8.0.0";
src = fetchCrate {
inherit pname version;
sha256 = "";
};
cargoSha256 = "";
}

View File

@ -1,5 +1,6 @@
{ pkgs ? import <nixpkgs> {} }:
{
crate = pkgs.callPackage ./crate.nix {};
pypi = pkgs.python3.pkgs.callPackage ./pypi.nix {};
sourcehut = pkgs.python3.pkgs.callPackage ./sourcehut.nix {};
savanna = pkgs.python3.pkgs.callPackage ./savanna.nix {};