import: pypi: add updater
* guix/import/pypi.scm (guix-package->pypi-name, latest-release): New procedures. (%pypi-updater): New variable. * guix/scripts/refresh.scm (%updaters): Add %PYPI-UPDATER. * doc/guix.texi (Invoking guix refresh): Mention PyPImaster
parent
465b61fcd6
commit
bab020d7ca
|
@ -4291,6 +4291,8 @@ the updater for GNU packages;
|
|||
the updater for @uref{http://elpa.gnu.org/, ELPA} packages;
|
||||
@item cran
|
||||
the updater fro @uref{http://cran.r-project.org/, CRAN} packages.
|
||||
@item pypi
|
||||
the updater fro @uref{https://pypi.python.org, PyPI} packages.
|
||||
@end table
|
||||
|
||||
For instance, the following commands only checks for updates of Emacs
|
||||
|
|
|
@ -30,12 +30,16 @@
|
|||
#:use-module (guix ui)
|
||||
#:use-module (guix utils)
|
||||
#:use-module (guix import utils)
|
||||
#:use-module ((guix download) #:prefix download:)
|
||||
#:use-module (guix import json)
|
||||
#:use-module (guix packages)
|
||||
#:use-module (guix upstream)
|
||||
#:use-module (guix licenses)
|
||||
#:use-module (guix build-system python)
|
||||
#:use-module (gnu packages)
|
||||
#:use-module (gnu packages python)
|
||||
#:export (pypi->guix-package))
|
||||
#:export (pypi->guix-package
|
||||
%pypi-updater))
|
||||
|
||||
(define (pypi-fetch name)
|
||||
"Return an alist representation of the PyPI metadata for the package NAME,
|
||||
|
@ -60,6 +64,16 @@ package."
|
|||
(snake-case name)
|
||||
(string-append "python-" (snake-case name))))
|
||||
|
||||
(define (guix-package->pypi-name package)
|
||||
"Given a Python PACKAGE built from pypi.python.org, return the name of the
|
||||
package on PyPI."
|
||||
(let ((source-url (and=> (package-source package) origin-uri)))
|
||||
;; The URL has the form:
|
||||
;; 'https://pypi.python.org/packages/source/' +
|
||||
;; first letter of the package name +
|
||||
;; '/' + package name + '/' + ...
|
||||
(substring source-url 42 (string-rindex source-url #\/))))
|
||||
|
||||
(define (maybe-inputs package-inputs)
|
||||
"Given a list of PACKAGE-INPUTS, tries to generate the 'inputs' field of a
|
||||
package definition."
|
||||
|
@ -190,3 +204,37 @@ VERSION, SOURCE-URL, HOME-PAGE, SYNOPSIS, DESCRIPTION, and LICENSE."
|
|||
(license (string->license (assoc-ref* package "info" "license"))))
|
||||
(make-pypi-sexp name version release home-page synopsis
|
||||
description license)))))
|
||||
|
||||
(define (pypi-package? package)
|
||||
"Return true if PACKAGE is a Python package from PyPI."
|
||||
|
||||
(define (pypi-url? url)
|
||||
(string-prefix? "https://pypi.python.org/" url))
|
||||
|
||||
(let ((source-url (and=> (package-source package) origin-uri))
|
||||
(fetch-method (and=> (package-source package) origin-method)))
|
||||
(and (eq? fetch-method download:url-fetch)
|
||||
(match source-url
|
||||
((? string?)
|
||||
(pypi-url? source-url))
|
||||
((source-url ...)
|
||||
(any pypi-url? source-url))))))
|
||||
|
||||
(define (latest-release guix-package)
|
||||
"Return an <upstream-source> for the latest release of GUIX-PACKAGE."
|
||||
(let* ((pypi-name (guix-package->pypi-name
|
||||
(specification->package guix-package)))
|
||||
(metadata (pypi-fetch pypi-name))
|
||||
(version (assoc-ref* metadata "info" "version"))
|
||||
(url (assoc-ref (latest-source-release metadata) "url")))
|
||||
(upstream-source
|
||||
(package guix-package)
|
||||
(version version)
|
||||
(urls (list url)))))
|
||||
|
||||
(define %pypi-updater
|
||||
(upstream-updater
|
||||
(name 'pypi)
|
||||
(description "Updater for PyPI packages")
|
||||
(pred pypi-package?)
|
||||
(latest latest-release)))
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
#:use-module ((guix gnu-maintenance) #:select (%gnu-updater))
|
||||
#:use-module (guix import elpa)
|
||||
#:use-module (guix import cran)
|
||||
#:use-module (guix import pypi)
|
||||
#:use-module (guix gnupg)
|
||||
#:use-module (gnu packages)
|
||||
#:use-module ((gnu packages commencement) #:select (%final-inputs))
|
||||
|
@ -152,7 +153,8 @@ specified with `--select'.\n"))
|
|||
;; List of "updaters" used by default. They are consulted in this order.
|
||||
(list %gnu-updater
|
||||
%elpa-updater
|
||||
%cran-updater))
|
||||
%cran-updater
|
||||
%pypi-updater))
|
||||
|
||||
(define (lookup-updater name)
|
||||
"Return the updater called NAME."
|
||||
|
|
Reference in New Issue