unofficial mirror of guix-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: ludo@gnu.org (Ludovic Courtès)
To: Cyril Roelandt <tipecaml@gmail.com>
Cc: guix-devel@gnu.org
Subject: Re: [PATCH] import: pypi: read requirements from wheels.
Date: Wed, 02 Mar 2016 10:54:26 +0100	[thread overview]
Message-ID: <87povdgq7h.fsf@gnu.org> (raw)
In-Reply-To: <1456541350-22214-1-git-send-email-tipecaml@gmail.com> (Cyril Roelandt's message of "Sat, 27 Feb 2016 03:49:10 +0100")

Cyril Roelandt <tipecaml@gmail.com> skribis:

> * guix/import/pypi.scm (latest-wheel-release): New procedure.

Could you list the other changes (new procedures, new tests, changed
procedures, etc.) in the commit log?

Also, could you add a note in “Invoking guix import” to mention how
Wheels is used?  The ‘unzip’ requirement should also be mentioned in a
footnote or something.

> +(define (wheel-url->extracted-directory wheel-url)
> +  (string-append
> +   (string-join
> +    (list-head
> +     (string-split (last (string-split wheel-url #\/))  #\-) 2)
> +    "-")
> +   ".dist-info"))

I find it a bit hard to follow.  What about something along these lines
(untested):

     (match (string-split (basename wheel-url) #/-)
       ((name version _ ...)
        (string-append name "-" version ".dist-info")))

> +  (define (read-wheel-metadata wheel-archive)
> +    ;; Given WHEEL-ARCHIVE, a ZIP Python wheel archive, return the package's
> +    ;; requirements.
> +    (let* ((dirname (wheel-url->extracted-directory wheel-url))
> +           (json-file (string-append dirname "/metadata.json")))
> +      (and (system* "unzip" "-q" wheel-archive json-file)

Should be:

  (and (zero? (system* …)) …)

> +(test-assert "pypi->guix-package, wheels"
> +  ;; Replace network resources with sample data.
> +  (mock ((guix import utils) url-fetch
> +         (lambda (url file-name)
> +           (match url
> +             ("https://pypi.python.org/pypi/foo/json"
> +              (with-output-to-file file-name
> +                (lambda ()
> +                  (display test-json))))
> +             ("https://example.com/foo-1.0.0.tar.gz"
> +               (begin
> +                 (mkdir "foo-1.0.0")
> +                 (with-output-to-file "foo-1.0.0/requirements.txt"
> +                   (lambda ()
> +                     (display test-requirements)))
> +                 (system* "tar" "czvf" file-name "foo-1.0.0/")
> +                 (delete-file-recursively "foo-1.0.0")
> +                 (set! test-source-hash
> +                       (call-with-input-file file-name port-sha256))))
> +             ("https://example.com/foo-1.0.0-py2.py3-none-any.whl"
> +               (begin
> +                 (mkdir "foo-1.0.0.dist-info")
> +                 (with-output-to-file "foo-1.0.0.dist-info/metadata.json"
> +                   (lambda ()
> +                     (display test-metadata)))
> +                 (let ((zip-file (string-append file-name ".zip")))
> +		   ;; zip always adds a "zip" extension to the file it creates,
   ^
Please remove tabs.

> +                   ;; so we need to rename it.
> +                   (system* "zip" zip-file "foo-1.0.0.dist-info/metadata.json")
> +                   (rename-file zip-file file-name))

This will fail if ‘zip’ is unavailable.  If this command is really
needed, the test should be skipped when it’s missing, for instance by
adding something like this above the test

  (test-skip (if (which "zip") 0 1))

… using ‘which’ from (guix build utils).

It seems that all these files are left behind no?  Could you make sure
they are removed?  That probably means putting them in a separate
directory, and then having:

  (dynamic-wind
    (const #t)
    (lambda ()
      ;; the body
      )
    (lambda ()
      (delete-file-recursively temp-dir)))

Could you send an updated patch?

Thank you!  It’s good to see the importer getting smarter.  :-)

Ludo’.

  reply	other threads:[~2016-03-02  9:54 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-01-21 22:08 [PATCH] import: pypi: read requirements from wheels Cyril Roelandt
2016-01-24 20:08 ` Ludovic Courtès
2016-01-24 20:26   ` Cyril Roelandt
2016-01-26 10:11     ` Ludovic Courtès
2016-02-27  2:49   ` Cyril Roelandt
2016-03-02  9:54     ` Ludovic Courtès [this message]
2016-03-25 23:24       ` Cyril Roelandt
2016-03-26  1:45       ` Cyril Roelandt
2016-05-06 20:27         ` Leo Famulari
2016-05-15 19:49           ` Ludovic Courtès
2016-06-14 20:14             ` Cyril Roelandt

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://guix.gnu.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87povdgq7h.fsf@gnu.org \
    --to=ludo@gnu.org \
    --cc=guix-devel@gnu.org \
    --cc=tipecaml@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/guix.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).