(define-module (pypi api) #:use-module (json) #:use-module (logging logger) #:use-module (web uri) #: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 (ice-9 match) #:use-module (ice-9 pretty-print) #:use-module (gnu packages python) #:use-module (pypi version) #:export (pypi-fetch get-sdist-releases available-versions)) (define pypi-fetch (memoize (lambda (name api-root) (begin (log-msg 'INFO (string-append "Fetching... " name)) (let ((data (call-with-output-file "/dev/null" (lambda (null) (with-error-to-port (current-error-port) (lambda () (json-fetch (string-append api-root name "/json")))))))) (if (eq? data #f) (begin (error (string-append "data from " api-root " is false")) (sleep 2) (pypi-fetch name api-root)) data)))))) (define (available-versions name api-root) (sort-versions (map car (get-sdist-releases (pypi-fetch name api-root))))) (define (get-sdist-releases data) (filter (match-lambda ((version . releases) (> (length (car releases)) 0))) (map (match-lambda ((version . releases) (list version (filter (lambda (r) (string=? "sdist" (assoc-ref r "packagetype"))) releases)))) (filter (lambda (r) (> (length r) 1)) (assoc-ref* data "releases")))))