GNU bug report logs - #74841
[PATCH] srfi-19: Fix ~V converter in date->string.

Please note: This is a static page, with minimal formatting, updated once a day.
Click here to see this page with the latest information and nicer formatting.

Package: guile; Reported by: Tomas Volf <~@wolfsden.cz>; Keywords: patch; dated Thu, 12 Dec 2024 21:05:02 UTC; Maintainer for guile is bug-guile@HIDDEN.

Message received at 74841 <at> debbugs.gnu.org:


Received: (at 74841) by debbugs.gnu.org; 22 Dec 2024 21:41:51 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sun Dec 22 16:41:51 2024
Received: from localhost ([127.0.0.1]:52228 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1tPThv-00035n-9e
	for submit <at> debbugs.gnu.org; Sun, 22 Dec 2024 16:41:51 -0500
Received: from eggs.gnu.org ([209.51.188.92]:37782)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <ludo@HIDDEN>) id 1tPTht-00035a-DR
 for 74841 <at> debbugs.gnu.org; Sun, 22 Dec 2024 16:41:50 -0500
Received: from fencepost.gnu.org ([2001:470:142:3::e])
 by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.90_1) (envelope-from <ludo@HIDDEN>)
 id 1tPThn-0001Ku-Iq; Sun, 22 Dec 2024 16:41:43 -0500
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org;
 s=fencepost-gnu-org; h=MIME-Version:Date:References:In-Reply-To:Subject:To:
 From; bh=2ccBUc2a9f0X+UTaINEXndiQ5I+bIpNfy6HgZwZsfdU=; b=NGNOK/KmSs+VsXClHqPS
 ddrV2348D/dBcQv0Sz4r6HMb0yRz6tbGD7fHMPh7Uv016/vqVYgBDmY+CdhmIe2HfZOgpaEN88g0F
 AsXwOINB3hpgXLlr36qbdh0030U5Z1ZnrfpuFYRGposJyMidk00iK/diAsoxLS428hA6iuTCR3VZa
 z4d1UCI5ySjJdXTJlp8nQx8kq91PaBJlUneOtYVBOFK2SegI+55MH+4OYU8dVwqrywegeVgNlSiEK
 pUf3lrMLSsDqI5sBWacqkSmc26DLFift8u2cDiGAJY3Z0YCbQ/Eynfzj2UKW6TVhlma0iB0axK9fB
 jy7YOvBw5OvG7A==;
From: =?utf-8?Q?Ludovic_Court=C3=A8s?= <ludo@HIDDEN>
To: Tomas Volf <~@wolfsden.cz>
Subject: Re: bug#74841: [PATCH] srfi-19: Fix ~V converter in date->string.
In-Reply-To: <20241212210322.32016-2-~@wolfsden.cz> (Tomas Volf's message of
 "Thu, 12 Dec 2024 22:03:21 +0100")
References: <20241212210322.32016-2-~@wolfsden.cz>
Date: Sun, 22 Dec 2024 22:41:41 +0100
Message-ID: <87bjx3fl9m.fsf@HIDDEN>
User-Agent: Gnus/5.13 (Gnus v5.13)
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 74841
Cc: 74841 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

Hi,

Tomas Volf <~@wolfsden.cz> skribis:

> The ~V is supposed to print ISO week number, not a week number.  This
> commit fixes that.
>
> * module/srfi/srfi-19.scm (date-week-number-iso): New procedure taken
> from the reference implementation.
> (directives)<#\V>: Use it.
> * test-suite/tests/srfi-19.test ("date->string ~V"): Add tests taken
> from the reference test suite.

The manual just reads this:

     ~U     week of year, Sunday first day of week, =E2=80=9800=E2=80=99 to
            =E2=80=9852=E2=80=99
     ~V     week of year, Monday first day of week, =E2=80=9801=E2=80=99 to
            =E2=80=9853=E2=80=99

Should it be fixed or clarified?

> +(define (date-week-number-iso date)

Please add a docstring.

> +  (let ((convert (=CE=BB (lst)
> +                   (date->string
> +                    (make-date 0 0 0 0
> +                               (caddr lst) (cadr lst) (car lst)

Please use =E2=80=98match-lambda=E2=80=99.

> +    (with-test-prefix "date->string ~V"
> +      (pass-if-equal "Thursday, week 53" "53"

If these are from the SRFI-19 spec, could you add a comment to say so?

Thanks,
Ludo=E2=80=99.




Information forwarded to bug-guile@HIDDEN:
bug#74841; Package guile. Full text available.

Message received at submit <at> debbugs.gnu.org:


Received: (at submit) by debbugs.gnu.org; 12 Dec 2024 21:04:06 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Thu Dec 12 16:04:06 2024
Received: from localhost ([127.0.0.1]:40585 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1tLqLn-0000gn-TU
	for submit <at> debbugs.gnu.org; Thu, 12 Dec 2024 16:04:05 -0500
Received: from lists.gnu.org ([209.51.188.17]:35496)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <~@wolfsden.cz>) id 1tLqLj-0000ga-Fo
 for submit <at> debbugs.gnu.org; Thu, 12 Dec 2024 16:03:58 -0500
Received: from eggs.gnu.org ([2001:470:142:3::10])
 by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.90_1) (envelope-from <~@wolfsden.cz>) id 1tLqLi-00048o-2e
 for bug-guile@HIDDEN; Thu, 12 Dec 2024 16:03:54 -0500
Received: from wolfsden.cz ([37.205.8.62])
 by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.90_1) (envelope-from <~@wolfsden.cz>) id 1tLqLf-0005R6-OA
 for bug-guile@HIDDEN; Thu, 12 Dec 2024 16:03:53 -0500
Received: by wolfsden.cz (Postfix, from userid 104)
 id C658235B32C; Thu, 12 Dec 2024 21:03:48 +0000 (UTC)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=wolfsden.cz; s=mail;
 t=1734037428; bh=uuodW7FBdAEGpBSqznpZU8i1BVZtibZR0LZPPlZv57M=;
 h=From:To:Cc:Subject:Date;
 b=jMTkzrZI/Q1IJ1l+CD0vK/jWPAX9Zi6kHADR98f+a/bHuq86W4MFPhV3oOPD3wTKU
 2MouY2Y0N2AAAUQeVpzl3a25rqRX/ZXioC1sEZqZYnTxIv5waBDDrjN8RD5IrdHXo7
 NI/PCNxt+0wiVhZEQetiH1IJ67D8eUe9v5Fqt3TKpxatQRJ77OhZS7B8dE8d063iIx
 Mod5R/tFkY3oQpxDtFRqB7y0dRhFHwLSWkT4AdnHDRdocHyLLqvuWUPf4SNb+aX4E1
 5EAfAhbYr5dTagsZZhWKb+Lz1CNsf4FpffrABAh16dUMAcgTHnG76KG4dNOPa8MyPF
 hx/W7QK3n/IdRP4FFTzWMryO91W52aB8z8B5Jgyqee2WJfme056BpoRMa7Dstk99gN
 NysDoSETCjfWcDh88ucE2l+qy1xwqj61mcN0XcPpL2fSJm0MWgdjeDH0xP87oYN34P
 3TgyucOJaRX56i/Ai3v6KkiboiyHr6i1kLR9yAvf2N2e9OXgsKQcVUEDnj/dMevDj2
 Xjjb80+7Uy+W1yjoIYvJvDa0p0/kkbYiSJF3tXurWSGj8XWGDLLPB0sFt762pMYkQK
 4pcckTucCLhhY/bzF13LMf7Pg9vNSbZ4YwlMBdmc8sGtSY1bH1NpXq0WR+9Dipfpvv
 C1lQSRMT3juallmzIj4Ybp1Y=
X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on wolfsden
X-Spam-Level: 
X-Spam-Status: No, score=-3.1 required=5.0 tests=ALL_TRUSTED,BAYES_00,
 DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,URIBL_BLOCKED
 autolearn=ham autolearn_force=no version=3.4.6
Received: from localhost (unknown [128.0.188.242])
 by wolfsden.cz (Postfix) with ESMTPSA id 3E08B35C29B;
 Thu, 12 Dec 2024 21:03:48 +0000 (UTC)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=wolfsden.cz; s=mail;
 t=1734037428; bh=uuodW7FBdAEGpBSqznpZU8i1BVZtibZR0LZPPlZv57M=;
 h=From:To:Cc:Subject:Date;
 b=jMTkzrZI/Q1IJ1l+CD0vK/jWPAX9Zi6kHADR98f+a/bHuq86W4MFPhV3oOPD3wTKU
 2MouY2Y0N2AAAUQeVpzl3a25rqRX/ZXioC1sEZqZYnTxIv5waBDDrjN8RD5IrdHXo7
 NI/PCNxt+0wiVhZEQetiH1IJ67D8eUe9v5Fqt3TKpxatQRJ77OhZS7B8dE8d063iIx
 Mod5R/tFkY3oQpxDtFRqB7y0dRhFHwLSWkT4AdnHDRdocHyLLqvuWUPf4SNb+aX4E1
 5EAfAhbYr5dTagsZZhWKb+Lz1CNsf4FpffrABAh16dUMAcgTHnG76KG4dNOPa8MyPF
 hx/W7QK3n/IdRP4FFTzWMryO91W52aB8z8B5Jgyqee2WJfme056BpoRMa7Dstk99gN
 NysDoSETCjfWcDh88ucE2l+qy1xwqj61mcN0XcPpL2fSJm0MWgdjeDH0xP87oYN34P
 3TgyucOJaRX56i/Ai3v6KkiboiyHr6i1kLR9yAvf2N2e9OXgsKQcVUEDnj/dMevDj2
 Xjjb80+7Uy+W1yjoIYvJvDa0p0/kkbYiSJF3tXurWSGj8XWGDLLPB0sFt762pMYkQK
 4pcckTucCLhhY/bzF13LMf7Pg9vNSbZ4YwlMBdmc8sGtSY1bH1NpXq0WR+9Dipfpvv
 C1lQSRMT3juallmzIj4Ybp1Y=
From: Tomas Volf <~@wolfsden.cz>
To: bug-guile@HIDDEN
Subject: [PATCH] srfi-19: Fix ~V converter in date->string.
Date: Thu, 12 Dec 2024 22:03:21 +0100
Message-ID: <20241212210322.32016-2-~@wolfsden.cz>
X-Mailer: git-send-email 2.46.0
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Received-SPF: pass client-ip=37.205.8.62; envelope-from=~@wolfsden.cz;
 helo=wolfsden.cz
X-Spam_score_int: -20
X-Spam_score: -2.1
X-Spam_bar: --
X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1,
 DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1,
 RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001,
 SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no
X-Spam_action: no action
X-Spam-Score: -1.3 (-)
X-Debbugs-Envelope-To: submit
Cc: Tomas Volf <~@wolfsden.cz>
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -2.3 (--)

The ~V is supposed to print ISO week number, not a week number.  This
commit fixes that.

* module/srfi/srfi-19.scm (date-week-number-iso): New procedure taken
from the reference implementation.
(directives)<#\V>: Use it.
* test-suite/tests/srfi-19.test ("date->string ~V"): Add tests taken
from the reference test suite.
---
 module/srfi/srfi-19.scm       | 21 ++++++++++++-
 test-suite/tests/srfi-19.test | 57 ++++++++++++++++++++++++++++++++++-
 2 files changed, 76 insertions(+), 2 deletions(-)

diff --git a/module/srfi/srfi-19.scm b/module/srfi/srfi-19.scm
index d809ac1ec..77be57a0e 100644
--- a/module/srfi/srfi-19.scm
+++ b/module/srfi/srfi-19.scm
@@ -753,6 +753,25 @@
                      (days-before-first-week  date day-of-week-starting-week))
                   7))
 
+(define (date-week-number-iso date)
+  ;; The week with the year's first Thursday is week 01.
+  (let* ((first-day-of-the-week (week-day 1 1 (date-year date)))
+         (offset (if (> first-day-of-the-week 4) 0 1))
+         ;; -2: decrement one day to compensate 1-origin of date-year-day,
+         ;; and decrement one more day for Sunday belongs to the previous week.
+         (w (+ (floor-quotient (+ (date-year-day date) first-day-of-the-week -2)
+                               7)
+               offset)))
+    (cond ((zero? w)
+           ;; date belongs to the last week of the previous year
+           (date-week-number-iso (make-date 0 0 0 0 31 12
+                                            (- (date-year date) 1) 0)))
+          ((and (= w 53)
+                (<= (week-day 1 1 (+ (date-year date) 1)) 4))
+           ;; date belongs to the first week of the next year
+           1)
+          (else w))))
+
 (define (current-date . tz-offset)
   (let ((time (current-time time-utc)))
     (time-utc->date
@@ -1043,7 +1062,7 @@
                    (display (padding (date-week-number date 0)
                                      #\0 2) port))))
    (cons #\V (lambda (date pad-with port)
-               (display (padding (date-week-number date 1)
+               (display (padding (date-week-number-iso date)
                                  #\0 2) port)))
    (cons #\w (lambda (date pad-with port)
                (display (date-week-day date) port)))
diff --git a/test-suite/tests/srfi-19.test b/test-suite/tests/srfi-19.test
index 55eb82320..5e3e1f445 100644
--- a/test-suite/tests/srfi-19.test
+++ b/test-suite/tests/srfi-19.test
@@ -412,7 +412,62 @@ incomplete numerical tower implementation.)"
   (with-test-prefix "date-week-number"
     (pass-if (= 0 (date-week-number (make-date 0 0 0 0 1 1 1984 0) 0)))
     (pass-if (= 0 (date-week-number (make-date 0 0 0 0 7 1 1984 0) 0)))
-    (pass-if (= 1 (date-week-number (make-date 0 0 0 0 8 1 1984 0) 0)))))
+    (pass-if (= 1 (date-week-number (make-date 0 0 0 0 8 1 1984 0) 0))))
+
+  (let ((convert (λ (lst)
+                   (date->string
+                    (make-date 0 0 0 0
+                               (caddr lst) (cadr lst) (car lst)
+                               0)
+                    "~V"))))
+    (with-test-prefix "date->string ~V"
+      (pass-if-equal "Thursday, week 53" "53"
+        (convert '(2020 12 31)))
+      (pass-if-equal "Friday, week 53 (previous year)" "53"
+        (convert '(2021 1 1)))
+      (pass-if-equal "Sunday, week 53 (previous year)" "53"
+        (convert '(2021 1 3)))
+      (pass-if-equal "Monday, week 1" "01"
+        (convert '(2021 1 4)))
+
+      (pass-if-equal "Sunday, week 52" "52"
+        (convert '(2019 12 29)))
+      (pass-if-equal "Monday, week 1 (next year)" "01"
+        (convert '(2019 12 30)))
+      (pass-if-equal "Tuesday, week 1 (next year)" "01"
+        (convert '(2019 12 31)))
+      (pass-if-equal "Wednesday, week 1" "01"
+        (convert '(2020 1 1)))
+
+      (pass-if-equal "Saturday, week 52" "52"
+        (convert '(2016 12 31)))
+      (pass-if-equal "Sunday, week 52 (previous year)" "52"
+        (convert '(2017 1 1)))
+      (pass-if-equal "Monday, week 1" "01"
+        (convert '(2017 1 2)))
+      (pass-if-equal "Sunday, week 1" "01"
+        (convert '(2017 1 8)))
+      (pass-if-equal "Monday, week 2" "02"
+        (convert '(2017 1 9)))
+
+      (pass-if-equal "Sunday, week 52" "52"
+        (convert '(2014 12 28)))
+      (pass-if-equal "Monday, week 1 (next year)" "01"
+        (convert '(2014 12 29)))
+      (pass-if-equal "Tuesday, week 1 (next year)" "01"
+        (convert '(2014 12 30)))
+      (pass-if-equal "Wednesday, week 1 (next year)" "01"
+        (convert '(2014 12 31)))
+      (pass-if-equal "Thursday, week 1" "01"
+        (convert '(2015 1 1)))
+      (pass-if-equal "Friday, week 1" "01"
+        (convert '(2015 1 2)))
+      (pass-if-equal "Saturday, week 1" "01"
+        (convert '(2015 1 3)))
+      (pass-if-equal "Sunday, week 1" "01"
+        (convert '(2015 1 4)))
+      (pass-if-equal "Monday, week 2" "02"
+        (convert '(2015 1 5))))))
 
 
 ;; Local Variables:
-- 
2.46.0





Acknowledgement sent to Tomas Volf <~@wolfsden.cz>:
New bug report received and forwarded. Copy sent to bug-guile@HIDDEN. Full text available.
Report forwarded to bug-guile@HIDDEN:
bug#74841; Package guile. Full text available.
Please note: This is a static page, with minimal formatting, updated once a day.
Click here to see this page with the latest information and nicer formatting.
Last modified: Sun, 12 Jan 2025 05:45:02 UTC

GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997 nCipher Corporation Ltd, 1994-97 Ian Jackson.