projects/guix·blob python-team · refs

984 lines · 36.7 KiB

1;;; GNU Guix --- Functional package management for GNU
2;;; Copyright © 2012 Nikita Karetnikov <[email protected]>
3;;; Copyright © 2013, 2017, 2020, 2021 Ludovic Courtès <[email protected]>
4;;; Copyright © 2013, 2015 Andreas Enge <[email protected]>
5;;; Copyright © 2015-2019, 2021, 2024 Efraim Flashner <[email protected]>
6;;; Copyright © 2015, 2017 Leo Famulari <[email protected]>
7;;; Copyright © 2015, 2017 Cyril Roelandt <[email protected]>
8;;; Copyright © 2016 Sou Bunnbu <[email protected]>
9;;; Copyright © 2016 Hartmut Goebel <[email protected]>
10;;; Copyright © 2016 Danny Milosavljevic <[email protected]>
11;;; Copyright © 2016, 2020 Marius Bakke <[email protected]>
12;;; Copyright © 2016, 2017, 2018, 2020 Tobias Geerinckx-Rice <[email protected]>
13;;; Copyright © 2017 Ben Woodcroft <[email protected]>
14;;; Copyright © 2017 Nikita <[email protected]>
15;;; Copyright © 2017 Julien Lepiller <[email protected]>
16;;; Copyright © 2018 Alex Vong <[email protected]>
17;;; Copyright © 2019 Kyle Meyer <[email protected]>
18;;; Copyright © 2019 Pierre Langlois <[email protected]>
19;;; Copyright © 2020 Lars-Dominik Braun <[email protected]>
20;;; Copyright © 2020 Tanguy Le Carrour <[email protected]>
21;;; Copyright © 2021 Ryan Prior <[email protected]>
22;;; Copyright © 2021 Foo Chuan Wei <[email protected]>
23;;; Copyright © 2022, 2026 Maxim Cournoyer <[email protected]>
24;;; Copyright © 2022 Pradana AUMARS <[email protected]>
25;;; Copyright © 2023 Sharlatan Hellseher <[email protected]>
26;;; Copyright © 2024 Liliana Marie Prikler <[email protected]>
27;;; Copyright © 2024 Sharlatan Hellseher <[email protected]>
28;;; Copyright © 2024 Zheng Junjie <[email protected]>
29;;; Copyright © 2024 Vinicius Monego <[email protected]>
30;;; Copyright © 2024, 2025 Ricardo Wurmus <[email protected]>
31;;; Copyright © 2026 jgart <[email protected]>
32;;;
33;;; This file is part of GNU Guix.
34;;;
35;;; GNU Guix is free software; you can redistribute it and/or modify it
36;;; under the terms of the GNU General Public License as published by
37;;; the Free Software Foundation; either version 3 of the License, or (at
38;;; your option) any later version.
39;;;
40;;; GNU Guix is distributed in the hope that it will be useful, but
41;;; WITHOUT ANY WARRANTY; without even the implied warranty of
42;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
43;;; GNU General Public License for more details.
44;;;
45;;; You should have received a copy of the GNU General Public License
46;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
47
48(define-module (gnu packages time)
49 #:use-module (gnu packages autotools)
50 #:use-module (gnu packages base)
51 #:use-module (gnu packages build-tools)
52 #:use-module (gnu packages check)
53 #:use-module (gnu packages compression)
54 #:use-module (gnu packages geo)
55 #:use-module (gnu packages golang-build)
56 #:use-module (gnu packages golang-xyz)
57 #:use-module (gnu packages libffi)
58 #:use-module (gnu packages perl)
59 #:use-module (gnu packages python)
60 #:use-module (gnu packages python-build)
61 #:use-module (gnu packages python-check)
62 #:use-module (gnu packages python-xyz)
63 #:use-module (gnu packages rust)
64 #:use-module (gnu packages rust-sources)
65 #:use-module (gnu packages serialization)
66 #:use-module (gnu packages terminals)
67 #:use-module (gnu packages textutils)
68 #:use-module (gnu packages)
69 #:use-module (guix build-system cargo)
70 #:use-module (guix build-system gnu)
71 #:use-module (guix build-system go)
72 #:use-module (guix build-system pyproject)
73 #:use-module (guix download)
74 #:use-module (guix gexp)
75 #:use-module (guix utils)
76 #:use-module (guix git-download)
77 #:use-module (guix licenses)
78 #:use-module (guix packages))
79
80(define-public termdown
81 (package
82 (name "termdown")
83 (version "1.18.0")
84 (source
85 (origin
86 (method git-fetch)
87 (uri (git-reference
88 (url "https://github.com/trehn/termdown")
89 (commit version)))
90 (file-name (git-file-name name version))
91 (sha256
92 (base32 "15i7ilwzwdj831bcd1gjnirydcdbr1b10d7jw5syjv0xwqq3yy8y"))))
93 (build-system pyproject-build-system)
94 (arguments (list #:tests? #f)) ; No tests.
95 (native-inputs (list python-pytest python-setuptools))
96 (propagated-inputs (list python-click python-pyfiglet python-dateutil))
97 (home-page "https://github.com/trehn/termdown")
98 (synopsis "Countdown timer for your terminal")
99 (description
100 "Termdown provides a fancy text display while it counts down to zero from
101a starting point you provide. The user can pause and resume the countdown
102from the text user interface. It can also be used in stop watch mode which
103counts forward or for just showing the current time.")
104 (license gpl3)))
105
106(define-public time
107 (package
108 (name "time")
109 (version "1.10")
110 (source
111 (origin
112 (method url-fetch)
113 (uri (string-append "mirror://gnu/time/time-"
114 version ".tar.gz"))
115 (sha256
116 (base32
117 "1hq9vvam1bi8xz9d09xgj2fdxbmq1psii1hywiw897armfs9zhp8"))))
118 (build-system gnu-build-system)
119 (home-page "https://www.gnu.org/software/time/")
120 (synopsis "Run a command, then display its resource usage")
121 (description
122 "Time is a command that displays information about the resources that a
123program uses. The display output of the program can be customized or saved
124to a file.")
125 (license gpl3+)))
126
127(define-public pps-tools
128 ;; Last tagged release was in 2021
129 (let ((commit "e5083fe1481a34373dee2acfabb63001ee9c40e0")
130 (revision "1"))
131 (package
132 (name "pps-tools")
133 (version (git-version "1.0.3" revision commit))
134 (source
135 (origin
136 (method git-fetch)
137 (uri (git-reference
138 (url "https://github.com/redlab-i/pps-tools")
139 (commit commit)))
140 (file-name (git-file-name name version))
141 (sha256
142 (base32 "1q3yvkwgqzafpx940cgqjn0harziv9gix1k3r3ymidmip0i5z1cp"))))
143 (arguments
144 (list
145 #:tests? #f ;There is no test suite.
146 #:make-flags
147 #~(list "CC=gcc"
148 (string-append "DESTDIR=" %output))
149 #:phases
150 #~(modify-phases %standard-phases
151 ;; No configure script
152 (delete 'configure)
153 (add-after 'unpack 'patch-makefile
154 (lambda _
155 (substitute* "Makefile"
156 (("/usr/")
157 "/")))))))
158 (build-system gnu-build-system)
159 (home-page "https://github.com/redlab-i/pps-tools")
160 (synopsis "User-space tools and headers for LinuxPPS")
161 (description
162 "This package includes the necessary headers for using
163@url{http://linuxpps.org/, LinuxPPS} PPSAPI kernel interface in user-space
164applications, and several support tools.")
165 (license gpl2+))))
166
167(define-public python-pytimeparse
168 (package
169 (name "python-pytimeparse")
170 (version "1.1.8")
171 (source
172 (origin
173 (method git-fetch)
174 (uri (git-reference
175 (url "https://github.com/wroberts/pytimeparse")
176 (commit version)))
177 (file-name (git-file-name name version))
178 (sha256
179 (base32 "1r5ybq2brdinqlvvdmfv2lz4g1hwz2zd6k21qwzzw17jfxdv2m6g"))))
180 (build-system pyproject-build-system)
181 (arguments
182 (list
183 #:phases
184 #~(modify-phases %standard-phases
185 (add-before 'check 'cleanup
186 (lambda* (#:key inputs outputs #:allow-other-keys)
187 (delete-file-recursively
188 (string-append (site-packages inputs outputs)
189 "/pytimeparse/tests"))))
190 (replace 'check
191 (lambda* (#:key tests? #:allow-other-keys)
192 (when tests?
193 (invoke "python" "-m" "unittest")))))))
194 (native-inputs
195 (list python-setuptools python-wheel))
196 (home-page "https://github.com/wroberts/pytimeparse")
197 (synopsis "Time expression parser")
198 (description
199 "This small Python module parses various kinds of time expressions.")
200 (license expat)))
201
202(define-public python-pytzdata
203 (package
204 (name "python-pytzdata")
205 (version "2020.1")
206 (source
207 (origin
208 (method git-fetch)
209 (uri (git-reference
210 (url "https://github.com/sdispater/pytzdata")
211 (commit version)))
212 (file-name (git-file-name name version))
213 (sha256
214 (base32 "1idzpps56wx2lqvflxhpb1isz1ijn9y91ffd6hfg6qv1zikj9xa4"))))
215 (build-system pyproject-build-system)
216 (arguments
217 (list
218 #:phases
219 #~(modify-phases %standard-phases
220 (add-after 'unpack 'use-poetry-core
221 (lambda _
222 ;; Patch to use the core poetry API.
223 (substitute* "pyproject.toml"
224 (("poetry.masonry.api") "poetry.core.masonry.api")))))))
225 (native-inputs (list python-poetry-core python-pytest))
226 (propagated-inputs (list python-cleo))
227 (home-page "https://github.com/sdispater/pytzdata")
228 (synopsis "Timezone database for Python")
229 (description "This library provides a timezone database for Python.")
230 (license expat)))
231
232(define-public python-tzdata
233 (package
234 (name "python-tzdata")
235 ;; This package should be kept in sync with tzdata in (gnu packages base).
236 (version "2025.1")
237 (source
238 (origin
239 (method url-fetch)
240 (uri (pypi-uri "tzdata" version))
241 (sha256
242 (base32 "156nh5d0fagghgyz54ymbd4cnr6z05w8iiin2syjinwcx04lk294"))
243 (modules '((guix build utils)))
244 (snippet #~(delete-file-recursively "src/tzdata/zoneinfo"))))
245 (build-system pyproject-build-system)
246 (arguments
247 (list #:phases
248 #~(modify-phases %standard-phases
249 (add-after 'ensure-no-mtimes-pre-1980 'unpack-tzdata
250 (lambda* (#:key inputs #:allow-other-keys)
251 (copy-recursively
252 (search-input-directory inputs "share/zoneinfo")
253 "src/tzdata/zoneinfo")
254 (delete-file "src/tzdata/zoneinfo/posix")
255 (call-with-output-file "src/tzdata/zoneinfo/__init__.py"
256 (const #t)))))))
257 (inputs (list tzdata))
258 (native-inputs
259 (list python-pytest
260 python-setuptools))
261 (home-page "https://github.com/python/tzdata")
262 (synopsis "Python wrapper of IANA time zone data")
263 (description "This package provides a thin Python wrapper around tzdata.")
264 (license asl2.0)))
265
266(define-public python-pytz-deprecation-shim
267 (package
268 (name "python-pytz-deprecation-shim")
269 (version "0.1.0.post0")
270 (source
271 (origin
272 (method url-fetch)
273 (uri (pypi-uri "pytz_deprecation_shim" version))
274 (sha256
275 (base32 "17d58msbi18dc4lk29hcrgylvrv9vhniwi24axfdwvb13fp7n2dg"))))
276 (build-system pyproject-build-system)
277 (propagated-inputs (list python-dateutil python-tzdata))
278 (native-inputs (list python-pytest
279 python-pytz
280 python-setuptools
281 python-wheel))
282 (home-page "https://github.com/pganssle/pytz-deprecation-shim")
283 (synopsis "Shims to make deprecation of pytz easier")
284 (description
285 "This package aims to make the transition away from @code{pytz} easier.
286It is intended for temporary usage only, and should allow you to drop your
287dependency on @code{pytz} while also giving your users notice that eventually
288you will remove support for the pytz-specific interface.")
289 (license asl2.0)))
290
291(define-public python-pytz
292 (package
293 (name "python-pytz")
294 ;; This package should be kept in sync with tzdata in (gnu packages base).
295 (version "2025.1")
296 (source
297 (origin
298 (method url-fetch)
299 (uri (pypi-uri "pytz" version))
300 (sha256
301 (base32
302 "13hpf2my8mgqkr38ch7s3rym9zz60m6pq87rcn7b46155az45ny2"))))
303 (build-system pyproject-build-system)
304 (arguments
305 (list #:test-backend #~'unittest
306 #:test-flags #~(list "discover" "pytz/tests")))
307 (native-inputs
308 (list python-setuptools))
309 (home-page "http://pythonhosted.org/pytz")
310 (synopsis "Python timezone library")
311 (description "This library brings the Olson tz database into Python. It
312allows accurate and cross platform timezone calculations using Python 2.4 or
313higher. It also solves the issue of ambiguous times at the end of daylight
314saving time. Almost all of the Olson timezones are supported.")
315 (license expat)))
316
317(define-public python-pendulum
318 (package
319 (name "python-pendulum")
320 (version "3.1.0")
321 (source
322 (origin
323 (method git-fetch)
324 (uri (git-reference
325 (url "https://github.com/sdispater/pendulum")
326 (commit version)))
327 (file-name (git-file-name name version))
328 (sha256
329 (base32 "0rhh5hnrjbi1ams5ylnymari522k4v2kdk82qzafvmykkcvild36"))))
330 (build-system pyproject-build-system)
331 (arguments
332 (list
333 #:imported-modules `(,@%cargo-build-system-modules
334 ,@%pyproject-build-system-modules)
335 #:modules '(((guix build cargo-build-system)
336 #:prefix cargo:)
337 (guix build pyproject-build-system)
338 (guix build utils))
339 #:phases
340 #~(modify-phases %standard-phases
341 (add-after 'unpack 'prepare-cargo-build-system
342 (lambda args
343 (with-directory-excursion "rust"
344 (for-each (lambda (phase)
345 (format #t "Running cargo phase: ~a~%" phase)
346 (apply (assoc-ref cargo:%standard-phases phase)
347 #:cargo-target #$(cargo-triplet) args))
348 '(unpack-rust-crates configure
349 check-for-pregenerated-files
350 patch-cargo-checksums))))))))
351 (native-inputs
352 (list maturin
353 python-pytest
354 python-pytest-benchmark
355 python-pytz
356 python-setuptools
357 python-time-machine
358 rust
359 `(,rust "cargo")))
360 (inputs (cargo-inputs 'pendulum))
361 (propagated-inputs (list python-dateutil python-tzdata))
362 (home-page "https://github.com/sdispater/pendulum")
363 (synopsis "Alternate API for Python datetimes")
364 (description
365 "Pendulum is a drop-in replacement for the standard @code{datetime}
366class, providing an alternative API. As it inherits from the standard
367@code{datetime} all @code{datetime} instances can be replaced by Pendulum
368instances.")
369 (license expat)))
370
371(define-public python-dateutil
372 (package
373 (name "python-dateutil")
374 (version "2.9.0")
375 (source
376 (origin
377 (method url-fetch)
378 (uri (pypi-uri "python-dateutil" version))
379 (sha256
380 (base32 "02b7qqimar3p311m0y5z8b09v4qdd0qia037lpzj0nrzqqckxrvq"))))
381 (build-system pyproject-build-system)
382 (arguments
383 (list
384 #:test-flags
385 #~(list ;avoid freezegun dependency
386 "--ignore=tests/test_utils.py"
387 "--ignore=tests/test_rrule.py"
388 ;; XXX: Fails to get timezone from /etc/localtime.
389 "--ignore=tests/test_tz.py")
390 #:phases
391 #~(modify-phases %standard-phases
392 (add-after 'unpack 'relax-pytest-cov-requirement
393 (lambda _
394 (substitute* "tests/conftest.py"
395 (("\\item.add_marker\\(pytest\\.mark\\.no_cover\\)")
396 "continue")))))))
397 (native-inputs
398 (list python-pytest
399 python-setuptools
400 python-setuptools-scm))
401 (propagated-inputs
402 (list python-six))
403 (home-page "https://dateutil.readthedocs.io/en/stable/")
404 (synopsis "Extensions to the standard datetime module")
405 (description
406 "The dateutil module provides powerful extensions to the standard
407datetime module, available in Python 2.3+.")
408 ;; The license was changed from the three-clause BSD license to a dual
409 ;; Apache 2.0/BSD-3 variant at 2017-12-01. Some code is only available as
410 ;; BSD-3 still; but all new code is dual licensed (the user can choose).
411 (license (list bsd-3 asl2.0))))
412
413(define-public python-dateutils
414 ;; XXX: The last release was in 2021, no development on the master
415 ;; branch. consider to remove when nothing depends on it.
416 (package
417 (name "python-dateutils")
418 (version "0.6.12")
419 (source (origin
420 (method url-fetch)
421 (uri (pypi-uri "dateutils" version))
422 (sha256
423 (base32
424 "1wg3f3imjq3snvjccv64h5498pqv9xz664xhni7bsh8mnay91p83"))))
425 (build-system pyproject-build-system)
426 (arguments (list #:tests? #f)) ;requires twine
427 (propagated-inputs (list python-dateutil python-pytz))
428 (native-inputs (list python-setuptools))
429 (home-page "https://github.com/jmcantrell/python-dateutils")
430 (synopsis "Various utilities for working with date and datetime objects")
431 (description
432 "The main purpose of this package is to provide more complex arithmetic
433operations on dates/times. Heavy use is made of the @code{relativedelta} type
434from the @code{dateutil} library. Much of this package is just a light
435wrapper on top of this with some added features such as range generation and
436business day calculation.")
437 (license bsd-0)))
438
439(define-public python-parsedatetime
440 (package
441 (name "python-parsedatetime")
442 (version "2.6")
443 (source
444 (origin
445 (method git-fetch)
446 (uri (git-reference
447 (url "https://github.com/bear/parsedatetime")
448 (commit (string-append "v" version))))
449 (file-name (git-file-name name version))
450 (sha256
451 (base32 "001rxkawjjjffbqzjg96znkhj4z6q7ky349rldd8yx6vk8cgdc2m"))))
452 (build-system pyproject-build-system)
453 (native-inputs
454 (list python-pyicu python-pytest python-setuptools python-wheel))
455 (propagated-inputs
456 (list python-future))
457 (home-page "https://github.com/bear/parsedatetime/")
458 (synopsis "Parse human-readable date/time text")
459 (description
460 "This package provides some tools to parse human-readable date/time text
461in Python.")
462 (license asl2.0)))
463
464(define-public python-ciso8601
465 (package
466 (name "python-ciso8601")
467 (version "2.3.2")
468 (source
469 (origin
470 (method git-fetch)
471 ;; The PyPi distribution doesn't include the tests.
472 (uri (git-reference
473 (url "https://github.com/closeio/ciso8601")
474 (commit (string-append "v" version))))
475 (file-name (git-file-name name version))
476 (sha256
477 (base32 "189adk14ygs1cx3ncm1wqqfh18r72gl299zkllncynp1y79d0nd1"))))
478 (build-system pyproject-build-system)
479 (native-inputs
480 (list python-pytest
481 python-setuptools
482 python-wheel))
483 (home-page "https://github.com/closeio/ciso8601")
484 (synopsis "Fast ISO8601 date time parser")
485 (description
486 "The package ciso8601 converts ISO 8601 or RFC 3339 date time strings
487into Python datetime objects.")
488 (license expat)))
489
490(define-public python-relativetimebuilder
491 (package
492 (name "python-relativetimebuilder")
493 (version "3.0.1")
494 (source
495 (origin
496 (method url-fetch)
497 (uri (pypi-uri "relativetimebuilder" version))
498 (sha256
499 (base32 "1x83vzwajz8rmml8x4ysr4cnxh6x0w42wkhw4zivd8qsbi9zcwzm"))))
500 (build-system pyproject-build-system)
501 (native-inputs
502 (list python-pytest
503 python-setuptools
504 python-wheel))
505 (propagated-inputs
506 (list python-aniso8601
507 python-dateutil))
508 (home-page "https://bitbucket.org/nielsenb/relativetimebuilder")
509 (synopsis "ANISO8601 builder for dateutil relativedeltas")
510 (description
511 "This package provides functionality for utilizing the relativedelta
512feature from the dateutil library, ensuring calendar precision with
513aniso8601.")
514 ;; setup.py and PyPI: "License :: OSI Approved :: BSD License"
515 (license bsd-3)))
516
517(define-public python-timeslot
518 (let ((commit "af35445e96cbb2f3fb671a75aac6aa93e4e7e7a6")
519 (revision "0"))
520 (package
521 (name "python-timeslot")
522 (version (git-version "0.1.2" revision commit))
523 (source
524 (origin
525 (method git-fetch)
526 (uri (git-reference
527 (url "https://github.com/ErikBjare/timeslot")
528 (commit commit)))
529 (file-name (git-file-name name version))
530 (sha256
531 (base32 "1m0zrr60p4brkdwkkhdzhvmd98flklqgbjryjpdcfq1c4gd60j0q"))))
532 (build-system pyproject-build-system)
533 (native-inputs
534 (list python-poetry-core python-pytest python-setuptools))
535 (home-page "https://github.com/ErikBjare/timeslot")
536 (synopsis "Data type for representing time slots")
537 (description
538 "This package provides a data type for representing time slots with a
539start and end. It completes the datetime Python module, which can represent a
540time, a duration, a timezone, but not a range or interval.")
541 (license expat))))
542
543(define-public python-timezonefinder
544 (package
545 (name "python-timezonefinder")
546 (version "8.2.1")
547 (source
548 (origin
549 (method git-fetch)
550 (uri (git-reference
551 (url "https://github.com/jannikmi/timezonefinder")
552 (commit version)))
553 (file-name (git-file-name name version))
554 (sha256
555 (base32 "0madqryxm3ynij1n285vakp8l2mz8mzlfg5slcy0mbbz5vh4kqrs"))))
556 (build-system pyproject-build-system)
557 (arguments
558 (list
559 ;; tests: 1995 passed, 1 deselected
560 #:test-flags
561 ;; FileNotFoundError: [Errno 2] No such file or directory: 'uv'
562 #~(list "--ignore=tests/test_package_contents.py"
563 "--ignore=tests/test_integration.py"
564 ;; ValueError: Trying to use the clang implementation of the
565 ;; point in polygon algorithm while the C extension in not
566 ;; loaded.
567 "--ignore=tests/utils_test.py"
568 ;; pytz.exceptions.UnknownTimeZoneError: 'America/Coyhaique'
569 (string-append "--deselect=tests/test_compatibility.py::"
570 "TestCompatibility::test_with_pytz"))))
571 (native-inputs
572 (list python-pytest
573 python-pytz
574 python-setuptools))
575 (propagated-inputs
576 (list python-cffi
577 python-h3
578 python-flatbuffers
579 python-numpy
580 python-pydantic))
581 (home-page "https://timezonefinder.michelfe.it/gui")
582 (synopsis "Finding the timezone of any coordinates on Earth offline")
583 (description "This is a python package for looking up the corresponding
584timezone for given coordinates on earth entirely offline.")
585 (license expat)))
586
587(define-public python-strict-rfc3339
588 (package
589 (name "python-strict-rfc3339")
590 (version "0.7")
591 (source
592 (origin
593 (method git-fetch)
594 (uri (git-reference
595 (url "https://github.com/danielrichman/strict-rfc3339")
596 (commit (string-append "version-" version))))
597 (file-name (git-file-name name version))
598 (sha256
599 (base32 "0b12bh9v9gwkm89kxbidxw2z81lg8fx1v5fzgs313v1wgx6qb09p"))))
600 (build-system pyproject-build-system)
601 (arguments
602 (list
603 #:test-backend #~'unittest
604 #:test-flags #~(list "discover")
605 #:phases
606 #~(modify-phases %standard-phases
607 (add-after 'unpack 'skip-bad-tests
608 (lambda _
609 ;; The timestamp to local offset tests fail due to missing
610 ;; timezone data (see:
611 ;; https://github.com/danielrichman/strict-rfc3339/issues/9).
612 (substitute* "test_strict_rfc3339.py"
613 ((#$(if (or (target-x86-32?) (target-arm32?))
614 ;; On 32-bit platforms the size of time_t is too small
615 ;; for these tests.
616 (string-append "(test_dst_transition|test_float|"
617 "test_now|test_simple_cases|"
618 "test_leap_year|test_y2038)")
619 (string-append "(test_dst_transition|test_float|"
620 "test_now|test_simple_cases)"))
621 match)
622 (string-append "__off_" match))))))))
623 (native-inputs (list python-setuptools))
624 (home-page "https://github.com/danielrichman/strict-rfc3339")
625 (synopsis "RFC3339 procedures library")
626 (description
627 "The @code{strict_rfc3339} Python module provides strict, simple, lightweight
628@url{https://www.rfc-editor.org/rfc/rfc3339, RFC3339} (Date and Time on the
629Internet: Timestamps) procedures.
630
631It enables or aims to:
632@itemize
633@item Convert UNIX timestamps to and from RFC3339.
634@item Produce RFC3339 strings with a UTC offset (Z) or with the offset that
635the C time module reports is the local timezone offset.
636@item Be simple with minimal dependencies/libraries.
637@item Avoid timezones as much as possible.
638@item Be very strict and follow RFC3339.
639@end itemize")
640 (license gpl3+)))
641
642(define-public python-tzlocal
643 (package
644 (name "python-tzlocal")
645 (version "5.2")
646 (source
647 (origin
648 (method git-fetch)
649 (uri (git-reference
650 (url "https://github.com/regebro/tzlocal")
651 (commit version)))
652 (file-name (git-file-name name version))
653 (sha256
654 (base32
655 "1apa3i5fsfw28jnaaaa7jr976y5wbifl3h04id0bvplvsb9zpmy7"))))
656 (build-system pyproject-build-system)
657 (propagated-inputs
658 (list python-tzdata))
659 (native-inputs
660 (list python-pytest python-pytest-mock python-setuptools))
661 (home-page "https://github.com/regebro/tzlocal")
662 (synopsis "Local timezone information for Python")
663 (description
664 "Tzlocal returns a tzinfo object with the local timezone information.
665This module attempts to fix a glaring hole in pytz, that there is no way to
666get the local timezone information, unless you know the zoneinfo name, and
667under several distributions that's hard or impossible to figure out.")
668 (license expat)))
669
670(define-public python-isodate
671 (package
672 (name "python-isodate")
673 (version "0.7.2")
674 (source
675 (origin
676 (method url-fetch)
677 (uri (pypi-uri "isodate" version))
678 (sha256
679 (base32
680 "1rjkm5qj3lz60sgva5g38cpfqd8byj2jlaf0qskg8xna8c7smlac"))))
681 (build-system pyproject-build-system)
682 (native-inputs
683 (list python-pytest
684 python-setuptools
685 python-setuptools-scm
686 python-wheel))
687 (home-page "https://github.com/gweis/isodate/")
688 (synopsis "Python date parser and formatter")
689 (description
690 "Python-isodate is a python module for parsing and formatting
691ISO 8601 dates, time and duration.")
692 (license bsd-3)))
693
694(define-public python-iso8601
695 (package
696 (name "python-iso8601")
697 (version "2.1.0")
698 (source
699 (origin
700 (method url-fetch)
701 (uri (pypi-uri "iso8601" version))
702 (sha256
703 (base32 "1px83gnklx1dmwb3n3dcplyfvaczhbvhkjcq34qc88c9xqlkh7bb"))))
704 (build-system pyproject-build-system)
705 (native-inputs (list python-poetry-core python-pytest python-pytz))
706 (home-page "https://github.com/micktwomey/pyiso8601")
707 (synopsis "Module to parse ISO 8601 dates")
708 (description
709 "This module parses the most common forms of ISO 8601 date strings (e.g.
710@code{2007-01-14T20:34:22+00:00}) into @code{datetime} objects.")
711 (license expat)))
712
713;; The only one user is samba/pinned.
714(define-public python-iso8601/pinned
715 (hidden-package
716 (package/inherit python-iso8601
717 (version "1.0.2")
718 (source
719 (origin
720 (method url-fetch)
721 (uri (pypi-uri "iso8601" version))
722 (sha256
723 (base32
724 "1ccl6plks706hxm35cn1wsvxhqh3bfwi5cjgjpdxjib81qi07x97")))))))
725
726(define-public python-pyrfc3339
727 (package
728 (name "python-pyrfc3339")
729 (version "2.0.1")
730 (source
731 (origin
732 (method git-fetch) ;no tests in PyPI archive
733 (uri (git-reference
734 (url "https://github.com/kurtraschke/pyRFC3339")
735 (commit (string-append "v" version))))
736 (file-name (git-file-name name version))
737 (sha256
738 (base32 "1q7kz8i8kp1hk40zswgm7dcyyd2xmjpgn1jdm6rlpv3ddjdxdg48"))))
739 (build-system pyproject-build-system)
740 (arguments
741 (list
742 #:phases
743 #~(modify-phases %standard-phases
744 (add-before 'check 'pre-check
745 (lambda* (#:key inputs #:allow-other-keys)
746 (setenv "TZ" "UTC")
747 (setenv "TZDIR"
748 (search-input-directory inputs "share/zoneinfo")))))))
749 (native-inputs
750 (list python-pytest
751 python-setuptools
752 tzdata-for-tests))
753 (home-page "https://github.com/kurtraschke/pyRFC3339")
754 (synopsis "Python timestamp library")
755 (description "Python library for generating and parsing RFC 3339-compliant
756timestamps.")
757 (license expat)))
758
759(define-public python-arrow
760 (package
761 (name "python-arrow")
762 (version "1.3.0")
763 (source (origin
764 (method url-fetch)
765 (uri (pypi-uri "arrow" version))
766 (sha256
767 (base32
768 "11bssv25jix57igvfmvg2v8dmwk55b4dh6hgffazidccchbhcm6l"))))
769 (build-system pyproject-build-system)
770 ;; Tests: 1837 passed, 2 xpassed.
771 (native-inputs
772 (list python-dateparser
773 python-flit-core
774 python-pytest
775 python-pytest-mock
776 python-pytz
777 python-simplejson))
778 (propagated-inputs
779 (list python-dateutil
780 python-types-python-dateutil))
781 (home-page "https://github.com/arrow-py/arrow")
782 (synopsis "Dates and times for Python")
783 (description
784 "Arrow is a Python library to creating, manipulating, formatting and
785converting dates, times, and timestamps. It implements and updates the
786datetime type.")
787 (license asl2.0)))
788
789(define-public python-aniso8601
790 (package
791 (name "python-aniso8601")
792 (version "10.0.1")
793 (source
794 (origin
795 (method url-fetch)
796 (uri (pypi-uri "aniso8601" version))
797 (sha256
798 (base32 "0ib8s62d3zh7qy5rnlrisns2bbjixb0lmyal3yp2h5fxcf38yj15"))))
799 (build-system pyproject-build-system)
800 (arguments (list #:test-backend #~'unittest
801 #:test-flags #~(list "discover" "aniso8601")))
802 (native-inputs
803 (list python-setuptools))
804 (home-page "https://codeberg.org/nielsenb-jf/aniso8601")
805 (synopsis "Python library for parsing ISO 8601 strings")
806 (description
807 "This package contains a library for parsing ISO 8601 datetime strings.")
808 (license bsd-3)))
809
810(define-public rdate
811 (let ((commit "91d84610e3695e90a884e2953908e95a856a9b74")
812 (revision "1"))
813 (package
814 (name "rdate")
815 (version (git-version "1.4" revision commit))
816 (source
817 (origin
818 (method git-fetch)
819 (uri (git-reference
820 (url "https://github.com/njh/rdate")
821 (commit commit)))
822 (file-name (git-file-name name version))
823 (sha256
824 (base32 "002ryjq8gj1ml5la4v6dr3bh1zw5kxwy65rpziq8d2ccccarhv59"))))
825 (build-system gnu-build-system)
826 (native-inputs (list autoconf automake))
827 (synopsis "Get date and time based on RFC 868")
828 (description
829 "@code{rdate} connects to an RFC 868 time server over a TCP/IP network,
830printing the returned time and/or setting the system clock.")
831 (home-page "https://www.aelius.com/njh/rdate/")
832 (license gpl2+))))
833
834(define-public datefudge
835 (package
836 (name "datefudge")
837 (version "1.27")
838 (source (origin
839 ;; Source code is available from
840 ;; <https://salsa.debian.org/debian/datefudge.git>. However,
841 ;; for bootstrapping reasons, we do not rely on 'git-fetch' here
842 ;; (since Git -> GnuTLS -> datefudge).
843 (method url-fetch)
844 (uri (list
845 (string-append
846 "mirror://debian/pool/main/d/datefudge/datefudge_"
847 version ".tar.xz")
848 ;; Update the Debian snapshot URL when updating the package.
849 (string-append
850 "https://snapshot.debian.org/archive/debian/"
851 "20240830T084547Z/pool/main/d/datefudge/"
852 "datefudge_1.27.tar.xz")))
853 (sha256
854 (base32
855 "0b9azg6z92s74f0rmm3hdd5l5dcldgiq5bza06mgc3ibpnlhqz0g"))))
856 (build-system gnu-build-system)
857 (arguments
858 `(#:test-target "test"
859 #:make-flags (list (string-append "CC=" ,(cc-for-target))
860 (string-append "VERSION=" ,version)
861 (string-append "prefix=" (assoc-ref %outputs "out")))
862 #:phases
863 (modify-phases %standard-phases
864 (delete 'configure))))
865 (native-inputs
866 (list perl))
867 (home-page "https://salsa.debian.org/debian/datefudge")
868 (synopsis "Pretend the system date is different")
869 (description
870 "Utility that fakes the system time by pre-loading a small library that
871modifies the @code{time}, @code{gettimeofday} and @code{clock_gettime} system
872calls.")
873 (license gpl2)))
874
875(define-public tz
876 (package
877 (name "tz")
878 (version "0.8.0")
879 (source
880 (origin
881 (method git-fetch)
882 (uri (git-reference
883 (url "https://github.com/oz/tz")
884 (commit (string-append "v" version))))
885 (file-name (git-file-name name version))
886 (sha256
887 (base32 "0pnfz88pbb5jmr1p6m53447d9r8mn9s0f6qd8dpmn0i844lfv5rs"))))
888 (build-system go-build-system)
889 (arguments
890 (list
891 #:import-path "github.com/oz/tz"
892 #:test-flags #~(list "-vet=off")))
893 (inputs
894 (list go-github-com-charmbracelet-bubbletea
895 go-github-com-mattn-go-isatty
896 go-github-com-muesli-termenv
897 go-github-com-pelletier-go-toml-v2
898 go-github-com-tkuchiki-go-timezone
899 go-golang-org-x-term
900 go-golang-org-x-tools))
901 (home-page "https://github.com/oz/tz")
902 (synopsis "TUI time zone helper")
903 (description
904 "@command{tz} helps you schedule things across time zones. It is an
905interactive TUI program that displays time across a few time zones of your
906choosing.")
907 (license gpl3+)))
908
909(define-public countdown
910 (package
911 (name "countdown")
912 (version "1.5.0")
913 (source
914 (origin
915 (method git-fetch)
916 (uri (git-reference
917 (url "https://github.com/antonmedv/countdown")
918 (commit (string-append "v" version))))
919 (file-name (git-file-name name version))
920 (sha256
921 (base32 "0snz26dvj8v58fyzd51bcf07b5yp2akcyy26w7b0pnkmlh3lknmk"))))
922 (build-system go-build-system)
923 (arguments
924 (list
925 #:import-path "github.com/antonmedv/countdown"))
926 (native-inputs
927 (list go-github-com-nsf-termbox-go))
928 (home-page "https://github.com/antonmedv/countdown")
929 (synopsis "Counts to zero with a text user interface")
930 (description
931 "Countdown provides a fancy text display while it counts down to zero
932from a starting point you provide. The user can pause and resume the
933countdown from the text user interface.")
934 (license expat)))
935
936(define-public temporal-capi
937 (package
938 (name "temporal-capi")
939 (version "0.2.6")
940 (source
941 (origin
942 (method url-fetch)
943 (uri (crate-uri "temporal_capi" version))
944 (file-name (string-append name "-" version ".tar.gz"))
945 (sha256
946 (base32 "1wm53x8bxh2smpl4a6d7s4iqlngxsd556yhyinjalb529k5bk3pl"))))
947 (build-system cargo-build-system)
948 (arguments
949 (list
950 #:install-source? #f
951 #:phases
952 #~(modify-phases %standard-phases
953 (add-after 'unpack 'adjust-for-cdylib
954 (lambda _
955 (substitute* "Cargo.toml"
956 (("^\\[lib].*" all)
957 (string-append all "crate-type = [\"cdylib\"]\n")))
958 (substitute* "src/lib.rs"
959 (("#!\\[no_std].*") ""))))
960 (replace 'install
961 (lambda _
962 (for-each (lambda (x)
963 (install-file x (string-append
964 #$output "/include/temporal_rs")))
965 (find-files "bindings" "\\.h(pp)?$"))
966 ;; Use `find-files' as the output directory changes when
967 ;; cross-compiling.
968 (let* ((shared-objects (find-files "." "libtemporal_capi.so"))
969 (libtemporal_capi.so (car
970 (filter (lambda (x)
971 (string=? "release"
972 (basename
973 (dirname x))))
974 shared-objects))))
975 (install-file libtemporal_capi.so
976 (string-append #$output "/lib"))))))))
977 (inputs (list rust-temporal-0.2.6))
978 (home-page "https://github.com/boa-dev/temporal")
979 (synopsis "C and C++ interfaces to @code{temporal_rs}")
980 (description "This package provides C and C++ interfaces to
981@code{temporal_rs}, a Rust date/time library that provides support for
982calendrical calculations and time zones that is based on the ECMAScript
983Temporal specification.")
984 (license (list asl2.0 expat)))) ;dual-licensed