~ruther/guix-local

bab020d7ca50e4153cf24832d119389a37fa8f63 — Cyril Roelandt 10 years ago 465b61f
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 PyPI
3 files changed, 54 insertions(+), 2 deletions(-)

M doc/guix.texi
M guix/import/pypi.scm
M guix/scripts/refresh.scm
M doc/guix.texi => doc/guix.texi +2 -0
@@ 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

M guix/import/pypi.scm => guix/import/pypi.scm +49 -1
@@ 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)))

M guix/scripts/refresh.scm => guix/scripts/refresh.scm +3 -1
@@ 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."