aboutsummaryrefslogtreecommitdiff
path: root/pypi/api.scm
blob: 9d884fbc20d6ed8d673f539ea9a49dbf098f3d18 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
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")))))