From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ricardo Wurmus Subject: bug#24450: [PATCHv2] Re: pypi importer outputs strange character series in optional dependency case. Date: Wed, 12 Jun 2019 08:39:12 +0200 Message-ID: <87imtb9ujz.fsf@mdc-berlin.de> References: <87imtb33tp.fsf@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Return-path: Received: from eggs.gnu.org ([2001:470:142:3::10]:38500) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hawvU-0007kE-HN for bug-guix@gnu.org; Wed, 12 Jun 2019 02:40:05 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hawvT-00054L-Cr for bug-guix@gnu.org; Wed, 12 Jun 2019 02:40:04 -0400 Received: from debbugs.gnu.org ([209.51.188.43]:46999) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hawvS-00053s-Iw for bug-guix@gnu.org; Wed, 12 Jun 2019 02:40:03 -0400 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1hawvS-0007it-Bs for bug-guix@gnu.org; Wed, 12 Jun 2019 02:40:02 -0400 Sender: "Debbugs-submit" Resent-Message-ID: In-Reply-To: <87imtb33tp.fsf@gmail.com> List-Id: Bug reports for GNU Guix List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-guix-bounces+gcggb-bug-guix=m.gmane.org@gnu.org Sender: "bug-Guix" To: Maxim Cournoyer Cc: 24450@debbugs.gnu.org Hi Maxim, >>> (call-with-input-file requires.txt >>> (lambda (port) >>> - (let loop ((result '())) >>> + (let loop ((required-deps '()) >>> + (test-deps '()) >>> + (inside-test-section? #f) >>> + (optional? #f)) >>> (let ((line (read-line port))) >>> - ;; Stop when a section is encountered, as sections contains = optional >>> - ;; (extra) requirements. Non-optional requirements must app= ear >>> - ;; before any section is defined. >>> - (if (or (eof-object? line) (section-header? line)) >>> + (if (eof-object? line) >>> ;; Duplicates can occur, since the same requirement can = be >>> ;; listed multiple times with different conditional mark= ers, e.g. >>> ;; pytest >=3D 3 ; python_version >=3D "3.3" >>> ;; pytest < 3 ; python_version < "3.3" >>> - (reverse (delete-duplicates result)) >>> + (map (compose reverse delete-duplicates) >>> + (list required-deps test-deps)) >> >> Looks like a list of lists to me. =E2=80=9Cdelete-duplicates=E2=80=9D n= ow won=E2=80=99t delete >> a name that is in both =E2=80=9Crequired-deps=E2=80=9D as well as in =E2= =80=9Ctest-deps=E2=80=9D. Is >> this acceptable? > > It is acceptable, as this corner case cannot exist given the current > code (a requirement can exist in either required-deps or test-deps, but > never in both). It also doesn't make sense that a run time requirement > would also be listed as a test requirement, so that corner case is not > likely to exist in the future either. I mentioned it because I believe I=E2=80=99ve seen this in the past where t= he importer would return some of the same inputs as both regular inputs and test dependencies. >> Personally, I=E2=80=99m not a fan of using data structures for returning >> multiple values, because we can simply return multiple values. > > I thought the Guile supported multiple values return value would be > great here as well, but I've found that for this specific case here, a > list of lists worked better, since the two lists contain requirements to > be processed the same, which "map" can readily do (i.e. less ceremony is > required). =E2=80=9Cmap=E2=80=9D can also operate on more than one list at a time: (call-with-values (lambda () (values (list 1 2 3) (list 9 8 7))) (lambda (a b) (map + a b))) =3D> (10 10 10) Of course, it would be simpler to just use a single list of tagged items. -- Ricardo