aboutsummaryrefslogtreecommitdiff
path: root/pypi/api.scm
diff options
context:
space:
mode:
Diffstat (limited to 'pypi/api.scm')
-rw-r--r--pypi/api.scm62
1 files changed, 62 insertions, 0 deletions
diff --git a/pypi/api.scm b/pypi/api.scm
new file mode 100644
index 0000000..9d884fb
--- /dev/null
+++ b/pypi/api.scm
@@ -0,0 +1,62 @@
+(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")))))