guix-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[bug#57694] [PATCH 1/1] import: gem: Support for importing a specified v


From: Taiju HIGASHI
Subject: [bug#57694] [PATCH 1/1] import: gem: Support for importing a specified version of a gem.
Date: Wed, 14 Sep 2022 18:55:45 +0900
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/28.1 (gnu/linux)

Hi Chris,

Could you give me your opinion on this patch?
Is this patch worth it?

Taiju HIGASHI <higashi@taiju.info> writes:

> * guix/import/gem.scm: (rubygems-fetch, gem->guix-package)
> (gem-recursive-import): Fix to fetch the specified version of the gem.
> * guix/scripts/import/gem.scm (show-help): Modify the help message.
> (guix-import-gem): Modify the version number to be passed to subsequent
> procedures
> * tests/gem.scm: Add tests.
> ---
>  guix/import/gem.scm         |  19 ++++--
>  guix/scripts/import/gem.scm |  39 +++++++------
>  tests/gem.scm               | 113 ++++++++++++++++++++++++++++++++++++
>  3 files changed, 148 insertions(+), 23 deletions(-)
>
> diff --git a/guix/import/gem.scm b/guix/import/gem.scm
> index 0e5bb7e635..ad1343bff4 100644
> --- a/guix/import/gem.scm
> +++ b/guix/import/gem.scm
> @@ -5,6 +5,7 @@
>  ;;; Copyright © 2020, 2021 Ludovic Courtès <ludo@gnu.org>
>  ;;; Copyright © 2020 Martin Becze <mjbecze@riseup.net>
>  ;;; Copyright © 2021 Sarah Morgensen <iskarian@mgsn.dev>
> +;;; Copyright © 2022 Taiju HIGASHI <higashi@taiju.info>
>  ;;;
>  ;;; This file is part of GNU Guix.
>  ;;;
> @@ -81,10 +82,12 @@ (define-json-mapping <gem-dependency> make-gem-dependency 
> gem-dependency?
>    (requirements  gem-dependency-requirements))    ;string
>
>
> -(define (rubygems-fetch name)
> -  "Return a <gem> record for the package NAME, or #f on failure."
> +(define* (rubygems-fetch name #:optional version)
> +  "Return a <gem> record for the package NAME and VERSION, or #f on failure. 
>  If VERSION is #f or missing, return the latest version gem."
>    (and=> (json-fetch
> -          (string-append "https://rubygems.org/api/v1/gems/"; name ".json"))
> +          (if version
> +              (string-append "https://rubygems.org/api/v2/rubygems/"; name 
> "/versions/" version ".json")
> +              (string-append "https://rubygems.org/api/v1/gems/"; name 
> ".json")))
>           json->gem))
>
>  (define (ruby-package-name name)
> @@ -122,8 +125,11 @@ (define (make-gem-sexp name version hash home-page 
> synopsis description
>
>  (define* (gem->guix-package package-name #:key (repo 'rubygems) version)
>    "Fetch the metadata for PACKAGE-NAME from rubygems.org, and return the
> -`package' s-expression corresponding to that package, or #f on failure."
> -  (let ((gem (rubygems-fetch package-name)))
> +`package' s-expression corresponding to that package, or #f on failure.
> +Optionally include a VERSION string to fetch a specific version gem."
> +  (let ((gem (if version
> +                 (rubygems-fetch package-name version)
> +                 (rubygems-fetch package-name))))
>      (if gem
>          (let* ((dependencies-names (map gem-dependency-name
>                                          (gem-dependencies-runtime
> @@ -189,4 +195,5 @@ (define* (gem-recursive-import package-name #:optional 
> version)
>    (recursive-import package-name
>                      #:repo '()
>                      #:repo->guix-package gem->guix-package
> -                    #:guix-name ruby-package-name))
> +                    #:guix-name ruby-package-name
> +                    #:version version))
> diff --git a/guix/scripts/import/gem.scm b/guix/scripts/import/gem.scm
> index 82deac16ad..2e646e4475 100644
> --- a/guix/scripts/import/gem.scm
> +++ b/guix/scripts/import/gem.scm
> @@ -4,6 +4,7 @@
>  ;;; Copyright © 2021 Sarah Morgensen <iskarian@mgsn.dev>
>  ;;; Copyright © 2021 Brice Waegeneire <brice@waegenei.re>
>  ;;; Copyright © 2021 Simon Tournier <zimon.toutoune@gmail.com>
> +;;; Copyright © 2022 Taiju HIGASHI <higashi@taiju.info>
>  ;;;
>  ;;; This file is part of GNU Guix.
>  ;;;
> @@ -31,6 +32,7 @@ (define-module (guix scripts import gem)
>    #:use-module (srfi srfi-37)
>    #:use-module (ice-9 match)
>    #:use-module (ice-9 format)
> +  #:use-module (ice-9 receive)
>    #:export (guix-import-gem))
>
>
> @@ -42,8 +44,9 @@ (define %default-options
>    '())
>
>  (define (show-help)
> -  (display (G_ "Usage: guix import gem PACKAGE-NAME
> -Import and convert the RubyGems package for PACKAGE-NAME.\n"))
> +  (display (G_ "Usage: guix import gem PACKAGE-NAME[@VERSION]
> +Import and convert the RubyGems package for PACKAGE-NAME.  Optionally, a
> +version can be specified after the arobas (@) character.\n"))
>    (display (G_ "
>    -h, --help             display this help and exit"))
>    (display (G_ "
> @@ -86,21 +89,23 @@ (define (parse-options)
>                               (_ #f))
>                             (reverse opts))))
>      (match args
> -      ((package-name)
> -       (let ((code (if (assoc-ref opts 'recursive)
> -                       (map (match-lambda
> -                              ((and ('package ('name name) . rest) pkg)
> -                               `(define-public ,(string->symbol name)
> -                                  ,pkg))
> -                              (_ #f))
> -                            (gem-recursive-import package-name 'rubygems))
> -                       (let ((sexp (gem->guix-package package-name)))
> -                         (if sexp sexp #f)))))
> -         (match code
> -           ((or #f '(#f))
> -            (leave (G_ "failed to download meta-data for package '~a'~%")
> -                   package-name))
> -           (_ code))))
> +      ((spec)
> +       (receive (package-name package-version)
> +           (package-name->name+version spec)
> +         (let ((code (if (assoc-ref opts 'recursive)
> +                         (map (match-lambda
> +                                ((and ('package ('name name) . rest) pkg)
> +                                 `(define-public ,(string->symbol name)
> +                                    ,pkg))
> +                                (_ #f))
> +                              (gem-recursive-import package-name 
> package-version))
> +                         (let ((sexp (gem->guix-package package-name 
> #:version package-version)))
> +                           (if sexp sexp #f)))))
> +           (match code
> +             ((or #f '(#f))
> +              (leave (G_ "failed to download meta-data for package '~a'~%")
> +                     package-name))
> +             (_ code)))))
>        (()
>         (leave (G_ "too few arguments~%")))
>        ((many ...)
> diff --git a/tests/gem.scm b/tests/gem.scm
> index c8fe15398e..6aa0d279dc 100644
> --- a/tests/gem.scm
> +++ b/tests/gem.scm
> @@ -3,6 +3,7 @@
>  ;;; Copyright © 2016 Ricardo Wurmus <rekado@elephly.net>
>  ;;; Copyright © 2018 Oleg Pykhalov <go.wigust@gmail.com>
>  ;;; Copyright © 2021 Sarah Morgensen <iskarian@mgsn.dev>
> +;;; Copyright © 2022 Taiju HIGASHI <higashi@taiju.info>
>  ;;;
>  ;;; This file is part of GNU Guix.
>  ;;;
> @@ -44,6 +45,22 @@ (define test-foo-json
>    \"licenses\": [\"MIT\", \"Apache 2.0\"]
>  }")
>
> +(define test-foo-v2-json
> +  "{
> +  \"name\": \"foo\",
> +  \"version\": \"2.0.0\",
> +  \"sha\": 
> \"f3676eafca9987cb5fe263df1edf2538bf6dafc712b30e17be3543a9680547a8\",
> +  \"info\": \"A cool gem\",
> +  \"homepage_uri\": \"https://example.com\";,
> +  \"dependencies\": {
> +    \"runtime\": [
> +      { \"name\": \"bundler\" },
> +      { \"name\": \"bar\" }
> +    ]
> +  },
> +  \"licenses\": [\"MIT\", \"Apache 2.0\"]
> +}")
> +
>  (define test-bar-json
>    "{
>    \"name\": \"bar\",
> @@ -103,6 +120,35 @@ (define test-bundler-json
>        (x
>         (pk 'fail x #f)))))
>
> +(test-assert "gem->guix-package with a specific version"
> +  ;; Replace network resources with sample data.
> +  (mock ((guix http-client) http-fetch
> +         (lambda (url . rest)
> +           (match url
> +             ("https://rubygems.org/api/v2/rubygems/foo/versions/2.0.0.json";
> +              (values (open-input-string test-foo-v2-json)
> +                      (string-length test-foo-v2-json)))
> +             (_ (error "Unexpected URL: " url)))))
> +    (match (gem->guix-package "foo" #:version "2.0.0")
> +      (('package
> +         ('name "ruby-foo")
> +         ('version "2.0.0")
> +         ('source ('origin
> +                    ('method 'url-fetch)
> +                    ('uri ('rubygems-uri "foo" 'version))
> +                    ('sha256
> +                     ('base32
> +                      
> "1a270mlajhrmpqbhxcqjqypnvgrq4pgixpv3w9gwp1wrrapnwrzk"))))
> +         ('build-system 'ruby-build-system)
> +         ('propagated-inputs ('list 'bundler 'ruby-bar))
> +         ('synopsis "A cool gem")
> +         ('description "This package provides a cool gem")
> +         ('home-page "https://example.com";)
> +         ('license ('list 'license:expat 'license:asl2.0)))
> +       #t)
> +      (x
> +       (pk 'fail x #f)))))
> +
>  (test-assert "gem-recursive-import"
>    ;; Replace network resources with sample data.
>    (mock ((guix http-client) http-fetch
> @@ -170,4 +216,71 @@ (define test-bundler-json
>            (x
>             (pk 'fail x #f)))))
>
> +(test-assert "gem-recursive-import with a specific version"
> +  ;; Replace network resources with sample data.
> +  (mock ((guix http-client) http-fetch
> +         (lambda (url . rest)
> +           (match url
> +             ("https://rubygems.org/api/v2/rubygems/foo/versions/2.0.0.json";
> +              (values (open-input-string test-foo-v2-json)
> +                      (string-length test-foo-v2-json)))
> +             ("https://rubygems.org/api/v1/gems/bar.json";
> +              (values (open-input-string test-bar-json)
> +                      (string-length test-bar-json)))
> +             ("https://rubygems.org/api/v1/gems/bundler.json";
> +              (values (open-input-string test-bundler-json)
> +                      (string-length test-bundler-json)))
> +             (_ (error "Unexpected URL: " url)))))
> +        (match (gem-recursive-import "foo" "2.0.0")
> +          ((('package
> +              ('name "ruby-bar")
> +              ('version "1.0.0")
> +              ('source
> +               ('origin
> +                 ('method 'url-fetch)
> +                 ('uri ('rubygems-uri "bar" 'version))
> +                 ('sha256
> +                  ('base32
> +                   "1a270mlajhrmpqbhxcqjqypnvgrq4pgixpv3w9gwp1wrrapnwrzk"))))
> +              ('build-system 'ruby-build-system)
> +              ('propagated-inputs ('list 'bundler))
> +              ('synopsis "Another cool gem")
> +              ('description "Another cool gem")
> +              ('home-page "https://example.com";)
> +              ('license #f))                      ;no licensing info
> +            ('package
> +              ('name "ruby-bundler")
> +              ('version "1.14.2")
> +              ('source
> +               ('origin
> +                 ('method 'url-fetch)
> +                 ('uri ('rubygems-uri "bundler" 'version))
> +                 ('sha256
> +                  ('base32
> +                   "1446xiz7zg0bz7kgx9jv84y0s4hpsg61dj5l3qb0i00avc1kxd9v"))))
> +              ('build-system 'ruby-build-system)
> +              ('synopsis "Ruby gem bundler")
> +              ('description "Ruby gem bundler")
> +              ('home-page "https://bundler.io/";)
> +              ('license 'license:expat))
> +            ('package
> +              ('name "ruby-foo")
> +              ('version "2.0.0")
> +              ('source
> +               ('origin
> +                 ('method 'url-fetch)
> +                 ('uri ('rubygems-uri "foo" 'version))
> +                 ('sha256
> +                  ('base32
> +                   "1a270mlajhrmpqbhxcqjqypnvgrq4pgixpv3w9gwp1wrrapnwrzk"))))
> +              ('build-system 'ruby-build-system)
> +              ('propagated-inputs ('list 'bundler 'ruby-bar))
> +              ('synopsis "A cool gem")
> +              ('description "This package provides a cool gem")
> +              ('home-page "https://example.com";)
> +              ('license ('list 'license:expat 'license:asl2.0))))
> +           #t)
> +          (x
> +           (pk 'fail x #f)))))
> +
>  (test-end "gem")

Cheers,
-- 
Taiju





reply via email to

[Prev in Thread] Current Thread [Next in Thread]