I: pbuilder: network access will be disabled during build I: Current time: Wed Dec 17 23:13:41 -12 2025 I: pbuilder-time-stamp: 1766056421 I: Building the build Environment I: extracting base tarball [/var/cache/pbuilder/unstable-reproducible-base.tgz] I: copying local configuration W: --override-config is not set; not updating apt.conf Read the manpage for details. I: mounting /proc filesystem I: mounting /sys filesystem I: creating /{dev,run}/shm I: mounting /dev/pts filesystem I: redirecting /dev/ptmx to /dev/pts/ptmx I: policy-rc.d already exists I: using eatmydata during job I: Copying source file I: copying [khal_0.11.3-2.dsc] I: copying [./khal_0.11.3.orig.tar.gz] I: copying [./khal_0.11.3-2.debian.tar.xz] I: Extracting source gpgv: Signature made Wed Aug 21 07:49:23 2024 gpgv: using RSA key 9FE3E9C36691A69FF53CC6842C7C3146C1A00121 gpgv: issuer "dr@jones.dk" gpgv: Can't check signature: No public key dpkg-source: warning: cannot verify inline signature for ./khal_0.11.3-2.dsc: no acceptable signature found dpkg-source: info: extracting khal in khal-0.11.3 dpkg-source: info: unpacking khal_0.11.3.orig.tar.gz dpkg-source: info: unpacking khal_0.11.3-2.debian.tar.xz dpkg-source: info: using patch list from debian/patches/series dpkg-source: info: applying 020230617~508fda5.patch dpkg-source: info: applying 020230617~c4cd982.patch dpkg-source: info: applying 020230617~ca32ec3.patch dpkg-source: info: applying 020230617~fe5be01.patch dpkg-source: info: applying 1001_shebang.patch dpkg-source: info: applying 2001_No_RSS_news_in_docs.patch dpkg-source: info: applying 2002_Fix_intersphinx_mapping.patch dpkg-source: info: applying 2003_Avoid_privacy_breach_in_sphinx_doc.patch dpkg-source: info: applying 2004_version.patch dpkg-source: info: applying 2005_icalendar_5.patch dpkg-source: info: applying 2006_pytz.patch I: Not using root during the build. I: Installing the build-deps I: user script /srv/workspace/pbuilder/12131/tmp/hooks/D02_print_environment starting I: set BUILDDIR='/build/reproducible-path' BUILDUSERGECOS='first user,first room,first work-phone,first home-phone,first other' BUILDUSERNAME='pbuilder1' BUILD_ARCH='i386' DEBIAN_FRONTEND='noninteractive' DEB_BUILD_OPTIONS='buildinfo=+all reproducible=+all parallel=6 ' DISTRIBUTION='unstable' HOME='/root' HOST_ARCH='i386' IFS=' ' INVOCATION_ID='49b52bc820144a4b83546940ba33197d' LANG='C' LANGUAGE='en_US:en' LC_ALL='C' LD_LIBRARY_PATH='/usr/lib/libeatmydata' LD_PRELOAD='libeatmydata.so' MAIL='/var/mail/root' OPTIND='1' PATH='/usr/sbin:/usr/bin:/sbin:/bin:/usr/games' PBCURRENTCOMMANDLINEOPERATION='build' PBUILDER_OPERATION='build' PBUILDER_PKGDATADIR='/usr/share/pbuilder' PBUILDER_PKGLIBDIR='/usr/lib/pbuilder' PBUILDER_SYSCONFDIR='/etc' PPID='12131' PS1='# ' PS2='> ' PS4='+ ' PWD='/' SHELL='/bin/bash' SHLVL='2' SUDO_COMMAND='/usr/bin/timeout -k 18.1h 18h /usr/bin/ionice -c 3 /usr/bin/nice /usr/sbin/pbuilder --build --configfile /srv/reproducible-results/rbuild-debian/r-b-build.y4RyifCU/pbuilderrc_gVtd --distribution unstable --hookdir /etc/pbuilder/first-build-hooks --debbuildopts -b --basetgz /var/cache/pbuilder/unstable-reproducible-base.tgz --buildresult /srv/reproducible-results/rbuild-debian/r-b-build.y4RyifCU/b1 --logfile b1/build.log khal_0.11.3-2.dsc' SUDO_GID='111' SUDO_UID='104' SUDO_USER='jenkins' TERM='unknown' TZ='/usr/share/zoneinfo/Etc/GMT+12' USER='root' _='/usr/bin/systemd-run' I: uname -a Linux infom08-i386 6.10.11+bpo-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.10.11-1~bpo12+1 (2024-10-03) x86_64 GNU/Linux I: ls -l /bin lrwxrwxrwx 1 root root 7 Aug 4 2024 /bin -> usr/bin I: user script /srv/workspace/pbuilder/12131/tmp/hooks/D02_print_environment finished -> Attempting to satisfy build-dependencies -> Creating pbuilder-satisfydepends-dummy package Package: pbuilder-satisfydepends-dummy Version: 0.invalid.0 Architecture: i386 Maintainer: Debian Pbuilder Team Description: Dummy package to satisfy dependencies with aptitude - created by pbuilder This package was created automatically by pbuilder to satisfy the build-dependencies of the package being currently built. Depends: debhelper-compat (= 13), dh-sequence-bash-completion, dh-sequence-python3, dh-sequence-sphinxdoc, locales, python3-all, python3-click, python3-configobj, python3-dateutil, python3-doc, python3-freezegun, python3-hypothesis, python3-icalendar (>= 5), python3-packaging, python3-pytest, python3-setuptools, python3-sphinx, python3-sphinx-rtd-theme, python3-tz (>= 2023.3-3~), python3-tzlocal, python3-urwid, python3-xdg, vdirsyncer dpkg-deb: building package 'pbuilder-satisfydepends-dummy' in '/tmp/satisfydepends-aptitude/pbuilder-satisfydepends-dummy.deb'. Selecting previously unselected package pbuilder-satisfydepends-dummy. (Reading database ... 19954 files and directories currently installed.) Preparing to unpack .../pbuilder-satisfydepends-dummy.deb ... Unpacking pbuilder-satisfydepends-dummy (0.invalid.0) ... dpkg: pbuilder-satisfydepends-dummy: dependency problems, but configuring anyway as you requested: pbuilder-satisfydepends-dummy depends on debhelper-compat (= 13); however: Package debhelper-compat is not installed. pbuilder-satisfydepends-dummy depends on dh-sequence-bash-completion; however: Package dh-sequence-bash-completion is not installed. pbuilder-satisfydepends-dummy depends on dh-sequence-python3; however: Package dh-sequence-python3 is not installed. pbuilder-satisfydepends-dummy depends on dh-sequence-sphinxdoc; however: Package dh-sequence-sphinxdoc is not installed. pbuilder-satisfydepends-dummy depends on locales; however: Package locales is not installed. pbuilder-satisfydepends-dummy depends on python3-all; however: Package python3-all is not installed. pbuilder-satisfydepends-dummy depends on python3-click; however: Package python3-click is not installed. pbuilder-satisfydepends-dummy depends on python3-configobj; however: Package python3-configobj is not installed. pbuilder-satisfydepends-dummy depends on python3-dateutil; however: Package python3-dateutil is not installed. pbuilder-satisfydepends-dummy depends on python3-doc; however: Package python3-doc is not installed. pbuilder-satisfydepends-dummy depends on python3-freezegun; however: Package python3-freezegun is not installed. pbuilder-satisfydepends-dummy depends on python3-hypothesis; however: Package python3-hypothesis is not installed. pbuilder-satisfydepends-dummy depends on python3-icalendar (>= 5); however: Package python3-icalendar is not installed. pbuilder-satisfydepends-dummy depends on python3-packaging; however: Package python3-packaging is not installed. pbuilder-satisfydepends-dummy depends on python3-pytest; however: Package python3-pytest is not installed. pbuilder-satisfydepends-dummy depends on python3-setuptools; however: Package python3-setuptools is not installed. pbuilder-satisfydepends-dummy depends on python3-sphinx; however: Package python3-sphinx is not installed. pbuilder-satisfydepends-dummy depends on python3-sphinx-rtd-theme; however: Package python3-sphinx-rtd-theme is not installed. pbuilder-satisfydepends-dummy depends on python3-tz (>= 2023.3-3~); however: Package python3-tz is not installed. pbuilder-satisfydepends-dummy depends on python3-tzlocal; however: Package python3-tzlocal is not installed. pbuilder-satisfydepends-dummy depends on python3-urwid; however: Package python3-urwid is not installed. pbuilder-satisfydepends-dummy depends on python3-xdg; however: Package python3-xdg is not installed. pbuilder-satisfydepends-dummy depends on vdirsyncer; however: Package vdirsyncer is not installed. Setting up pbuilder-satisfydepends-dummy (0.invalid.0) ... Reading package lists... Building dependency tree... Reading state information... Initializing package states... Writing extended state information... Building tag database... pbuilder-satisfydepends-dummy is already installed at the requested version (0.invalid.0) pbuilder-satisfydepends-dummy is already installed at the requested version (0.invalid.0) The following NEW packages will be installed: autoconf{a} automake{a} autopoint{a} autotools-dev{a} bash-completion{a} bsdextrautils{a} ca-certificates{a} debhelper{a} dh-autoreconf{a} dh-python{a} dh-strip-nondeterminism{a} docutils-common{a} dwz{a} file{a} fonts-font-awesome{a} fonts-lato{a} gettext{a} gettext-base{a} groff-base{a} intltool-debian{a} libarchive-zip-perl{a} libcom-err2{a} libdebhelper-perl{a} libelf1t64{a} libexpat1{a} libfile-stripnondeterminism-perl{a} libgssapi-krb5-2{a} libicu72{a} libjs-jquery{a} libjs-sphinxdoc{a} libjs-underscore{a} libjson-perl{a} libk5crypto3{a} libkeyutils1{a} libkrb5-3{a} libkrb5support0{a} libmagic-mgc{a} libmagic1t64{a} libnsl2{a} libpipeline1{a} libpython3-stdlib{a} libpython3.12-minimal{a} libpython3.12-stdlib{a} libpython3.13-minimal{a} libpython3.13-stdlib{a} libreadline8t64{a} libtirpc-common{a} libtirpc3t64{a} libtool{a} libuchardet0{a} libxml2{a} locales{a} m4{a} man-db{a} media-types{a} netbase{a} openssl{a} po-debconf{a} python-babel-localedata{a} python3{a} python3-aiohappyeyeballs{a} python3-aiohttp{a} python3-aiosignal{a} python3-aiostream{a} python3-alabaster{a} python3-all{a} python3-async-timeout{a} python3-atomicwrites{a} python3-attr{a} python3-autocommand{a} python3-babel{a} python3-certifi{a} python3-chardet{a} python3-charset-normalizer{a} python3-click{a} python3-click-log{a} python3-colorama{a} python3-configobj{a} python3-dateutil{a} python3-defusedxml{a} python3-doc{a} python3-docutils{a} python3-freezegun{a} python3-frozenlist{a} python3-hypothesis{a} python3-icalendar{a} python3-idna{a} python3-imagesize{a} python3-inflect{a} python3-iniconfig{a} python3-jaraco.context{a} python3-jaraco.functools{a} python3-jaraco.text{a} python3-jinja2{a} python3-markupsafe{a} python3-minimal{a} python3-more-itertools{a} python3-multidict{a} python3-packaging{a} python3-pkg-resources{a} python3-pluggy{a} python3-pygments{a} python3-pytest{a} python3-requests{a} python3-roman{a} python3-setuptools{a} python3-snowballstemmer{a} python3-sortedcontainers{a} python3-sphinx{a} python3-sphinx-rtd-theme{a} python3-sphinxcontrib.jquery{a} python3-typeguard{a} python3-typing-extensions{a} python3-tz{a} python3-tzlocal{a} python3-urllib3{a} python3-urwid{a} python3-wcwidth{a} python3-xdg{a} python3-yarl{a} python3-zipp{a} python3.12{a} python3.12-doc{a} python3.12-minimal{a} python3.13{a} python3.13-minimal{a} readline-common{a} sensible-utils{a} sgml-base{a} sphinx-common{a} sphinx-rtd-theme-common{a} tzdata{a} vdirsyncer{a} xml-core{a} The following packages are RECOMMENDED but will NOT be installed: curl javascript-common krb5-locales libarchive-cpio-perl libjson-xs-perl libltdl-dev libmail-sendmail-perl libpaper-utils lynx python3-aiodns python3-pil wget 0 packages upgraded, 134 newly installed, 0 to remove and 0 not upgraded. Need to get 70.0 MB of archives. After unpacking 305 MB will be used. Writing extended state information... Get: 1 http://deb.debian.org/debian unstable/main i386 fonts-lato all 2.015-1 [2780 kB] Get: 2 http://deb.debian.org/debian unstable/main i386 libpython3.12-minimal i386 3.12.7-3 [814 kB] Get: 3 http://deb.debian.org/debian unstable/main i386 libexpat1 i386 2.6.4-1 [107 kB] Get: 4 http://deb.debian.org/debian unstable/main i386 python3.12-minimal i386 3.12.7-3 [2236 kB] Get: 5 http://deb.debian.org/debian unstable/main i386 python3-minimal i386 3.12.7-1 [26.8 kB] Get: 6 http://deb.debian.org/debian unstable/main i386 media-types all 10.1.0 [26.9 kB] Get: 7 http://deb.debian.org/debian unstable/main i386 netbase all 6.4 [12.8 kB] Get: 8 http://deb.debian.org/debian unstable/main i386 tzdata all 2024b-3 [255 kB] Get: 9 http://deb.debian.org/debian unstable/main i386 libkrb5support0 i386 1.21.3-3 [34.9 kB] Get: 10 http://deb.debian.org/debian unstable/main i386 libcom-err2 i386 1.47.1-1+b1 [23.4 kB] Get: 11 http://deb.debian.org/debian unstable/main i386 libk5crypto3 i386 1.21.3-3 [83.6 kB] Get: 12 http://deb.debian.org/debian unstable/main i386 libkeyutils1 i386 1.6.3-4 [9600 B] Get: 13 http://deb.debian.org/debian unstable/main i386 libkrb5-3 i386 1.21.3-3 [350 kB] Get: 14 http://deb.debian.org/debian unstable/main i386 libgssapi-krb5-2 i386 1.21.3-3 [146 kB] Get: 15 http://deb.debian.org/debian unstable/main i386 libtirpc-common all 1.3.4+ds-1.3 [10.9 kB] Get: 16 http://deb.debian.org/debian unstable/main i386 libtirpc3t64 i386 1.3.4+ds-1.3+b1 [90.5 kB] Get: 17 http://deb.debian.org/debian unstable/main i386 libnsl2 i386 1.3.0-3+b3 [42.7 kB] Get: 18 http://deb.debian.org/debian unstable/main i386 readline-common all 8.2-5 [69.3 kB] Get: 19 http://deb.debian.org/debian unstable/main i386 libreadline8t64 i386 8.2-5 [173 kB] Get: 20 http://deb.debian.org/debian unstable/main i386 libpython3.12-stdlib i386 3.12.7-3 [1964 kB] Get: 21 http://deb.debian.org/debian unstable/main i386 python3.12 i386 3.12.7-3 [671 kB] Get: 22 http://deb.debian.org/debian unstable/main i386 libpython3-stdlib i386 3.12.7-1 [9712 B] Get: 23 http://deb.debian.org/debian unstable/main i386 python3 i386 3.12.7-1 [27.8 kB] Get: 24 http://deb.debian.org/debian unstable/main i386 libpython3.13-minimal i386 3.13.0-2 [856 kB] Get: 25 http://deb.debian.org/debian unstable/main i386 python3.13-minimal i386 3.13.0-2 [2112 kB] Get: 26 http://deb.debian.org/debian unstable/main i386 sgml-base all 1.31 [15.4 kB] Get: 27 http://deb.debian.org/debian unstable/main i386 sensible-utils all 0.0.24 [24.8 kB] Get: 28 http://deb.debian.org/debian unstable/main i386 bash-completion all 1:2.14.0-2 [310 kB] Get: 29 http://deb.debian.org/debian unstable/main i386 openssl i386 3.3.2-2 [1387 kB] Get: 30 http://deb.debian.org/debian unstable/main i386 ca-certificates all 20240203 [158 kB] Get: 31 http://deb.debian.org/debian unstable/main i386 libmagic-mgc i386 1:5.45-3+b1 [314 kB] Get: 32 http://deb.debian.org/debian unstable/main i386 libmagic1t64 i386 1:5.45-3+b1 [115 kB] Get: 33 http://deb.debian.org/debian unstable/main i386 file i386 1:5.45-3+b1 [43.2 kB] Get: 34 http://deb.debian.org/debian unstable/main i386 gettext-base i386 0.22.5-2 [201 kB] Get: 35 http://deb.debian.org/debian unstable/main i386 libuchardet0 i386 0.0.8-1+b2 [69.2 kB] Get: 36 http://deb.debian.org/debian unstable/main i386 groff-base i386 1.23.0-5 [1196 kB] Get: 37 http://deb.debian.org/debian unstable/main i386 locales all 2.40-3 [3903 kB] Get: 38 http://deb.debian.org/debian unstable/main i386 bsdextrautils i386 2.40.2-11 [95.6 kB] Get: 39 http://deb.debian.org/debian unstable/main i386 libpipeline1 i386 1.5.8-1 [41.2 kB] Get: 40 http://deb.debian.org/debian unstable/main i386 man-db i386 2.13.0-1 [1428 kB] Get: 41 http://deb.debian.org/debian unstable/main i386 m4 i386 1.4.19-4 [293 kB] Get: 42 http://deb.debian.org/debian unstable/main i386 autoconf all 2.72-3 [493 kB] Get: 43 http://deb.debian.org/debian unstable/main i386 autotools-dev all 20220109.1 [51.6 kB] Get: 44 http://deb.debian.org/debian unstable/main i386 automake all 1:1.16.5-1.3 [823 kB] Get: 45 http://deb.debian.org/debian unstable/main i386 autopoint all 0.22.5-2 [723 kB] Get: 46 http://deb.debian.org/debian unstable/main i386 libdebhelper-perl all 13.20 [89.7 kB] Get: 47 http://deb.debian.org/debian unstable/main i386 libtool all 2.4.7-8 [517 kB] Get: 48 http://deb.debian.org/debian unstable/main i386 dh-autoreconf all 20 [17.1 kB] Get: 49 http://deb.debian.org/debian unstable/main i386 libarchive-zip-perl all 1.68-1 [104 kB] Get: 50 http://deb.debian.org/debian unstable/main i386 libfile-stripnondeterminism-perl all 1.14.0-1 [19.5 kB] Get: 51 http://deb.debian.org/debian unstable/main i386 dh-strip-nondeterminism all 1.14.0-1 [8448 B] Get: 52 http://deb.debian.org/debian unstable/main i386 libelf1t64 i386 0.192-4 [195 kB] Get: 53 http://deb.debian.org/debian unstable/main i386 dwz i386 0.15-1+b1 [116 kB] Get: 54 http://deb.debian.org/debian unstable/main i386 libicu72 i386 72.1-5+b1 [9583 kB] Get: 55 http://deb.debian.org/debian unstable/main i386 libxml2 i386 2.12.7+dfsg+really2.9.14-0.2+b1 [734 kB] Get: 56 http://deb.debian.org/debian unstable/main i386 gettext i386 0.22.5-2 [1631 kB] Get: 57 http://deb.debian.org/debian unstable/main i386 intltool-debian all 0.35.0+20060710.6 [22.9 kB] Get: 58 http://deb.debian.org/debian unstable/main i386 po-debconf all 1.0.21+nmu1 [248 kB] Get: 59 http://deb.debian.org/debian unstable/main i386 debhelper all 13.20 [915 kB] Get: 60 http://deb.debian.org/debian unstable/main i386 python3-autocommand all 2.2.2-3 [13.6 kB] Get: 61 http://deb.debian.org/debian unstable/main i386 python3-more-itertools all 10.5.0-1 [63.8 kB] Get: 62 http://deb.debian.org/debian unstable/main i386 python3-typing-extensions all 4.12.2-2 [73.0 kB] Get: 63 http://deb.debian.org/debian unstable/main i386 python3-typeguard all 4.4.1-1 [37.0 kB] Get: 64 http://deb.debian.org/debian unstable/main i386 python3-inflect all 7.3.1-2 [32.4 kB] Get: 65 http://deb.debian.org/debian unstable/main i386 python3-jaraco.context all 6.0.0-1 [7984 B] Get: 66 http://deb.debian.org/debian unstable/main i386 python3-jaraco.functools all 4.1.0-1 [12.0 kB] Get: 67 http://deb.debian.org/debian unstable/main i386 python3-pkg-resources all 75.2.0-1 [213 kB] Get: 68 http://deb.debian.org/debian unstable/main i386 python3-jaraco.text all 4.0.0-1 [11.4 kB] Get: 69 http://deb.debian.org/debian unstable/main i386 python3-zipp all 3.21.0-1 [10.6 kB] Get: 70 http://deb.debian.org/debian unstable/main i386 python3-setuptools all 75.2.0-1 [731 kB] Get: 71 http://deb.debian.org/debian unstable/main i386 dh-python all 6.20241024 [109 kB] Get: 72 http://deb.debian.org/debian unstable/main i386 xml-core all 0.19 [20.1 kB] Get: 73 http://deb.debian.org/debian unstable/main i386 docutils-common all 0.21.2+dfsg-2 [128 kB] Get: 74 http://deb.debian.org/debian unstable/main i386 fonts-font-awesome all 5.0.10+really4.7.0~dfsg-4.1 [517 kB] Get: 75 http://deb.debian.org/debian unstable/main i386 libjs-jquery all 3.6.1+dfsg+~3.5.14-1 [326 kB] Get: 76 http://deb.debian.org/debian unstable/main i386 libjs-underscore all 1.13.4~dfsg+~1.11.4-3 [116 kB] Get: 77 http://deb.debian.org/debian unstable/main i386 libjs-sphinxdoc all 7.4.7-4 [158 kB] Get: 78 http://deb.debian.org/debian unstable/main i386 libjson-perl all 4.10000-1 [87.5 kB] Get: 79 http://deb.debian.org/debian unstable/main i386 libpython3.13-stdlib i386 3.13.0-2 [2002 kB] Get: 80 http://deb.debian.org/debian unstable/main i386 python-babel-localedata all 2.16.0-1 [5696 kB] Get: 81 http://deb.debian.org/debian unstable/main i386 python3-aiohappyeyeballs all 2.4.3-1 [13.3 kB] Get: 82 http://deb.debian.org/debian unstable/main i386 python3-idna all 3.8-2 [41.6 kB] Get: 83 http://deb.debian.org/debian unstable/main i386 python3-multidict i386 6.1.0-1 [37.1 kB] Get: 84 http://deb.debian.org/debian unstable/main i386 python3-yarl i386 1.13.1-1 [99.5 kB] Get: 85 http://deb.debian.org/debian unstable/main i386 python3-async-timeout all 5.0.1-1 [8324 B] Get: 86 http://deb.debian.org/debian unstable/main i386 python3-frozenlist i386 1.5.0-1 [48.5 kB] Get: 87 http://deb.debian.org/debian unstable/main i386 python3-aiosignal all 1.3.1-1 [6016 B] Get: 88 http://deb.debian.org/debian unstable/main i386 python3-attr all 24.2.0-1 [68.4 kB] Get: 89 http://deb.debian.org/debian unstable/main i386 python3-aiohttp i386 3.10.10-2 [361 kB] Get: 90 http://deb.debian.org/debian unstable/main i386 python3-aiostream all 0.5.2-2 [20.4 kB] Get: 91 http://deb.debian.org/debian unstable/main i386 python3-alabaster all 0.7.16-0.1 [27.9 kB] Get: 92 http://deb.debian.org/debian unstable/main i386 python3.13 i386 3.13.0-2 [730 kB] Get: 93 http://deb.debian.org/debian unstable/main i386 python3-all i386 3.12.7-1 [1052 B] Get: 94 http://deb.debian.org/debian unstable/main i386 python3-atomicwrites all 1.4.1-1 [10.4 kB] Get: 95 http://deb.debian.org/debian unstable/main i386 python3-babel all 2.16.0-1 [114 kB] Get: 96 http://deb.debian.org/debian unstable/main i386 python3-certifi all 2024.8.30+dfsg-1 [9576 B] Get: 97 http://deb.debian.org/debian unstable/main i386 python3-chardet all 5.2.0+dfsg-1 [107 kB] Get: 98 http://deb.debian.org/debian unstable/main i386 python3-charset-normalizer i386 3.4.0-1+b1 [139 kB] Get: 99 http://deb.debian.org/debian unstable/main i386 python3-colorama all 0.4.6-4 [36.2 kB] Get: 100 http://deb.debian.org/debian unstable/main i386 python3-click all 8.1.7-2 [94.3 kB] Get: 101 http://deb.debian.org/debian unstable/main i386 python3-click-log all 0.3.2-1 [5516 B] Get: 102 http://deb.debian.org/debian unstable/main i386 python3-configobj all 5.0.9-1 [34.0 kB] Get: 103 http://deb.debian.org/debian unstable/main i386 python3-dateutil all 2.9.0-3 [79.3 kB] Get: 104 http://deb.debian.org/debian unstable/main i386 python3-defusedxml all 0.7.1-2 [43.3 kB] Get: 105 http://deb.debian.org/debian unstable/main i386 python3.12-doc all 3.12.7-3 [13.4 MB] Get: 106 http://deb.debian.org/debian unstable/main i386 python3-doc all 3.12.7-1 [9900 B] Get: 107 http://deb.debian.org/debian unstable/main i386 python3-roman all 4.2-1 [10.4 kB] Get: 108 http://deb.debian.org/debian unstable/main i386 python3-docutils all 0.21.2+dfsg-2 [403 kB] Get: 109 http://deb.debian.org/debian unstable/main i386 python3-freezegun all 1.5.1-1.1 [17.1 kB] Get: 110 http://deb.debian.org/debian unstable/main i386 python3-sortedcontainers all 2.4.0-2 [31.9 kB] Get: 111 http://deb.debian.org/debian unstable/main i386 python3-hypothesis all 6.116.0-1 [321 kB] Get: 112 http://deb.debian.org/debian unstable/main i386 python3-tz all 2024.1-2 [30.9 kB] Get: 113 http://deb.debian.org/debian unstable/main i386 python3-icalendar all 6.0.1-1 [95.5 kB] Get: 114 http://deb.debian.org/debian unstable/main i386 python3-imagesize all 1.4.1-1 [6688 B] Get: 115 http://deb.debian.org/debian unstable/main i386 python3-iniconfig all 1.1.1-2 [6396 B] Get: 116 http://deb.debian.org/debian unstable/main i386 python3-markupsafe i386 2.1.5-1+b2 [13.9 kB] Get: 117 http://deb.debian.org/debian unstable/main i386 python3-jinja2 all 3.1.3-1 [119 kB] Get: 118 http://deb.debian.org/debian unstable/main i386 python3-packaging all 24.1-1 [45.8 kB] Get: 119 http://deb.debian.org/debian unstable/main i386 python3-pluggy all 1.5.0-1 [26.9 kB] Get: 120 http://deb.debian.org/debian unstable/main i386 python3-pygments all 2.18.0+dfsg-1 [836 kB] Get: 121 http://deb.debian.org/debian unstable/main i386 python3-pytest all 8.3.3-1 [249 kB] Get: 122 http://deb.debian.org/debian unstable/main i386 python3-urllib3 all 2.0.7-2 [111 kB] Get: 123 http://deb.debian.org/debian unstable/main i386 python3-requests all 2.32.3+dfsg-1 [71.9 kB] Get: 124 http://deb.debian.org/debian unstable/main i386 python3-snowballstemmer all 2.2.0-4 [58.0 kB] Get: 125 http://deb.debian.org/debian unstable/main i386 sphinx-common all 7.4.7-4 [731 kB] Get: 126 http://deb.debian.org/debian unstable/main i386 python3-sphinx all 7.4.7-4 [588 kB] Get: 127 http://deb.debian.org/debian unstable/main i386 sphinx-rtd-theme-common all 3.0.1+dfsg-1 [1022 kB] Get: 128 http://deb.debian.org/debian unstable/main i386 python3-sphinxcontrib.jquery all 4.1-5 [7348 B] Get: 129 http://deb.debian.org/debian unstable/main i386 python3-sphinx-rtd-theme all 3.0.1+dfsg-1 [29.5 kB] Get: 130 http://deb.debian.org/debian unstable/main i386 python3-tzlocal all 5.2-1.1 [23.7 kB] Get: 131 http://deb.debian.org/debian unstable/main i386 python3-wcwidth all 0.2.13+dfsg1-1 [24.9 kB] Get: 132 http://deb.debian.org/debian unstable/main i386 python3-urwid i386 2.6.15-1 [196 kB] Get: 133 http://deb.debian.org/debian unstable/main i386 python3-xdg all 0.28-2 [40.5 kB] Get: 134 http://deb.debian.org/debian unstable/main i386 vdirsyncer all 0.19.3-1 [91.2 kB] Fetched 70.0 MB in 3s (21.3 MB/s) debconf: delaying package configuration, since apt-utils is not installed Selecting previously unselected package fonts-lato. (Reading database ... (Reading database ... 5% (Reading database ... 10% (Reading database ... 15% (Reading database ... 20% (Reading database ... 25% (Reading database ... 30% (Reading database ... 35% (Reading database ... 40% (Reading database ... 45% (Reading database ... 50% (Reading database ... 55% (Reading database ... 60% (Reading database ... 65% (Reading database ... 70% (Reading database ... 75% (Reading database ... 80% (Reading database ... 85% (Reading database ... 90% (Reading database ... 95% (Reading database ... 100% (Reading database ... 19954 files and directories currently installed.) Preparing to unpack .../fonts-lato_2.015-1_all.deb ... Unpacking fonts-lato (2.015-1) ... Selecting previously unselected package libpython3.12-minimal:i386. Preparing to unpack .../libpython3.12-minimal_3.12.7-3_i386.deb ... Unpacking libpython3.12-minimal:i386 (3.12.7-3) ... Selecting previously unselected package libexpat1:i386. Preparing to unpack .../libexpat1_2.6.4-1_i386.deb ... Unpacking libexpat1:i386 (2.6.4-1) ... Selecting previously unselected package python3.12-minimal. Preparing to unpack .../python3.12-minimal_3.12.7-3_i386.deb ... Unpacking python3.12-minimal (3.12.7-3) ... Setting up libpython3.12-minimal:i386 (3.12.7-3) ... Setting up libexpat1:i386 (2.6.4-1) ... Setting up python3.12-minimal (3.12.7-3) ... Selecting previously unselected package python3-minimal. (Reading database ... (Reading database ... 5% (Reading database ... 10% (Reading database ... 15% (Reading database ... 20% (Reading database ... 25% (Reading database ... 30% (Reading database ... 35% (Reading database ... 40% (Reading database ... 45% (Reading database ... 50% (Reading database ... 55% (Reading database ... 60% (Reading database ... 65% (Reading database ... 70% (Reading database ... 75% (Reading database ... 80% (Reading database ... 85% (Reading database ... 90% (Reading database ... 95% (Reading database ... 100% (Reading database ... 20300 files and directories currently installed.) Preparing to unpack .../00-python3-minimal_3.12.7-1_i386.deb ... Unpacking python3-minimal (3.12.7-1) ... Selecting previously unselected package media-types. Preparing to unpack .../01-media-types_10.1.0_all.deb ... Unpacking media-types (10.1.0) ... Selecting previously unselected package netbase. Preparing to unpack .../02-netbase_6.4_all.deb ... Unpacking netbase (6.4) ... Selecting previously unselected package tzdata. Preparing to unpack .../03-tzdata_2024b-3_all.deb ... Unpacking tzdata (2024b-3) ... Selecting previously unselected package libkrb5support0:i386. Preparing to unpack .../04-libkrb5support0_1.21.3-3_i386.deb ... Unpacking libkrb5support0:i386 (1.21.3-3) ... Selecting previously unselected package libcom-err2:i386. Preparing to unpack .../05-libcom-err2_1.47.1-1+b1_i386.deb ... Unpacking libcom-err2:i386 (1.47.1-1+b1) ... Selecting previously unselected package libk5crypto3:i386. Preparing to unpack .../06-libk5crypto3_1.21.3-3_i386.deb ... Unpacking libk5crypto3:i386 (1.21.3-3) ... Selecting previously unselected package libkeyutils1:i386. Preparing to unpack .../07-libkeyutils1_1.6.3-4_i386.deb ... Unpacking libkeyutils1:i386 (1.6.3-4) ... Selecting previously unselected package libkrb5-3:i386. Preparing to unpack .../08-libkrb5-3_1.21.3-3_i386.deb ... Unpacking libkrb5-3:i386 (1.21.3-3) ... Selecting previously unselected package libgssapi-krb5-2:i386. Preparing to unpack .../09-libgssapi-krb5-2_1.21.3-3_i386.deb ... Unpacking libgssapi-krb5-2:i386 (1.21.3-3) ... Selecting previously unselected package libtirpc-common. Preparing to unpack .../10-libtirpc-common_1.3.4+ds-1.3_all.deb ... Unpacking libtirpc-common (1.3.4+ds-1.3) ... Selecting previously unselected package libtirpc3t64:i386. Preparing to unpack .../11-libtirpc3t64_1.3.4+ds-1.3+b1_i386.deb ... Adding 'diversion of /lib/i386-linux-gnu/libtirpc.so.3 to /lib/i386-linux-gnu/libtirpc.so.3.usr-is-merged by libtirpc3t64' Adding 'diversion of /lib/i386-linux-gnu/libtirpc.so.3.0.0 to /lib/i386-linux-gnu/libtirpc.so.3.0.0.usr-is-merged by libtirpc3t64' Unpacking libtirpc3t64:i386 (1.3.4+ds-1.3+b1) ... Selecting previously unselected package libnsl2:i386. Preparing to unpack .../12-libnsl2_1.3.0-3+b3_i386.deb ... Unpacking libnsl2:i386 (1.3.0-3+b3) ... Selecting previously unselected package readline-common. Preparing to unpack .../13-readline-common_8.2-5_all.deb ... Unpacking readline-common (8.2-5) ... Selecting previously unselected package libreadline8t64:i386. Preparing to unpack .../14-libreadline8t64_8.2-5_i386.deb ... Adding 'diversion of /lib/i386-linux-gnu/libhistory.so.8 to /lib/i386-linux-gnu/libhistory.so.8.usr-is-merged by libreadline8t64' Adding 'diversion of /lib/i386-linux-gnu/libhistory.so.8.2 to /lib/i386-linux-gnu/libhistory.so.8.2.usr-is-merged by libreadline8t64' Adding 'diversion of /lib/i386-linux-gnu/libreadline.so.8 to /lib/i386-linux-gnu/libreadline.so.8.usr-is-merged by libreadline8t64' Adding 'diversion of /lib/i386-linux-gnu/libreadline.so.8.2 to /lib/i386-linux-gnu/libreadline.so.8.2.usr-is-merged by libreadline8t64' Unpacking libreadline8t64:i386 (8.2-5) ... Selecting previously unselected package libpython3.12-stdlib:i386. Preparing to unpack .../15-libpython3.12-stdlib_3.12.7-3_i386.deb ... Unpacking libpython3.12-stdlib:i386 (3.12.7-3) ... Selecting previously unselected package python3.12. Preparing to unpack .../16-python3.12_3.12.7-3_i386.deb ... Unpacking python3.12 (3.12.7-3) ... Selecting previously unselected package libpython3-stdlib:i386. Preparing to unpack .../17-libpython3-stdlib_3.12.7-1_i386.deb ... Unpacking libpython3-stdlib:i386 (3.12.7-1) ... Setting up python3-minimal (3.12.7-1) ... Selecting previously unselected package python3. (Reading database ... (Reading database ... 5% (Reading database ... 10% (Reading database ... 15% (Reading database ... 20% (Reading database ... 25% (Reading database ... 30% (Reading database ... 35% (Reading database ... 40% (Reading database ... 45% (Reading database ... 50% (Reading database ... 55% (Reading database ... 60% (Reading database ... 65% (Reading database ... 70% (Reading database ... 75% (Reading database ... 80% (Reading database ... 85% (Reading database ... 90% (Reading database ... 95% (Reading database ... 100% (Reading database ... 21362 files and directories currently installed.) Preparing to unpack .../000-python3_3.12.7-1_i386.deb ... Unpacking python3 (3.12.7-1) ... Selecting previously unselected package libpython3.13-minimal:i386. Preparing to unpack .../001-libpython3.13-minimal_3.13.0-2_i386.deb ... Unpacking libpython3.13-minimal:i386 (3.13.0-2) ... Selecting previously unselected package python3.13-minimal. Preparing to unpack .../002-python3.13-minimal_3.13.0-2_i386.deb ... Unpacking python3.13-minimal (3.13.0-2) ... Selecting previously unselected package sgml-base. Preparing to unpack .../003-sgml-base_1.31_all.deb ... Unpacking sgml-base (1.31) ... Selecting previously unselected package sensible-utils. Preparing to unpack .../004-sensible-utils_0.0.24_all.deb ... Unpacking sensible-utils (0.0.24) ... Selecting previously unselected package bash-completion. Preparing to unpack .../005-bash-completion_1%3a2.14.0-2_all.deb ... Unpacking bash-completion (1:2.14.0-2) ... Selecting previously unselected package openssl. Preparing to unpack .../006-openssl_3.3.2-2_i386.deb ... Unpacking openssl (3.3.2-2) ... Selecting previously unselected package ca-certificates. Preparing to unpack .../007-ca-certificates_20240203_all.deb ... Unpacking ca-certificates (20240203) ... Selecting previously unselected package libmagic-mgc. Preparing to unpack .../008-libmagic-mgc_1%3a5.45-3+b1_i386.deb ... Unpacking libmagic-mgc (1:5.45-3+b1) ... Selecting previously unselected package libmagic1t64:i386. Preparing to unpack .../009-libmagic1t64_1%3a5.45-3+b1_i386.deb ... Unpacking libmagic1t64:i386 (1:5.45-3+b1) ... Selecting previously unselected package file. Preparing to unpack .../010-file_1%3a5.45-3+b1_i386.deb ... Unpacking file (1:5.45-3+b1) ... Selecting previously unselected package gettext-base. Preparing to unpack .../011-gettext-base_0.22.5-2_i386.deb ... Unpacking gettext-base (0.22.5-2) ... Selecting previously unselected package libuchardet0:i386. Preparing to unpack .../012-libuchardet0_0.0.8-1+b2_i386.deb ... Unpacking libuchardet0:i386 (0.0.8-1+b2) ... Selecting previously unselected package groff-base. Preparing to unpack .../013-groff-base_1.23.0-5_i386.deb ... Unpacking groff-base (1.23.0-5) ... Selecting previously unselected package locales. Preparing to unpack .../014-locales_2.40-3_all.deb ... Unpacking locales (2.40-3) ... Selecting previously unselected package bsdextrautils. Preparing to unpack .../015-bsdextrautils_2.40.2-11_i386.deb ... Unpacking bsdextrautils (2.40.2-11) ... Selecting previously unselected package libpipeline1:i386. Preparing to unpack .../016-libpipeline1_1.5.8-1_i386.deb ... Unpacking libpipeline1:i386 (1.5.8-1) ... Selecting previously unselected package man-db. Preparing to unpack .../017-man-db_2.13.0-1_i386.deb ... Unpacking man-db (2.13.0-1) ... Selecting previously unselected package m4. Preparing to unpack .../018-m4_1.4.19-4_i386.deb ... Unpacking m4 (1.4.19-4) ... Selecting previously unselected package autoconf. Preparing to unpack .../019-autoconf_2.72-3_all.deb ... Unpacking autoconf (2.72-3) ... Selecting previously unselected package autotools-dev. Preparing to unpack .../020-autotools-dev_20220109.1_all.deb ... Unpacking autotools-dev (20220109.1) ... Selecting previously unselected package automake. Preparing to unpack .../021-automake_1%3a1.16.5-1.3_all.deb ... Unpacking automake (1:1.16.5-1.3) ... Selecting previously unselected package autopoint. Preparing to unpack .../022-autopoint_0.22.5-2_all.deb ... Unpacking autopoint (0.22.5-2) ... Selecting previously unselected package libdebhelper-perl. Preparing to unpack .../023-libdebhelper-perl_13.20_all.deb ... Unpacking libdebhelper-perl (13.20) ... Selecting previously unselected package libtool. Preparing to unpack .../024-libtool_2.4.7-8_all.deb ... Unpacking libtool (2.4.7-8) ... Selecting previously unselected package dh-autoreconf. Preparing to unpack .../025-dh-autoreconf_20_all.deb ... Unpacking dh-autoreconf (20) ... Selecting previously unselected package libarchive-zip-perl. Preparing to unpack .../026-libarchive-zip-perl_1.68-1_all.deb ... Unpacking libarchive-zip-perl (1.68-1) ... Selecting previously unselected package libfile-stripnondeterminism-perl. Preparing to unpack .../027-libfile-stripnondeterminism-perl_1.14.0-1_all.deb ... Unpacking libfile-stripnondeterminism-perl (1.14.0-1) ... Selecting previously unselected package dh-strip-nondeterminism. Preparing to unpack .../028-dh-strip-nondeterminism_1.14.0-1_all.deb ... Unpacking dh-strip-nondeterminism (1.14.0-1) ... Selecting previously unselected package libelf1t64:i386. Preparing to unpack .../029-libelf1t64_0.192-4_i386.deb ... Unpacking libelf1t64:i386 (0.192-4) ... Selecting previously unselected package dwz. Preparing to unpack .../030-dwz_0.15-1+b1_i386.deb ... Unpacking dwz (0.15-1+b1) ... Selecting previously unselected package libicu72:i386. Preparing to unpack .../031-libicu72_72.1-5+b1_i386.deb ... Unpacking libicu72:i386 (72.1-5+b1) ... Selecting previously unselected package libxml2:i386. Preparing to unpack .../032-libxml2_2.12.7+dfsg+really2.9.14-0.2+b1_i386.deb ... Unpacking libxml2:i386 (2.12.7+dfsg+really2.9.14-0.2+b1) ... Selecting previously unselected package gettext. Preparing to unpack .../033-gettext_0.22.5-2_i386.deb ... Unpacking gettext (0.22.5-2) ... Selecting previously unselected package intltool-debian. Preparing to unpack .../034-intltool-debian_0.35.0+20060710.6_all.deb ... Unpacking intltool-debian (0.35.0+20060710.6) ... Selecting previously unselected package po-debconf. Preparing to unpack .../035-po-debconf_1.0.21+nmu1_all.deb ... Unpacking po-debconf (1.0.21+nmu1) ... Selecting previously unselected package debhelper. Preparing to unpack .../036-debhelper_13.20_all.deb ... Unpacking debhelper (13.20) ... Selecting previously unselected package python3-autocommand. Preparing to unpack .../037-python3-autocommand_2.2.2-3_all.deb ... Unpacking python3-autocommand (2.2.2-3) ... Selecting previously unselected package python3-more-itertools. Preparing to unpack .../038-python3-more-itertools_10.5.0-1_all.deb ... Unpacking python3-more-itertools (10.5.0-1) ... Selecting previously unselected package python3-typing-extensions. Preparing to unpack .../039-python3-typing-extensions_4.12.2-2_all.deb ... Unpacking python3-typing-extensions (4.12.2-2) ... Selecting previously unselected package python3-typeguard. Preparing to unpack .../040-python3-typeguard_4.4.1-1_all.deb ... Unpacking python3-typeguard (4.4.1-1) ... Selecting previously unselected package python3-inflect. Preparing to unpack .../041-python3-inflect_7.3.1-2_all.deb ... Unpacking python3-inflect (7.3.1-2) ... Selecting previously unselected package python3-jaraco.context. Preparing to unpack .../042-python3-jaraco.context_6.0.0-1_all.deb ... Unpacking python3-jaraco.context (6.0.0-1) ... Selecting previously unselected package python3-jaraco.functools. Preparing to unpack .../043-python3-jaraco.functools_4.1.0-1_all.deb ... Unpacking python3-jaraco.functools (4.1.0-1) ... Selecting previously unselected package python3-pkg-resources. Preparing to unpack .../044-python3-pkg-resources_75.2.0-1_all.deb ... Unpacking python3-pkg-resources (75.2.0-1) ... Selecting previously unselected package python3-jaraco.text. Preparing to unpack .../045-python3-jaraco.text_4.0.0-1_all.deb ... Unpacking python3-jaraco.text (4.0.0-1) ... Selecting previously unselected package python3-zipp. Preparing to unpack .../046-python3-zipp_3.21.0-1_all.deb ... Unpacking python3-zipp (3.21.0-1) ... Selecting previously unselected package python3-setuptools. Preparing to unpack .../047-python3-setuptools_75.2.0-1_all.deb ... Unpacking python3-setuptools (75.2.0-1) ... Selecting previously unselected package dh-python. Preparing to unpack .../048-dh-python_6.20241024_all.deb ... Unpacking dh-python (6.20241024) ... Selecting previously unselected package xml-core. Preparing to unpack .../049-xml-core_0.19_all.deb ... Unpacking xml-core (0.19) ... Selecting previously unselected package docutils-common. Preparing to unpack .../050-docutils-common_0.21.2+dfsg-2_all.deb ... Unpacking docutils-common (0.21.2+dfsg-2) ... Selecting previously unselected package fonts-font-awesome. Preparing to unpack .../051-fonts-font-awesome_5.0.10+really4.7.0~dfsg-4.1_all.deb ... Unpacking fonts-font-awesome (5.0.10+really4.7.0~dfsg-4.1) ... Selecting previously unselected package libjs-jquery. Preparing to unpack .../052-libjs-jquery_3.6.1+dfsg+~3.5.14-1_all.deb ... Unpacking libjs-jquery (3.6.1+dfsg+~3.5.14-1) ... Selecting previously unselected package libjs-underscore. Preparing to unpack .../053-libjs-underscore_1.13.4~dfsg+~1.11.4-3_all.deb ... Unpacking libjs-underscore (1.13.4~dfsg+~1.11.4-3) ... Selecting previously unselected package libjs-sphinxdoc. Preparing to unpack .../054-libjs-sphinxdoc_7.4.7-4_all.deb ... Unpacking libjs-sphinxdoc (7.4.7-4) ... Selecting previously unselected package libjson-perl. Preparing to unpack .../055-libjson-perl_4.10000-1_all.deb ... Unpacking libjson-perl (4.10000-1) ... Selecting previously unselected package libpython3.13-stdlib:i386. Preparing to unpack .../056-libpython3.13-stdlib_3.13.0-2_i386.deb ... Unpacking libpython3.13-stdlib:i386 (3.13.0-2) ... Selecting previously unselected package python-babel-localedata. Preparing to unpack .../057-python-babel-localedata_2.16.0-1_all.deb ... Unpacking python-babel-localedata (2.16.0-1) ... Selecting previously unselected package python3-aiohappyeyeballs. Preparing to unpack .../058-python3-aiohappyeyeballs_2.4.3-1_all.deb ... Unpacking python3-aiohappyeyeballs (2.4.3-1) ... Selecting previously unselected package python3-idna. Preparing to unpack .../059-python3-idna_3.8-2_all.deb ... Unpacking python3-idna (3.8-2) ... Selecting previously unselected package python3-multidict. Preparing to unpack .../060-python3-multidict_6.1.0-1_i386.deb ... Unpacking python3-multidict (6.1.0-1) ... Selecting previously unselected package python3-yarl. Preparing to unpack .../061-python3-yarl_1.13.1-1_i386.deb ... Unpacking python3-yarl (1.13.1-1) ... Selecting previously unselected package python3-async-timeout. Preparing to unpack .../062-python3-async-timeout_5.0.1-1_all.deb ... Unpacking python3-async-timeout (5.0.1-1) ... Selecting previously unselected package python3-frozenlist. Preparing to unpack .../063-python3-frozenlist_1.5.0-1_i386.deb ... Unpacking python3-frozenlist (1.5.0-1) ... Selecting previously unselected package python3-aiosignal. Preparing to unpack .../064-python3-aiosignal_1.3.1-1_all.deb ... Unpacking python3-aiosignal (1.3.1-1) ... Selecting previously unselected package python3-attr. Preparing to unpack .../065-python3-attr_24.2.0-1_all.deb ... Unpacking python3-attr (24.2.0-1) ... Selecting previously unselected package python3-aiohttp. Preparing to unpack .../066-python3-aiohttp_3.10.10-2_i386.deb ... Unpacking python3-aiohttp (3.10.10-2) ... Selecting previously unselected package python3-aiostream. Preparing to unpack .../067-python3-aiostream_0.5.2-2_all.deb ... Unpacking python3-aiostream (0.5.2-2) ... Selecting previously unselected package python3-alabaster. Preparing to unpack .../068-python3-alabaster_0.7.16-0.1_all.deb ... Unpacking python3-alabaster (0.7.16-0.1) ... Selecting previously unselected package python3.13. Preparing to unpack .../069-python3.13_3.13.0-2_i386.deb ... Unpacking python3.13 (3.13.0-2) ... Selecting previously unselected package python3-all. Preparing to unpack .../070-python3-all_3.12.7-1_i386.deb ... Unpacking python3-all (3.12.7-1) ... Selecting previously unselected package python3-atomicwrites. Preparing to unpack .../071-python3-atomicwrites_1.4.1-1_all.deb ... Unpacking python3-atomicwrites (1.4.1-1) ... Selecting previously unselected package python3-babel. Preparing to unpack .../072-python3-babel_2.16.0-1_all.deb ... Unpacking python3-babel (2.16.0-1) ... Selecting previously unselected package python3-certifi. Preparing to unpack .../073-python3-certifi_2024.8.30+dfsg-1_all.deb ... Unpacking python3-certifi (2024.8.30+dfsg-1) ... Selecting previously unselected package python3-chardet. Preparing to unpack .../074-python3-chardet_5.2.0+dfsg-1_all.deb ... Unpacking python3-chardet (5.2.0+dfsg-1) ... Selecting previously unselected package python3-charset-normalizer. Preparing to unpack .../075-python3-charset-normalizer_3.4.0-1+b1_i386.deb ... Unpacking python3-charset-normalizer (3.4.0-1+b1) ... Selecting previously unselected package python3-colorama. Preparing to unpack .../076-python3-colorama_0.4.6-4_all.deb ... Unpacking python3-colorama (0.4.6-4) ... Selecting previously unselected package python3-click. Preparing to unpack .../077-python3-click_8.1.7-2_all.deb ... Unpacking python3-click (8.1.7-2) ... Selecting previously unselected package python3-click-log. Preparing to unpack .../078-python3-click-log_0.3.2-1_all.deb ... Unpacking python3-click-log (0.3.2-1) ... Selecting previously unselected package python3-configobj. Preparing to unpack .../079-python3-configobj_5.0.9-1_all.deb ... Unpacking python3-configobj (5.0.9-1) ... Selecting previously unselected package python3-dateutil. Preparing to unpack .../080-python3-dateutil_2.9.0-3_all.deb ... Unpacking python3-dateutil (2.9.0-3) ... Selecting previously unselected package python3-defusedxml. Preparing to unpack .../081-python3-defusedxml_0.7.1-2_all.deb ... Unpacking python3-defusedxml (0.7.1-2) ... Selecting previously unselected package python3.12-doc. Preparing to unpack .../082-python3.12-doc_3.12.7-3_all.deb ... Unpacking python3.12-doc (3.12.7-3) ... Selecting previously unselected package python3-doc. Preparing to unpack .../083-python3-doc_3.12.7-1_all.deb ... Unpacking python3-doc (3.12.7-1) ... Selecting previously unselected package python3-roman. Preparing to unpack .../084-python3-roman_4.2-1_all.deb ... Unpacking python3-roman (4.2-1) ... Selecting previously unselected package python3-docutils. Preparing to unpack .../085-python3-docutils_0.21.2+dfsg-2_all.deb ... Unpacking python3-docutils (0.21.2+dfsg-2) ... Selecting previously unselected package python3-freezegun. Preparing to unpack .../086-python3-freezegun_1.5.1-1.1_all.deb ... Unpacking python3-freezegun (1.5.1-1.1) ... Selecting previously unselected package python3-sortedcontainers. Preparing to unpack .../087-python3-sortedcontainers_2.4.0-2_all.deb ... Unpacking python3-sortedcontainers (2.4.0-2) ... Selecting previously unselected package python3-hypothesis. Preparing to unpack .../088-python3-hypothesis_6.116.0-1_all.deb ... Unpacking python3-hypothesis (6.116.0-1) ... Selecting previously unselected package python3-tz. Preparing to unpack .../089-python3-tz_2024.1-2_all.deb ... Unpacking python3-tz (2024.1-2) ... Selecting previously unselected package python3-icalendar. Preparing to unpack .../090-python3-icalendar_6.0.1-1_all.deb ... Unpacking python3-icalendar (6.0.1-1) ... Selecting previously unselected package python3-imagesize. Preparing to unpack .../091-python3-imagesize_1.4.1-1_all.deb ... Unpacking python3-imagesize (1.4.1-1) ... Selecting previously unselected package python3-iniconfig. Preparing to unpack .../092-python3-iniconfig_1.1.1-2_all.deb ... Unpacking python3-iniconfig (1.1.1-2) ... Selecting previously unselected package python3-markupsafe. Preparing to unpack .../093-python3-markupsafe_2.1.5-1+b2_i386.deb ... Unpacking python3-markupsafe (2.1.5-1+b2) ... Selecting previously unselected package python3-jinja2. Preparing to unpack .../094-python3-jinja2_3.1.3-1_all.deb ... Unpacking python3-jinja2 (3.1.3-1) ... Selecting previously unselected package python3-packaging. Preparing to unpack .../095-python3-packaging_24.1-1_all.deb ... Unpacking python3-packaging (24.1-1) ... Selecting previously unselected package python3-pluggy. Preparing to unpack .../096-python3-pluggy_1.5.0-1_all.deb ... Unpacking python3-pluggy (1.5.0-1) ... Selecting previously unselected package python3-pygments. Preparing to unpack .../097-python3-pygments_2.18.0+dfsg-1_all.deb ... Unpacking python3-pygments (2.18.0+dfsg-1) ... Selecting previously unselected package python3-pytest. Preparing to unpack .../098-python3-pytest_8.3.3-1_all.deb ... Unpacking python3-pytest (8.3.3-1) ... Selecting previously unselected package python3-urllib3. Preparing to unpack .../099-python3-urllib3_2.0.7-2_all.deb ... Unpacking python3-urllib3 (2.0.7-2) ... Selecting previously unselected package python3-requests. Preparing to unpack .../100-python3-requests_2.32.3+dfsg-1_all.deb ... Unpacking python3-requests (2.32.3+dfsg-1) ... Selecting previously unselected package python3-snowballstemmer. Preparing to unpack .../101-python3-snowballstemmer_2.2.0-4_all.deb ... Unpacking python3-snowballstemmer (2.2.0-4) ... Selecting previously unselected package sphinx-common. Preparing to unpack .../102-sphinx-common_7.4.7-4_all.deb ... Unpacking sphinx-common (7.4.7-4) ... Selecting previously unselected package python3-sphinx. Preparing to unpack .../103-python3-sphinx_7.4.7-4_all.deb ... Unpacking python3-sphinx (7.4.7-4) ... Selecting previously unselected package sphinx-rtd-theme-common. Preparing to unpack .../104-sphinx-rtd-theme-common_3.0.1+dfsg-1_all.deb ... Unpacking sphinx-rtd-theme-common (3.0.1+dfsg-1) ... Selecting previously unselected package python3-sphinxcontrib.jquery. Preparing to unpack .../105-python3-sphinxcontrib.jquery_4.1-5_all.deb ... Unpacking python3-sphinxcontrib.jquery (4.1-5) ... Selecting previously unselected package python3-sphinx-rtd-theme. Preparing to unpack .../106-python3-sphinx-rtd-theme_3.0.1+dfsg-1_all.deb ... Unpacking python3-sphinx-rtd-theme (3.0.1+dfsg-1) ... Selecting previously unselected package python3-tzlocal. Preparing to unpack .../107-python3-tzlocal_5.2-1.1_all.deb ... Unpacking python3-tzlocal (5.2-1.1) ... Selecting previously unselected package python3-wcwidth. Preparing to unpack .../108-python3-wcwidth_0.2.13+dfsg1-1_all.deb ... Unpacking python3-wcwidth (0.2.13+dfsg1-1) ... Selecting previously unselected package python3-urwid. Preparing to unpack .../109-python3-urwid_2.6.15-1_i386.deb ... Unpacking python3-urwid (2.6.15-1) ... Selecting previously unselected package python3-xdg. Preparing to unpack .../110-python3-xdg_0.28-2_all.deb ... Unpacking python3-xdg (0.28-2) ... Selecting previously unselected package vdirsyncer. Preparing to unpack .../111-vdirsyncer_0.19.3-1_all.deb ... Unpacking vdirsyncer (0.19.3-1) ... Setting up media-types (10.1.0) ... Setting up libpipeline1:i386 (1.5.8-1) ... Setting up libkeyutils1:i386 (1.6.3-4) ... Setting up fonts-lato (2.015-1) ... Setting up libicu72:i386 (72.1-5+b1) ... Setting up bsdextrautils (2.40.2-11) ... Setting up libmagic-mgc (1:5.45-3+b1) ... Setting up libarchive-zip-perl (1.68-1) ... Setting up libtirpc-common (1.3.4+ds-1.3) ... Setting up libdebhelper-perl (13.20) ... Setting up libmagic1t64:i386 (1:5.45-3+b1) ... Setting up gettext-base (0.22.5-2) ... Setting up m4 (1.4.19-4) ... Setting up libcom-err2:i386 (1.47.1-1+b1) ... Setting up file (1:5.45-3+b1) ... Setting up locales (2.40-3) ... locales-all installed, skipping locales generation Setting up libelf1t64:i386 (0.192-4) ... Setting up python-babel-localedata (2.16.0-1) ... Setting up libkrb5support0:i386 (1.21.3-3) ... Setting up tzdata (2024b-3) ... Current default time zone: 'Etc/UTC' Local time is now: Thu Dec 18 11:14:08 UTC 2025. Universal Time is now: Thu Dec 18 11:14:08 UTC 2025. Run 'dpkg-reconfigure tzdata' if you wish to change it. Setting up libpython3.13-minimal:i386 (3.13.0-2) ... Setting up autotools-dev (20220109.1) ... Setting up bash-completion (1:2.14.0-2) ... Setting up autopoint (0.22.5-2) ... Setting up libk5crypto3:i386 (1.21.3-3) ... Setting up autoconf (2.72-3) ... Setting up dwz (0.15-1+b1) ... Setting up sensible-utils (0.0.24) ... Setting up libuchardet0:i386 (0.0.8-1+b2) ... Setting up libjson-perl (4.10000-1) ... Setting up python3.13-minimal (3.13.0-2) ... Setting up netbase (6.4) ... Setting up sgml-base (1.31) ... Setting up libkrb5-3:i386 (1.21.3-3) ... Setting up libjs-jquery (3.6.1+dfsg+~3.5.14-1) ... Setting up openssl (3.3.2-2) ... Setting up readline-common (8.2-5) ... Setting up libxml2:i386 (2.12.7+dfsg+really2.9.14-0.2+b1) ... Setting up fonts-font-awesome (5.0.10+really4.7.0~dfsg-4.1) ... Setting up sphinx-rtd-theme-common (3.0.1+dfsg-1) ... Setting up libjs-underscore (1.13.4~dfsg+~1.11.4-3) ... Setting up automake (1:1.16.5-1.3) ... update-alternatives: using /usr/bin/automake-1.16 to provide /usr/bin/automake (automake) in auto mode Setting up libfile-stripnondeterminism-perl (1.14.0-1) ... Setting up gettext (0.22.5-2) ... Setting up libtool (2.4.7-8) ... Setting up intltool-debian (0.35.0+20060710.6) ... Setting up dh-autoreconf (20) ... Setting up ca-certificates (20240203) ... Updating certificates in /etc/ssl/certs... 146 added, 0 removed; done. Setting up libgssapi-krb5-2:i386 (1.21.3-3) ... Setting up libjs-sphinxdoc (7.4.7-4) ... Setting up libreadline8t64:i386 (8.2-5) ... Setting up dh-strip-nondeterminism (1.14.0-1) ... Setting up groff-base (1.23.0-5) ... Setting up xml-core (0.19) ... Setting up python3.12-doc (3.12.7-3) ... Setting up libpython3.13-stdlib:i386 (3.13.0-2) ... Setting up python3-doc (3.12.7-1) ... Setting up libtirpc3t64:i386 (1.3.4+ds-1.3+b1) ... Setting up python3.13 (3.13.0-2) ... Setting up po-debconf (1.0.21+nmu1) ... Setting up man-db (2.13.0-1) ... Not building database; man-db/auto-update is not 'true'. Setting up sphinx-common (7.4.7-4) ... Setting up libnsl2:i386 (1.3.0-3+b3) ... Setting up libpython3.12-stdlib:i386 (3.12.7-3) ... Setting up python3.12 (3.12.7-3) ... Setting up debhelper (13.20) ... Setting up libpython3-stdlib:i386 (3.12.7-1) ... Setting up python3 (3.12.7-1) ... Setting up python3-sortedcontainers (2.4.0-2) ... Setting up python3-zipp (3.21.0-1) ... Setting up python3-xdg (0.28-2) ... Setting up python3-autocommand (2.2.2-3) ... Setting up python3-markupsafe (2.1.5-1+b2) ... Setting up python3-multidict (6.1.0-1) ... Setting up python3-tz (2024.1-2) ... Setting up python3-frozenlist (1.5.0-1) ... Setting up python3-atomicwrites (1.4.1-1) ... Setting up python3-aiosignal (1.3.1-1) ... Setting up python3-async-timeout (5.0.1-1) ... Setting up python3-roman (4.2-1) ... Setting up python3-jinja2 (3.1.3-1) ... Setting up python3-packaging (24.1-1) ... Setting up python3-configobj (5.0.9-1) ... Setting up python3-wcwidth (0.2.13+dfsg1-1) ... Setting up python3-certifi (2024.8.30+dfsg-1) ... Setting up python3-snowballstemmer (2.2.0-4) ... Setting up python3-idna (3.8-2) ... Setting up python3-typing-extensions (4.12.2-2) ... Setting up python3-aiohappyeyeballs (2.4.3-1) ... Setting up python3-urllib3 (2.0.7-2) ... Setting up python3-pluggy (1.5.0-1) ... Setting up python3-dateutil (2.9.0-3) ... Setting up python3-tzlocal (5.2-1.1) ... Setting up python3-yarl (1.13.1-1) ... Setting up python3-freezegun (1.5.1-1.1) ... Setting up python3-imagesize (1.4.1-1) ... Setting up python3-more-itertools (10.5.0-1) ... Setting up python3-iniconfig (1.1.1-2) ... Setting up python3-attr (24.2.0-1) ... Setting up python3-jaraco.functools (4.1.0-1) ... Setting up python3-jaraco.context (6.0.0-1) ... Setting up python3-aiostream (0.5.2-2) ... Setting up python3-colorama (0.4.6-4) ... Setting up python3-defusedxml (0.7.1-2) ... Setting up python3-charset-normalizer (3.4.0-1+b1) ... Setting up python3-pytest (8.3.3-1) ... Setting up python3-alabaster (0.7.16-0.1) ... Setting up python3-hypothesis (6.116.0-1) ... Setting up python3-typeguard (4.4.1-1) ... Setting up python3-aiohttp (3.10.10-2) ... Setting up python3-all (3.12.7-1) ... Setting up python3-urwid (2.6.15-1) ... Setting up python3-click (8.1.7-2) ... Setting up python3-inflect (7.3.1-2) ... Setting up python3-jaraco.text (4.0.0-1) ... Setting up python3-icalendar (6.0.1-1) ... Setting up python3-pkg-resources (75.2.0-1) ... Setting up python3-setuptools (75.2.0-1) ... Setting up python3-babel (2.16.0-1) ... update-alternatives: using /usr/bin/pybabel-python3 to provide /usr/bin/pybabel (pybabel) in auto mode Setting up python3-click-log (0.3.2-1) ... Setting up python3-pygments (2.18.0+dfsg-1) ... Setting up python3-chardet (5.2.0+dfsg-1) ... Setting up python3-requests (2.32.3+dfsg-1) ... Setting up vdirsyncer (0.19.3-1) ... Setting up dh-python (6.20241024) ... Processing triggers for libc-bin (2.40-3) ... Processing triggers for sgml-base (1.31) ... Setting up docutils-common (0.21.2+dfsg-2) ... Processing triggers for sgml-base (1.31) ... Setting up python3-docutils (0.21.2+dfsg-2) ... Setting up python3-sphinx (7.4.7-4) ... Setting up python3-sphinxcontrib.jquery (4.1-5) ... Setting up python3-sphinx-rtd-theme (3.0.1+dfsg-1) ... Processing triggers for ca-certificates (20240203) ... Updating certificates in /etc/ssl/certs... 0 added, 0 removed; done. Running hooks in /etc/ca-certificates/update.d... done. Reading package lists... Building dependency tree... Reading state information... Reading extended state information... Initializing package states... Writing extended state information... Building tag database... -> Finished parsing the build-deps I: Building the package I: Running cd /build/reproducible-path/khal-0.11.3/ && env PATH="/usr/sbin:/usr/bin:/sbin:/bin:/usr/games" HOME="/nonexistent/first-build" dpkg-buildpackage -us -uc -b && env PATH="/usr/sbin:/usr/bin:/sbin:/bin:/usr/games" HOME="/nonexistent/first-build" dpkg-genchanges -S > ../khal_0.11.3-2_source.changes dpkg-buildpackage: info: source package khal dpkg-buildpackage: info: source version 1:0.11.3-2 dpkg-buildpackage: info: source distribution unstable dpkg-buildpackage: info: source changed by Jonas Smedegaard dpkg-source --before-build . dpkg-buildpackage: info: host architecture i386 dpkg-source: info: using options from khal-0.11.3/debian/source/options: --extend-diff-ignore=^[^/]*[.]egg-info/ debian/rules clean dh clean --buildsystem=pybuild debian/rules execute_before_dh_auto_clean make[1]: Entering directory '/build/reproducible-path/khal-0.11.3' printf '# coding: utf-8\nversion = "%s"\nversion_tuple = (%s, %s, %s)\n' 0.11.3 0 11 3 > khal/version.py make[1]: Leaving directory '/build/reproducible-path/khal-0.11.3' debian/rules override_dh_auto_clean make[1]: Entering directory '/build/reproducible-path/khal-0.11.3' grep -q use_scm_version setup.py || dh_auto_clean --buildsystem=pybuild I: pybuild base:311: python3.13 setup.py clean /usr/lib/python3/dist-packages/setuptools/_distutils/dist.py:261: UserWarning: Unknown distribution option: 'tests_require' warnings.warn(msg) running clean removing '/build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.13_khal/build' (and everything under it) 'build/bdist.linux-i686' does not exist -- can't clean it 'build/scripts-3.13' does not exist -- can't clean it I: pybuild base:311: python3.12 setup.py clean /usr/lib/python3/dist-packages/setuptools/_distutils/dist.py:261: UserWarning: Unknown distribution option: 'tests_require' warnings.warn(msg) running clean removing '/build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.12_khal/build' (and everything under it) 'build/bdist.linux-i686' does not exist -- can't clean it 'build/scripts-3.12' does not exist -- can't clean it make[1]: Leaving directory '/build/reproducible-path/khal-0.11.3' dh_autoreconf_clean -O--buildsystem=pybuild dh_clean -O--buildsystem=pybuild debian/rules binary dh binary --buildsystem=pybuild dh_update_autotools_config -O--buildsystem=pybuild dh_autoreconf -O--buildsystem=pybuild debian/rules execute_before_dh_auto_configure make[1]: Entering directory '/build/reproducible-path/khal-0.11.3' printf '# coding: utf-8\nversion = "%s"\nversion_tuple = (%s, %s, %s)\n' 0.11.3 0 11 3 > khal/version.py make[1]: Leaving directory '/build/reproducible-path/khal-0.11.3' dh_auto_configure -O--buildsystem=pybuild I: pybuild base:311: python3.13 setup.py config /usr/lib/python3/dist-packages/setuptools/_distutils/dist.py:261: UserWarning: Unknown distribution option: 'tests_require' warnings.warn(msg) running config I: pybuild base:311: python3.12 setup.py config /usr/lib/python3/dist-packages/setuptools/_distutils/dist.py:261: UserWarning: Unknown distribution option: 'tests_require' warnings.warn(msg) running config dh_auto_build -O--buildsystem=pybuild I: pybuild base:311: /usr/bin/python3.13 setup.py build /usr/lib/python3/dist-packages/setuptools/_distutils/dist.py:261: UserWarning: Unknown distribution option: 'tests_require' warnings.warn(msg) running build running build_py creating /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.13_khal/build/khal copying khal/configwizard.py -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.13_khal/build/khal copying khal/calendar_display.py -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.13_khal/build/khal copying khal/utils.py -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.13_khal/build/khal copying khal/terminal.py -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.13_khal/build/khal copying khal/cli.py -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.13_khal/build/khal copying khal/__main__.py -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.13_khal/build/khal copying khal/custom_types.py -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.13_khal/build/khal copying khal/icalendar.py -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.13_khal/build/khal copying khal/controllers.py -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.13_khal/build/khal copying khal/__init__.py -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.13_khal/build/khal copying khal/exceptions.py -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.13_khal/build/khal copying khal/version.py -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.13_khal/build/khal copying khal/parse_datetime.py -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.13_khal/build/khal creating /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.13_khal/build/khal/ui copying khal/ui/calendarwidget.py -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.13_khal/build/khal/ui copying khal/ui/colors.py -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.13_khal/build/khal/ui copying khal/ui/widgets.py -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.13_khal/build/khal/ui copying khal/ui/base.py -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.13_khal/build/khal/ui copying khal/ui/__init__.py -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.13_khal/build/khal/ui copying khal/ui/editor.py -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.13_khal/build/khal/ui creating /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.13_khal/build/khal/khalendar copying khal/khalendar/khalendar.py -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.13_khal/build/khal/khalendar copying khal/khalendar/event.py -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.13_khal/build/khal/khalendar copying khal/khalendar/vdir.py -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.13_khal/build/khal/khalendar copying khal/khalendar/__init__.py -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.13_khal/build/khal/khalendar copying khal/khalendar/exceptions.py -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.13_khal/build/khal/khalendar copying khal/khalendar/backend.py -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.13_khal/build/khal/khalendar creating /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.13_khal/build/khal/settings copying khal/settings/utils.py -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.13_khal/build/khal/settings copying khal/settings/settings.py -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.13_khal/build/khal/settings copying khal/settings/__init__.py -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.13_khal/build/khal/settings copying khal/settings/exceptions.py -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.13_khal/build/khal/settings copying khal/settings/khal.spec -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.13_khal/build/khal/settings I: pybuild base:311: /usr/bin/python3 setup.py build /usr/lib/python3/dist-packages/setuptools/_distutils/dist.py:261: UserWarning: Unknown distribution option: 'tests_require' warnings.warn(msg) running build running build_py creating /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.12_khal/build/khal copying khal/configwizard.py -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.12_khal/build/khal copying khal/calendar_display.py -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.12_khal/build/khal copying khal/utils.py -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.12_khal/build/khal copying khal/terminal.py -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.12_khal/build/khal copying khal/cli.py -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.12_khal/build/khal copying khal/__main__.py -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.12_khal/build/khal copying khal/custom_types.py -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.12_khal/build/khal copying khal/icalendar.py -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.12_khal/build/khal copying khal/controllers.py -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.12_khal/build/khal copying khal/__init__.py -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.12_khal/build/khal copying khal/exceptions.py -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.12_khal/build/khal copying khal/version.py -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.12_khal/build/khal copying khal/parse_datetime.py -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.12_khal/build/khal creating /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.12_khal/build/khal/ui copying khal/ui/calendarwidget.py -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.12_khal/build/khal/ui copying khal/ui/colors.py -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.12_khal/build/khal/ui copying khal/ui/widgets.py -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.12_khal/build/khal/ui copying khal/ui/base.py -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.12_khal/build/khal/ui copying khal/ui/__init__.py -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.12_khal/build/khal/ui copying khal/ui/editor.py -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.12_khal/build/khal/ui creating /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.12_khal/build/khal/khalendar copying khal/khalendar/khalendar.py -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.12_khal/build/khal/khalendar copying khal/khalendar/event.py -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.12_khal/build/khal/khalendar copying khal/khalendar/vdir.py -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.12_khal/build/khal/khalendar copying khal/khalendar/__init__.py -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.12_khal/build/khal/khalendar copying khal/khalendar/exceptions.py -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.12_khal/build/khal/khalendar copying khal/khalendar/backend.py -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.12_khal/build/khal/khalendar creating /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.12_khal/build/khal/settings copying khal/settings/utils.py -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.12_khal/build/khal/settings copying khal/settings/settings.py -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.12_khal/build/khal/settings copying khal/settings/__init__.py -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.12_khal/build/khal/settings copying khal/settings/exceptions.py -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.12_khal/build/khal/settings copying khal/settings/khal.spec -> /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.12_khal/build/khal/settings debian/rules execute_after_dh_auto_build make[1]: Entering directory '/build/reproducible-path/khal-0.11.3' PYTHONPATH=. python3 -m sphinx -b man doc/source /build/reproducible-path/khal-0.11.3/doc/_build/man Running Sphinx v7.4.7 loading translations [en]... done making output directory... done Converting `source_suffix = '.rst'` to `source_suffix = {'.rst': 'restructuredtext'}`. loading intersphinx inventory 'python' from /usr/share/doc/python3-doc/html/objects.inv... building [mo]: targets for 0 po files that are out of date writing output... building [man]: all manpages updating environment: [new config] 40 added, 0 changed, 0 removed reading sources... [ 2%] changelog reading sources... [ 5%] configure reading sources... [ 8%] faq reading sources... [ 10%] feedback reading sources... [ 12%] hacking reading sources... [ 15%] index reading sources... [ 18%] install reading sources... [ 20%] license reading sources... [ 22%] man reading sources... [ 25%] news reading sources... [ 28%] news/30c3 reading sources... [ 30%] news/31c3 reading sources... [ 32%] news/callfortesting reading sources... [ 35%] news/khal01 reading sources... [ 38%] news/khal0100 reading sources... [ 40%] news/khal011 reading sources... [ 42%] news/khal02 reading sources... [ 45%] news/khal03 reading sources... [ 48%] news/khal031 reading sources... [ 50%] news/khal04 reading sources... [ 52%] news/khal05 reading sources... [ 55%] news/khal06 reading sources... [ 57%] news/khal07 reading sources... [ 60%] news/khal071 reading sources... [ 62%] news/khal08 reading sources... [ 65%] news/khal081 reading sources... [ 68%] news/khal082 reading sources... [ 70%] news/khal083 reading sources... [ 72%] news/khal084 reading sources... [ 75%] news/khal09 reading sources... [ 78%] news/khal091 reading sources... [ 80%] news/khal092 reading sources... [ 82%] news/khal093 reading sources... [ 85%] news/khal094 reading sources... [ 88%] news/khal095 reading sources... [ 90%] news/khal096 reading sources... [ 92%] news/khal097 reading sources... [ 95%] news/khal098 reading sources... [ 98%] standards reading sources... [100%] usage /build/reproducible-path/khal-0.11.3/doc/source/news.rst:10: ERROR: Unknown directive type "feed". .. feed:: :rss: index.rss :title: khal news :link: http://lostpackets.de/khal/ news/khal0100 news/khal098 news/khal097 news/khal096 news/khal095 news/khal094 news/khal093 news/khal092 news/khal091 news/khal09 news/khal071 news/khal084 news/khal083 news/khal082 news/khal081 news/khal08 news/khal07 news/khal06 news/khal05 news/khal04 news/31c3 news/khal031 news/khal03 news/khal02 news/khal011 news/khal01 news/30c3 news/callfortesting /build/reproducible-path/khal-0.11.3/doc/source/news/30c3.rst:4: ERROR: Unknown directive type "feed-entry". .. feed-entry:: :date: 2013-12-13 /build/reproducible-path/khal-0.11.3/doc/source/news/31c3.rst:4: ERROR: Unknown directive type "feed-entry". .. feed-entry:: :date: 2014-12-09 /build/reproducible-path/khal-0.11.3/doc/source/news/callfortesting.rst:4: ERROR: Unknown directive type "feed-entry". .. feed-entry:: :date: 2013-11-19 /build/reproducible-path/khal-0.11.3/doc/source/news/khal01.rst:4: ERROR: Unknown directive type "feed-entry". .. feed-entry:: :date: 2014-04-03 /build/reproducible-path/khal-0.11.3/doc/source/news/khal0100.rst:4: ERROR: Unknown directive type "feed-entry". .. feed-entry:: :date: 2019-03-25 /build/reproducible-path/khal-0.11.3/doc/source/news/khal011.rst:4: ERROR: Unknown directive type "feed-entry". .. feed-entry:: :date: 2014-05-07 /build/reproducible-path/khal-0.11.3/doc/source/news/khal02.rst:4: ERROR: Unknown directive type "feed-entry". .. feed-entry:: :date: 2014-06-27 /build/reproducible-path/khal-0.11.3/doc/source/news/khal03.rst:4: ERROR: Unknown directive type "feed-entry". .. feed-entry:: :date: 2014-09-03 /build/reproducible-path/khal-0.11.3/doc/source/news/khal031.rst:4: ERROR: Unknown directive type "feed-entry". .. feed-entry:: :date: 2014-09-08 /build/reproducible-path/khal-0.11.3/doc/source/news/khal04.rst:4: ERROR: Unknown directive type "feed-entry". .. feed-entry:: :date: 2015-02-02 /build/reproducible-path/khal-0.11.3/doc/source/news/khal05.rst:4: ERROR: Unknown directive type "feed-entry". .. feed-entry:: :date: 2015-06-01 /build/reproducible-path/khal-0.11.3/doc/source/news/khal06.rst:4: ERROR: Unknown directive type "feed-entry". .. feed-entry:: :date: 2015-07-15 /build/reproducible-path/khal-0.11.3/doc/source/news/khal07.rst:4: ERROR: Unknown directive type "feed-entry". .. feed-entry:: :date: 2015-11-24 /build/reproducible-path/khal-0.11.3/doc/source/news/khal071.rst:4: ERROR: Unknown directive type "feed-entry". .. feed-entry:: :date: 2016-10-11 /build/reproducible-path/khal-0.11.3/doc/source/news/khal08.rst:4: ERROR: Unknown directive type "feed-entry". .. feed-entry:: :date: 2016-04-13 /build/reproducible-path/khal-0.11.3/doc/source/news/khal081.rst:4: ERROR: Unknown directive type "feed-entry". .. feed-entry:: :date: 2016-04-13 /build/reproducible-path/khal-0.11.3/doc/source/news/khal082.rst:4: ERROR: Unknown directive type "feed-entry". .. feed-entry:: :date: 2016-05-16 /build/reproducible-path/khal-0.11.3/doc/source/news/khal083.rst:4: ERROR: Unknown directive type "feed-entry". .. feed-entry:: :date: 2016-08-28 /build/reproducible-path/khal-0.11.3/doc/source/news/khal084.rst:4: ERROR: Unknown directive type "feed-entry". .. feed-entry:: :date: 2016-10-06 /build/reproducible-path/khal-0.11.3/doc/source/news/khal09.rst:4: ERROR: Unknown directive type "feed-entry". .. feed-entry:: :date: 2017-01-24 /build/reproducible-path/khal-0.11.3/doc/source/news/khal091.rst:4: ERROR: Unknown directive type "feed-entry". .. feed-entry:: :date: 2017-01-25 /build/reproducible-path/khal-0.11.3/doc/source/news/khal092.rst:4: ERROR: Unknown directive type "feed-entry". .. feed-entry:: :date: 2017-02-13 /build/reproducible-path/khal-0.11.3/doc/source/news/khal093.rst:4: ERROR: Unknown directive type "feed-entry". .. feed-entry:: :date: 2017-03-06 /build/reproducible-path/khal-0.11.3/doc/source/news/khal094.rst:4: ERROR: Unknown directive type "feed-entry". .. feed-entry:: :date: 2017-03-30 /build/reproducible-path/khal-0.11.3/doc/source/news/khal095.rst:4: ERROR: Unknown directive type "feed-entry". .. feed-entry:: :date: 2017-04-10 /build/reproducible-path/khal-0.11.3/doc/source/news/khal096.rst:4: ERROR: Unknown directive type "feed-entry". .. feed-entry:: :date: 2017-06-13 /build/reproducible-path/khal-0.11.3/doc/source/news/khal097.rst:4: ERROR: Unknown directive type "feed-entry". .. feed-entry:: :date: 2017-09-15 /build/reproducible-path/khal-0.11.3/doc/source/news/khal098.rst:4: ERROR: Unknown directive type "feed-entry". .. feed-entry:: :date: 2017-10-05 looking for now-outdated files... none found pickling environment... done checking consistency... /build/reproducible-path/khal-0.11.3/doc/source/man.rst: WARNING: document isn't included in any toctree /build/reproducible-path/khal-0.11.3/doc/source/news.rst: WARNING: document isn't included in any toctree /build/reproducible-path/khal-0.11.3/doc/source/news/30c3.rst: WARNING: document isn't included in any toctree /build/reproducible-path/khal-0.11.3/doc/source/news/31c3.rst: WARNING: document isn't included in any toctree /build/reproducible-path/khal-0.11.3/doc/source/news/callfortesting.rst: WARNING: document isn't included in any toctree /build/reproducible-path/khal-0.11.3/doc/source/news/khal01.rst: WARNING: document isn't included in any toctree /build/reproducible-path/khal-0.11.3/doc/source/news/khal0100.rst: WARNING: document isn't included in any toctree /build/reproducible-path/khal-0.11.3/doc/source/news/khal011.rst: WARNING: document isn't included in any toctree /build/reproducible-path/khal-0.11.3/doc/source/news/khal02.rst: WARNING: document isn't included in any toctree /build/reproducible-path/khal-0.11.3/doc/source/news/khal03.rst: WARNING: document isn't included in any toctree /build/reproducible-path/khal-0.11.3/doc/source/news/khal031.rst: WARNING: document isn't included in any toctree /build/reproducible-path/khal-0.11.3/doc/source/news/khal04.rst: WARNING: document isn't included in any toctree /build/reproducible-path/khal-0.11.3/doc/source/news/khal05.rst: WARNING: document isn't included in any toctree /build/reproducible-path/khal-0.11.3/doc/source/news/khal06.rst: WARNING: document isn't included in any toctree /build/reproducible-path/khal-0.11.3/doc/source/news/khal07.rst: WARNING: document isn't included in any toctree /build/reproducible-path/khal-0.11.3/doc/source/news/khal071.rst: WARNING: document isn't included in any toctree /build/reproducible-path/khal-0.11.3/doc/source/news/khal08.rst: WARNING: document isn't included in any toctree /build/reproducible-path/khal-0.11.3/doc/source/news/khal081.rst: WARNING: document isn't included in any toctree /build/reproducible-path/khal-0.11.3/doc/source/news/khal082.rst: WARNING: document isn't included in any toctree /build/reproducible-path/khal-0.11.3/doc/source/news/khal083.rst: WARNING: document isn't included in any toctree /build/reproducible-path/khal-0.11.3/doc/source/news/khal084.rst: WARNING: document isn't included in any toctree /build/reproducible-path/khal-0.11.3/doc/source/news/khal09.rst: WARNING: document isn't included in any toctree /build/reproducible-path/khal-0.11.3/doc/source/news/khal091.rst: WARNING: document isn't included in any toctree /build/reproducible-path/khal-0.11.3/doc/source/news/khal092.rst: WARNING: document isn't included in any toctree /build/reproducible-path/khal-0.11.3/doc/source/news/khal093.rst: WARNING: document isn't included in any toctree /build/reproducible-path/khal-0.11.3/doc/source/news/khal094.rst: WARNING: document isn't included in any toctree /build/reproducible-path/khal-0.11.3/doc/source/news/khal095.rst: WARNING: document isn't included in any toctree /build/reproducible-path/khal-0.11.3/doc/source/news/khal096.rst: WARNING: document isn't included in any toctree /build/reproducible-path/khal-0.11.3/doc/source/news/khal097.rst: WARNING: document isn't included in any toctree /build/reproducible-path/khal-0.11.3/doc/source/news/khal098.rst: WARNING: document isn't included in any toctree /build/reproducible-path/khal-0.11.3/doc/source/configure.rst: document is referenced in multiple toctrees: ['index', 'man'], selecting: man <- configure /build/reproducible-path/khal-0.11.3/doc/source/faq.rst: document is referenced in multiple toctrees: ['index', 'man'], selecting: man <- faq /build/reproducible-path/khal-0.11.3/doc/source/license.rst: document is referenced in multiple toctrees: ['index', 'man'], selecting: man <- license /build/reproducible-path/khal-0.11.3/doc/source/standards.rst: document is referenced in multiple toctrees: ['index', 'man'], selecting: man <- standards /build/reproducible-path/khal-0.11.3/doc/source/usage.rst: document is referenced in multiple toctrees: ['index', 'man'], selecting: man <- usage done writing... khal.1 { usage configure standards faq license } /build/reproducible-path/khal-0.11.3/doc/source/usage.rst:53: WARNING: unknown option: '--color' /build/reproducible-path/khal-0.11.3/doc/source/usage.rst:53: WARNING: unknown option: '--color' /build/reproducible-path/khal-0.11.3/doc/source/usage.rst:401: WARNING: unknown option: '--interactive' /build/reproducible-path/khal-0.11.3/doc/source/configure.rst:17: WARNING: unknown option: '-c\npath/to/config' done build succeeded, 63 warnings. The manual pages are in doc/_build/man. make[1]: Leaving directory '/build/reproducible-path/khal-0.11.3' debian/rules override_dh_auto_test make[1]: Entering directory '/build/reproducible-path/khal-0.11.3' mkdir -p debian/tmp/locale/ localedef -f UTF-8 -i en_US ./debian/tmp/locale/en_US.UTF-8/ localedef -f UTF-8 -i de_DE ./debian/tmp/locale/de_DE.UTF-8/ localedef -f UTF-8 -i cs_CZ ./debian/tmp/locale/cs_CZ.UTF-8/ localedef -f UTF-8 -i el_GR ./debian/tmp/locale/el_GR.UTF-8/ LOCPATH=/build/reproducible-path/khal-0.11.3/debian/tmp/locale/ LC_ALL=en_US.UTF-8 dh_auto_test I: pybuild base:311: cd /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.13_khal/build; python3.13 -m pytest tests ============================= test session starts ============================== platform linux -- Python 3.13.0, pytest-8.3.3, pluggy-1.5.0 rootdir: /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.13_khal/build configfile: pyproject.toml plugins: typeguard-4.4.1, hypothesis-6.116.0 collected 315 items tests/backend_test.py .F.FF...FFFF....F............. [ 9%] tests/cal_display_test.py ......... [ 12%] tests/cli_test.py .FFFF...F.xX.x..FF....F...........F.F.FF. [ 25%] tests/configwizard_test.py .. [ 26%] tests/controller_test.py .....FF..... [ 29%] tests/event_test.py ..F.FF..FFFFFFF...F..F.........FF..F.......F........ [ 46%] .... [ 47%] tests/icalendar_test.py ..FF.F. [ 49%] tests/khalendar_test.py .......F..FFF..F..FFF......... [ 59%] tests/khalendar_utils_test.py FFF....F.....F...F...FFFF.F..FF.......... [ 72%] tests/parse_datetime_test.py ........................................... [ 86%] ..... [ 87%] tests/settings_test.py ............ [ 91%] tests/terminal_test.py ... [ 92%] tests/ui/test_calendarwidget.py ..... [ 93%] tests/ui/test_editor.py .... [ 95%] tests/ui/test_widgets.py . [ 95%] tests/utils_test.py ........ [ 98%] tests/vdir_test.py ... [ 99%] tests/vtimezone_test.py ..F [100%] =================================== FAILURES =================================== ________________________ test_event_rrule_recurrence_id ________________________ def test_event_rrule_recurrence_id(): dbi = backend.SQLiteDb([calname], ':memory:', locale=LOCALE_BERLIN) assert dbi.list(calname) == [] events = dbi.get_localized( BERLIN.localize(dt.datetime(2014, 6, 30, 0, 0)), BERLIN.localize(dt.datetime(2014, 8, 26, 0, 0)), ) assert list(events) == [] > dbi.update(_get_text('event_rrule_recuid'), href='12345.ics', etag='abcd', calendar=calname) tests/backend_test.py:31: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/backend.py:246: in update self._update_impl(vevent, href, calendar) khal/khalendar/backend.py:367: in _update_impl dtstartend = expand_vevent(vevent, href) khal/icalendar.py:315: in expand dtstartl = set(rrule) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ date = datetime.datetime(2014, 6, 30, 7, 0) def sanitize_datetime(date): if allday and isinstance(date, dt.datetime): date = date.date() if events_tz is not None: > date = events_tz.localize(date) E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute 'localize' khal/icalendar.py:256: AttributeError ____________________ test_event_rrule_recurrence_id_reverse ____________________ def test_event_rrule_recurrence_id_reverse(): """as icalendar elements can be saved in arbitrary order, we also have to deal with `reverse` ordered icalendar files """ dbi = backend.SQLiteDb([calname], ':memory:', locale=LOCALE_BERLIN) assert dbi.list(calname) == [] events = dbi.get_localized( BERLIN.localize(dt.datetime(2014, 6, 30, 0, 0)), BERLIN.localize(dt.datetime(2014, 8, 26, 0, 0))) assert list(events) == [] > dbi.update(event_rrule_recurrence_id_reverse, href='12345.ics', etag='abcd', calendar=calname) tests/backend_test.py:104: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/backend.py:246: in update self._update_impl(vevent, href, calendar) khal/khalendar/backend.py:367: in _update_impl dtstartend = expand_vevent(vevent, href) khal/icalendar.py:315: in expand dtstartl = set(rrule) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ date = datetime.datetime(2014, 6, 30, 7, 0) def sanitize_datetime(date): if allday and isinstance(date, dt.datetime): date = date.date() if events_tz is not None: > date = events_tz.localize(date) E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute 'localize' khal/icalendar.py:256: AttributeError ______________ test_event_rrule_recurrence_id_update_with_exclude ______________ def test_event_rrule_recurrence_id_update_with_exclude(): """ test if updates work as they should. The updated event has the extra RECURRENCE-ID event removed and one recurrence date excluded via EXDATE """ dbi = backend.SQLiteDb([calname], ':memory:', locale=LOCALE_BERLIN) > dbi.update(_get_text('event_rrule_recuid'), href='12345.ics', etag='abcd', calendar=calname) tests/backend_test.py:126: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/backend.py:246: in update self._update_impl(vevent, href, calendar) khal/khalendar/backend.py:367: in _update_impl dtstartend = expand_vevent(vevent, href) khal/icalendar.py:315: in expand dtstartl = set(rrule) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ date = datetime.datetime(2014, 6, 30, 7, 0) def sanitize_datetime(date): if allday and isinstance(date, dt.datetime): date = date.date() if events_tz is not None: > date = events_tz.localize(date) E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute 'localize' khal/icalendar.py:256: AttributeError ______________________________ test_event_delete _______________________________ def test_event_delete(): dbi = backend.SQLiteDb([calname], ':memory:', locale=LOCALE_BERLIN) assert dbi.list(calname) == [] events = dbi.get_localized(BERLIN.localize(dt.datetime(2014, 6, 30, 0, 0)), BERLIN.localize(dt.datetime(2014, 8, 26, 0, 0))) assert list(events) == [] > dbi.update(event_rrule_recurrence_id_reverse, href='12345.ics', etag='abcd', calendar=calname) tests/backend_test.py:200: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/backend.py:246: in update self._update_impl(vevent, href, calendar) khal/khalendar/backend.py:367: in _update_impl dtstartend = expand_vevent(vevent, href) khal/icalendar.py:315: in expand dtstartl = set(rrule) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ date = datetime.datetime(2014, 6, 30, 7, 0) def sanitize_datetime(date): if allday and isinstance(date, dt.datetime): date = date.date() if events_tz is not None: > date = events_tz.localize(date) E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute 'localize' khal/icalendar.py:256: AttributeError _____________________________ test_this_and_prior ______________________________ def test_this_and_prior(): """we do not support THISANDPRIOR, therefore this should fail""" dbi = backend.SQLiteDb([calname], ':memory:', locale=LOCALE_BERLIN) with pytest.raises(UpdateFailed): > dbi.update(event_rrule_this_and_prior, href='12345.ics', etag='abcd', calendar=calname) tests/backend_test.py:235: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/backend.py:246: in update self._update_impl(vevent, href, calendar) khal/khalendar/backend.py:367: in _update_impl dtstartend = expand_vevent(vevent, href) khal/icalendar.py:315: in expand dtstartl = set(rrule) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ date = datetime.datetime(2014, 6, 30, 7, 0) def sanitize_datetime(date): if allday and isinstance(date, dt.datetime): date = date.date() if events_tz is not None: > date = events_tz.localize(date) E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute 'localize' khal/icalendar.py:256: AttributeError _______________________ test_event_rrule_this_and_future _______________________ def test_event_rrule_this_and_future(): dbi = backend.SQLiteDb([calname], ':memory:', locale=LOCALE_BERLIN) > dbi.update(event_rrule_this_and_future, href='12345.ics', etag='abcd', calendar=calname) tests/backend_test.py:263: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/backend.py:246: in update self._update_impl(vevent, href, calendar) khal/khalendar/backend.py:367: in _update_impl dtstartend = expand_vevent(vevent, href) khal/icalendar.py:315: in expand dtstartl = set(rrule) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ date = datetime.datetime(2014, 6, 30, 7, 0) def sanitize_datetime(date): if allday and isinstance(date, dt.datetime): date = date.date() if events_tz is not None: > date = events_tz.localize(date) E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute 'localize' khal/icalendar.py:256: AttributeError _______________ test_event_rrule_this_and_future_multi_day_shift _______________ def test_event_rrule_this_and_future_multi_day_shift(): dbi = backend.SQLiteDb([calname], ':memory:', locale=LOCALE_BERLIN) > dbi.update(event_rrule_this_and_future_multi_day_shift, href='12345.ics', etag='abcd', calendar=calname) tests/backend_test.py:295: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/backend.py:246: in update self._update_impl(vevent, href, calendar) khal/khalendar/backend.py:367: in _update_impl dtstartend = expand_vevent(vevent, href) khal/icalendar.py:315: in expand dtstartl = set(rrule) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ date = datetime.datetime(2014, 6, 30, 7, 0) def sanitize_datetime(date): if allday and isinstance(date, dt.datetime): date = date.date() if events_tz is not None: > date = events_tz.localize(date) E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute 'localize' khal/icalendar.py:256: AttributeError _________________________ test_two_calendars_same_uid __________________________ def test_two_calendars_same_uid(): home = 'home' work = 'work' dbi = backend.SQLiteDb([home, work], ':memory:', locale=LOCALE_BERLIN) assert dbi.list(home) == [] assert dbi.list(work) == [] > dbi.update(event_a, href='12345.ics', etag='abcd', calendar=home) tests/backend_test.py:513: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/backend.py:246: in update self._update_impl(vevent, href, calendar) khal/khalendar/backend.py:367: in _update_impl dtstartend = expand_vevent(vevent, href) khal/icalendar.py:315: in expand dtstartl = set(rrule) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ date = datetime.datetime(2014, 6, 30, 7, 0) def sanitize_datetime(date): if allday and isinstance(date, dt.datetime): date = date.date() if events_tz is not None: > date = events_tz.localize(date) E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute 'localize' khal/icalendar.py:256: AttributeError _________________________________ test_simple __________________________________ runner = def test_simple(runner): runner = runner(days=2) result = runner.invoke(main_khal, ['list']) assert not result.exception assert result.output == '' now = dt.datetime.now().strftime('%d.%m.%Y') result = runner.invoke( main_khal, f'new {now} 18:00 myevent'.split()) assert result.output == '' > assert not result.exception E assert not AttributeError("'zoneinfo.ZoneInfo' object has no attribute '_tzinfos'") E + where AttributeError("'zoneinfo.ZoneInfo' object has no attribute '_tzinfos'") = .exception tests/cli_test.py:137: AssertionError ______________________________ test_simple_color _______________________________ runner = def test_simple_color(runner): runner = runner(days=2) now = dt.datetime.now().strftime('%d.%m.%Y') result = runner.invoke(main_khal, f'new {now} 18:00 myevent'.split()) assert result.output == '' > assert not result.exception E assert not AttributeError("'zoneinfo.ZoneInfo' object has no attribute '_tzinfos'") E + where AttributeError("'zoneinfo.ZoneInfo' object has no attribute '_tzinfos'") = .exception tests/cli_test.py:153: AssertionError __________________________________ test_days ___________________________________ runner = def test_days(runner): runner = runner(days=9) when = (dt.datetime.now() + dt.timedelta(days=7)).strftime('%d.%m.%Y') result = runner.invoke(main_khal, f'new {when} 18:00 nextweek'.split()) assert result.output == '' > assert not result.exception E assert not AttributeError("'zoneinfo.ZoneInfo' object has no attribute '_tzinfos'") E + where AttributeError("'zoneinfo.ZoneInfo' object has no attribute '_tzinfos'") = .exception tests/cli_test.py:166: AssertionError _______________________________ test_notstarted ________________________________ runner = def test_notstarted(runner): with freeze_time('2015-6-1 15:00'): runner = runner(days=2) for command in [ 'new 30.5.2015 5.6.2015 long event', 'new 2.6.2015 4.6.2015 two day event', 'new 1.6.2015 14:00 18:00 four hour event', 'new 1.6.2015 16:00 17:00 one hour event', 'new 2.6.2015 10:00 13:00 three hour event', ]: result = runner.invoke(main_khal, command.split()) > assert not result.exception E assert not AttributeError("'zoneinfo.ZoneInfo' object has no attribute '_tzinfos'") E + where AttributeError("'zoneinfo.ZoneInfo' object has no attribute '_tzinfos'") = .exception tests/cli_test.py:191: AssertionError ____________________________ test_invalid_calendar _____________________________ runner = def test_invalid_calendar(runner): runner = runner(days=2) result = runner.invoke( main_khal, ['new'] + '-a one 18:00 myevent'.split()) > assert not result.exception E assert not AttributeError("'zoneinfo.ZoneInfo' object has no attribute '_tzinfos'") E + where AttributeError("'zoneinfo.ZoneInfo' object has no attribute '_tzinfos'") = .exception tests/cli_test.py:314: AssertionError __________________________________ test_list ___________________________________ runner = def test_list(runner): runner = runner(days=2) now = dt.datetime.now().strftime('%d.%m.%Y') result = runner.invoke( main_khal, f'new {now} 18:00 myevent'.split()) format = '{red}{start-end-time-style}{reset} {title} :: {description}' args = ['--color', 'list', '--format', format, '--day-format', 'header', '18:30'] result = runner.invoke(main_khal, args) expected = 'header\x1b[0m\n\x1b[31m18:00-19:00\x1b[0m myevent :: \x1b[0m\n' assert not result.exception > assert result.output.startswith(expected) E AssertionError: assert False E + where False = ('header\x1b[0m\n\x1b[31m18:00-19:00\x1b[0m myevent :: \x1b[0m\n') E + where = ''.startswith E + where '' = .output tests/cli_test.py:414: AssertionError _________________________________ test_search __________________________________ runner = def test_search(runner): runner = runner(days=2) now = dt.datetime.now().strftime('%d.%m.%Y') result = runner.invoke(main_khal, f'new {now} 18:00 myevent'.split()) format = '{red}{start-end-time-style}{reset} {title} :: {description}' result = runner.invoke(main_khal, ['--color', 'search', '--format', format, 'myevent']) assert not result.exception > assert result.output.startswith('\x1b[34m\x1b[31m18:00') E AssertionError: assert False E + where False = ('\x1b[34m\x1b[31m18:00') E + where = ''.startswith E + where '' = .output tests/cli_test.py:424: AssertionError _____________________ test_import_proper_invalid_timezone ______________________ runner = def test_import_proper_invalid_timezone(runner): runner = runner() result = runner.invoke( main_khal, ['import', _get_ics_filepath('invalid_tzoffset')], input='0\ny\n') assert result.output.startswith( 'warning: Invalid timezone offset encountered, timezone information may be wrong') > assert not result.exception E assert not SystemExit(1) E + where SystemExit(1) = .exception tests/cli_test.py:491: AssertionError __________________________________ test_edit ___________________________________ runner = def test_edit(runner): runner = runner() result = runner.invoke(main_khal, ['list']) assert not result.exception assert result.output == '' for name in ['event_dt_simple', 'event_d_15']: cal_dt = _get_text(name) event = runner.calendars['one'].join(f'{name}.ics') event.write(cal_dt) format = '{start-end-time-style}: {title}' result = runner.invoke( main_khal, ['edit', '--show-past', 'Event'], input='s\nGreat Event\nn\nn\n') > assert not result.exception E assert not AttributeError("'zoneinfo.ZoneInfo' object has no attribute '_tzinfos'") E + where AttributeError("'zoneinfo.ZoneInfo' object has no attribute '_tzinfos'") = .exception tests/cli_test.py:819: AssertionError _____________________________ test_new_interactive _____________________________ runner = @freeze_time('2015-6-1 8:00') def test_new_interactive(runner): runner = runner(print_new='path') result = runner.invoke( main_khal, 'new -i'.split(), 'Another event\n13:00 17:00\n\nNone\nn\n' ) > assert not result.exception E assert not AttributeError("'zoneinfo.ZoneInfo' object has no attribute '_tzinfos'") E + where AttributeError("'zoneinfo.ZoneInfo' object has no attribute '_tzinfos'") = .exception tests/cli_test.py:849: AssertionError ________________________ test_new_interactive_extensive ________________________ runner = @freeze_time('2015-6-1 8:00') def test_new_interactive_extensive(runner): runner = runner(print_new='path', default_calendar=False) result = runner.invoke( main_khal, 'new -i 15:00 15:30'.split(), '?\ninvalid\ntwo\n' 'Unicce Name\n' '\n' 'Europe/London\n' 'bar\n' 'l\non a boat\n' 'p\nweekly\n' '1.1.2018\n' 'a\n30m\n' 'c\nwork\n' 'n\n' ) > assert not result.exception E assert not AttributeError("'zoneinfo.ZoneInfo' object has no attribute '_tzinfos'") E + where AttributeError("'zoneinfo.ZoneInfo' object has no attribute '_tzinfos'") = .exception tests/cli_test.py:880: AssertionError _______________________________ test_issue_1056 ________________________________ runner = @freeze_time('2015-6-1 8:00') def test_issue_1056(runner): """if an ansi escape sequence is contained in the output, we can't parse it properly""" runner = runner(print_new='path', default_calendar=False) result = runner.invoke( main_khal, 'new -i'.split(), 'two\n' 'new event\n' 'now\n' 'Europe/London\n' 'None\n' 't\n' # edit datetime range '\n' 'n\n' ) assert 'error parsing range' not in result.output > assert not result.exception E assert not AttributeError("'zoneinfo.ZoneInfo' object has no attribute '_tzinfos'") E + where AttributeError("'zoneinfo.ZoneInfo' object has no attribute '_tzinfos'") = .exception tests/cli_test.py:903: AssertionError ____________________________ TestImport.test_import ____________________________ self = coll_vdirs = (, {"Dad's calendar": , 'private': }) def test_import(self, coll_vdirs): coll, vdirs = coll_vdirs view = {'event_format': '{title}'} conf = {'locale': utils.LOCALE_BERLIN, 'view': view} > import_ics(coll, conf, _get_text('event_rrule_recuid'), batch=True) tests/controller_test.py:100: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/controllers.py:617: in import_ics import_event(vevent, collection, conf['locale'], batch, format, env) khal/controllers.py:665: in import_event collection.insert(Item(vevent), collection=calendar_name) khal/khalendar/khalendar.py:228: in insert self._backend.update(event.raw, event.href, event.etag, calendar=calendar) khal/khalendar/backend.py:246: in update self._update_impl(vevent, href, calendar) khal/khalendar/backend.py:367: in _update_impl dtstartend = expand_vevent(vevent, href) khal/icalendar.py:315: in expand dtstartl = set(rrule) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ date = datetime.datetime(2014, 6, 30, 7, 0) def sanitize_datetime(date): if allday and isinstance(date, dt.datetime): date = date.date() if events_tz is not None: > date = events_tz.localize(date) E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute 'localize' khal/icalendar.py:256: AttributeError ----------------------------- Captured stderr call ----------------------------- warning: Cannot find timezone `Europe/Berlin` in .ics file, this could be a bug, please report this issue at http://github.com/pimutils/khal/. warning: Cannot find timezone `UTC` in .ics file, this could be a bug, please report this issue at http://github.com/pimutils/khal/. ______________________ TestImport.test_mix_datetime_types ______________________ collection = conf = {'locale': {'dateformat': '%d.%m.', 'datetimeformat': '%d.%m. %H:%M', 'default_timezone': , 'firstweekday': 0, ...}, 'view': {'event_format': '{title}'}} ics = 'BEGIN:VCALENDAR\nVERSION:2.0\nPRODID:ownCloud Calendar 0.7.3\nBEGIN:VEVENT\nSUMMARY:Termin:Junghackertag\nURL:http://...DTEND:20150602T160000\nDESCRIPTION:Junghackertag\nDTSTAMP:20150626T182050\nSEQUENCE:10172\nEND:VEVENT\nEND:VCALENDAR\n' batch = True, random_uid = False, format = '{title}', env = None def import_ics(collection, conf, ics, batch=False, random_uid=False, format=None, env=None): """ :param batch: setting this to True will insert without asking for approval, even when an event with the same uid already exists :type batch: bool :param random_uid: whether to assign a random UID to imported events or not :type random_uid: bool :param format: the format string to print events with :type format: str """ if format is None: format = conf['view']['event_format'] try: > vevents = split_ics(ics, random_uid, conf['locale']['default_timezone']) khal/controllers.py:613: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/icalendar.py:86: in split_ics raise saved_exception khal/icalendar.py:79: in split_ics ics = ics_from_list(events, tzs, random_uid, default_timezone) khal/icalendar.py:178: in ics_from_list sub_event = sanitize(sub_event, default_timezone=default_timezone) khal/icalendar.py:406: in sanitize dtstart, dtend = sanitize_timerange( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ dtstart = datetime.datetime(2015, 5, 30, 12, 0) dtend = datetime.datetime(2015, 5, 30, 16, 0, tzinfo=zoneinfo.ZoneInfo(key='Europe/Berlin')) duration = None def sanitize_timerange(dtstart, dtend, duration=None): '''return sensible dtstart and end for events that have an invalid or missing DTEND, assuming the event just lasts one hour.''' if isinstance(dtstart, dt.datetime) and isinstance(dtend, dt.datetime): if dtstart.tzinfo and not dtend.tzinfo: logger.warning( "Event end time has no timezone. " "Assuming it's the same timezone as the start time" ) dtend = dtstart.tzinfo.localize(dtend) if not dtstart.tzinfo and dtend.tzinfo: logger.warning( "Event start time has no timezone. " "Assuming it's the same timezone as the end time" ) > dtstart = dtend.tzinfo.localize(dtstart) E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute 'localize' khal/icalendar.py:431: AttributeError During handling of the above exception, another exception occurred: self = coll_vdirs = (, {"Dad's calendar": , 'private': }) def test_mix_datetime_types(self, coll_vdirs): """ Test importing events with mixed tz-aware and tz-naive datetimes. """ coll, vdirs = coll_vdirs view = {'event_format': '{title}'} > import_ics( coll, {'locale': utils.LOCALE_BERLIN, 'view': view}, _get_text('event_dt_mixed_awareness'), batch=True ) tests/controller_test.py:125: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ collection = conf = {'locale': {'dateformat': '%d.%m.', 'datetimeformat': '%d.%m. %H:%M', 'default_timezone': , 'firstweekday': 0, ...}, 'view': {'event_format': '{title}'}} ics = 'BEGIN:VCALENDAR\nVERSION:2.0\nPRODID:ownCloud Calendar 0.7.3\nBEGIN:VEVENT\nSUMMARY:Termin:Junghackertag\nURL:http://...DTEND:20150602T160000\nDESCRIPTION:Junghackertag\nDTSTAMP:20150626T182050\nSEQUENCE:10172\nEND:VEVENT\nEND:VCALENDAR\n' batch = True, random_uid = False, format = '{title}', env = None def import_ics(collection, conf, ics, batch=False, random_uid=False, format=None, env=None): """ :param batch: setting this to True will insert without asking for approval, even when an event with the same uid already exists :type batch: bool :param random_uid: whether to assign a random UID to imported events or not :type random_uid: bool :param format: the format string to print events with :type format: str """ if format is None: format = conf['view']['event_format'] try: vevents = split_ics(ics, random_uid, conf['locale']['default_timezone']) except Exception as error: > raise FatalError(error) E khal.exceptions.FatalError: 'zoneinfo.ZoneInfo' object has no attribute 'localize' khal/controllers.py:615: FatalError ----------------------------- Captured stderr call ----------------------------- warning: Event end time has no timezone. Assuming it's the same timezone as the start time warning: Error when trying to import the event S9HZETRQne warning: Event start time has no timezone. Assuming it's the same timezone as the end time warning: Error when trying to import the event http://wiki.hamburg.ccc.de/Termin:Junghackertag _________________________________ test_raw_dt __________________________________ def test_raw_dt(): event_dt = _get_text('event_dt_simple') start = BERLIN.localize(dt.datetime(2014, 4, 9, 9, 30)) end = BERLIN.localize(dt.datetime(2014, 4, 9, 10, 30)) event = Event.fromString(event_dt, start=start, end=end, **EVENT_KWARGS) with freeze_time('2016-1-1'): assert normalize_component(event.raw) == \ > normalize_component(_get_text('event_dt_simple_inkl_vtimezone')) tests/event_test.py:51: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/event.py:385: in raw timezone = create_timezone(tzinfo, self.start) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tz = zoneinfo.ZoneInfo(key='Europe/Berlin') first_date = datetime.datetime(2014, 4, 9, 7, 30) last_date = datetime.datetime(2014, 4, 10, 7, 30) def create_timezone( tz: pytz.BaseTzInfo, first_date: Optional[dt.datetime]=None, last_date: Optional[dt.datetime]=None ) -> icalendar.Timezone: """ create an icalendar vtimezone from a pytz.tzinfo object :param tz: the timezone :param first_date: the very first datetime that needs to be included in the transition times, typically the DTSTART value of the (first recurring) event :param last_date: the last datetime that needs to included, typically the end of the (very last) event (of a recursion set) :returns: timezone information we currently have a problem here: pytz.timezones only carry the absolute dates of time zone transitions, not their RRULEs. This will a) make for rather bloated VTIMEZONE components, especially for long recurring events, b) we'll need to specify for which time range this VTIMEZONE should be generated and c) will not be valid for recurring events that go into eternity. Possible Solutions: As this information is not provided by pytz at all, there is no easy solution, we'd really need to ship another version of the OLSON DB. """ if isinstance(tz, StaticTzInfo): return _create_timezone_static(tz) # TODO last_date = None, recurring to infinity first_date = dt.datetime.today() if not first_date else to_naive_utc(first_date) last_date = first_date + dt.timedelta(days=1) if not last_date else to_naive_utc(last_date) timezone = icalendar.Timezone() timezone.add('TZID', tz) dst = { one[2]: 'DST' in two.__repr__() > for one, two in iter(tz._tzinfos.items()) # type: ignore } E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute '_tzinfos' khal/khalendar/event.py:903: AttributeError ______________________________ test_update_simple ______________________________ def test_update_simple(): event = Event.fromString(_get_text('event_dt_simple'), **EVENT_KWARGS) event_updated = Event.fromString(_get_text('event_dt_simple_updated'), **EVENT_KWARGS) event.update_summary('A not so simple Event') event.update_description('Everything has changed') event.update_location('anywhere') event.update_categories(['meeting']) > assert normalize_component(event.raw) == normalize_component(event_updated.raw) tests/event_test.py:83: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/event.py:385: in raw timezone = create_timezone(tzinfo, self.start) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tz = zoneinfo.ZoneInfo(key='Europe/Berlin') first_date = datetime.datetime(2014, 4, 9, 7, 30) last_date = datetime.datetime(2014, 4, 10, 7, 30) def create_timezone( tz: pytz.BaseTzInfo, first_date: Optional[dt.datetime]=None, last_date: Optional[dt.datetime]=None ) -> icalendar.Timezone: """ create an icalendar vtimezone from a pytz.tzinfo object :param tz: the timezone :param first_date: the very first datetime that needs to be included in the transition times, typically the DTSTART value of the (first recurring) event :param last_date: the last datetime that needs to included, typically the end of the (very last) event (of a recursion set) :returns: timezone information we currently have a problem here: pytz.timezones only carry the absolute dates of time zone transitions, not their RRULEs. This will a) make for rather bloated VTIMEZONE components, especially for long recurring events, b) we'll need to specify for which time range this VTIMEZONE should be generated and c) will not be valid for recurring events that go into eternity. Possible Solutions: As this information is not provided by pytz at all, there is no easy solution, we'd really need to ship another version of the OLSON DB. """ if isinstance(tz, StaticTzInfo): return _create_timezone_static(tz) # TODO last_date = None, recurring to infinity first_date = dt.datetime.today() if not first_date else to_naive_utc(first_date) last_date = first_date + dt.timedelta(days=1) if not last_date else to_naive_utc(last_date) timezone = icalendar.Timezone() timezone.add('TZID', tz) dst = { one[2]: 'DST' in two.__repr__() > for one, two in iter(tz._tzinfos.items()) # type: ignore } E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute '_tzinfos' khal/khalendar/event.py:903: AttributeError _________________________________ test_add_url _________________________________ def test_add_url(): event = Event.fromString(_get_text('event_dt_simple'), **EVENT_KWARGS) event.update_url('https://github.com/pimutils/khal') > assert 'URL:https://github.com/pimutils/khal' in event.raw tests/event_test.py:89: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/event.py:385: in raw timezone = create_timezone(tzinfo, self.start) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tz = zoneinfo.ZoneInfo(key='Europe/Berlin') first_date = datetime.datetime(2014, 4, 9, 7, 30) last_date = datetime.datetime(2014, 4, 10, 7, 30) def create_timezone( tz: pytz.BaseTzInfo, first_date: Optional[dt.datetime]=None, last_date: Optional[dt.datetime]=None ) -> icalendar.Timezone: """ create an icalendar vtimezone from a pytz.tzinfo object :param tz: the timezone :param first_date: the very first datetime that needs to be included in the transition times, typically the DTSTART value of the (first recurring) event :param last_date: the last datetime that needs to included, typically the end of the (very last) event (of a recursion set) :returns: timezone information we currently have a problem here: pytz.timezones only carry the absolute dates of time zone transitions, not their RRULEs. This will a) make for rather bloated VTIMEZONE components, especially for long recurring events, b) we'll need to specify for which time range this VTIMEZONE should be generated and c) will not be valid for recurring events that go into eternity. Possible Solutions: As this information is not provided by pytz at all, there is no easy solution, we'd really need to ship another version of the OLSON DB. """ if isinstance(tz, StaticTzInfo): return _create_timezone_static(tz) # TODO last_date = None, recurring to infinity first_date = dt.datetime.today() if not first_date else to_naive_utc(first_date) last_date = first_date + dt.timedelta(days=1) if not last_date else to_naive_utc(last_date) timezone = icalendar.Timezone() timezone.add('TZID', tz) dst = { one[2]: 'DST' in two.__repr__() > for one, two in iter(tz._tzinfos.items()) # type: ignore } E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute '_tzinfos' khal/khalendar/event.py:903: AttributeError _______________________ test_do_not_save_empty_location ________________________ def test_do_not_save_empty_location(): event = Event.fromString(_get_text('event_dt_simple'), **EVENT_KWARGS) event.update_location('') > assert 'LOCATION' not in event.raw tests/event_test.py:109: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/event.py:385: in raw timezone = create_timezone(tzinfo, self.start) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tz = zoneinfo.ZoneInfo(key='Europe/Berlin') first_date = datetime.datetime(2014, 4, 9, 7, 30) last_date = datetime.datetime(2014, 4, 10, 7, 30) def create_timezone( tz: pytz.BaseTzInfo, first_date: Optional[dt.datetime]=None, last_date: Optional[dt.datetime]=None ) -> icalendar.Timezone: """ create an icalendar vtimezone from a pytz.tzinfo object :param tz: the timezone :param first_date: the very first datetime that needs to be included in the transition times, typically the DTSTART value of the (first recurring) event :param last_date: the last datetime that needs to included, typically the end of the (very last) event (of a recursion set) :returns: timezone information we currently have a problem here: pytz.timezones only carry the absolute dates of time zone transitions, not their RRULEs. This will a) make for rather bloated VTIMEZONE components, especially for long recurring events, b) we'll need to specify for which time range this VTIMEZONE should be generated and c) will not be valid for recurring events that go into eternity. Possible Solutions: As this information is not provided by pytz at all, there is no easy solution, we'd really need to ship another version of the OLSON DB. """ if isinstance(tz, StaticTzInfo): return _create_timezone_static(tz) # TODO last_date = None, recurring to infinity first_date = dt.datetime.today() if not first_date else to_naive_utc(first_date) last_date = first_date + dt.timedelta(days=1) if not last_date else to_naive_utc(last_date) timezone = icalendar.Timezone() timezone.add('TZID', tz) dst = { one[2]: 'DST' in two.__repr__() > for one, two in iter(tz._tzinfos.items()) # type: ignore } E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute '_tzinfos' khal/khalendar/event.py:903: AttributeError ______________________ test_do_not_save_empty_description ______________________ def test_do_not_save_empty_description(): event = Event.fromString(_get_text('event_dt_simple'), **EVENT_KWARGS) event.update_description('') > assert 'DESCRIPTION' not in event.raw tests/event_test.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/event.py:385: in raw timezone = create_timezone(tzinfo, self.start) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tz = zoneinfo.ZoneInfo(key='Europe/Berlin') first_date = datetime.datetime(2014, 4, 9, 7, 30) last_date = datetime.datetime(2014, 4, 10, 7, 30) def create_timezone( tz: pytz.BaseTzInfo, first_date: Optional[dt.datetime]=None, last_date: Optional[dt.datetime]=None ) -> icalendar.Timezone: """ create an icalendar vtimezone from a pytz.tzinfo object :param tz: the timezone :param first_date: the very first datetime that needs to be included in the transition times, typically the DTSTART value of the (first recurring) event :param last_date: the last datetime that needs to included, typically the end of the (very last) event (of a recursion set) :returns: timezone information we currently have a problem here: pytz.timezones only carry the absolute dates of time zone transitions, not their RRULEs. This will a) make for rather bloated VTIMEZONE components, especially for long recurring events, b) we'll need to specify for which time range this VTIMEZONE should be generated and c) will not be valid for recurring events that go into eternity. Possible Solutions: As this information is not provided by pytz at all, there is no easy solution, we'd really need to ship another version of the OLSON DB. """ if isinstance(tz, StaticTzInfo): return _create_timezone_static(tz) # TODO last_date = None, recurring to infinity first_date = dt.datetime.today() if not first_date else to_naive_utc(first_date) last_date = first_date + dt.timedelta(days=1) if not last_date else to_naive_utc(last_date) timezone = icalendar.Timezone() timezone.add('TZID', tz) dst = { one[2]: 'DST' in two.__repr__() > for one, two in iter(tz._tzinfos.items()) # type: ignore } E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute '_tzinfos' khal/khalendar/event.py:903: AttributeError __________________________ test_do_not_save_empty_url __________________________ def test_do_not_save_empty_url(): event = Event.fromString(_get_text('event_dt_simple'), **EVENT_KWARGS) event.update_url('') > assert 'URL' not in event.raw tests/event_test.py:121: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/event.py:385: in raw timezone = create_timezone(tzinfo, self.start) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tz = zoneinfo.ZoneInfo(key='Europe/Berlin') first_date = datetime.datetime(2014, 4, 9, 7, 30) last_date = datetime.datetime(2014, 4, 10, 7, 30) def create_timezone( tz: pytz.BaseTzInfo, first_date: Optional[dt.datetime]=None, last_date: Optional[dt.datetime]=None ) -> icalendar.Timezone: """ create an icalendar vtimezone from a pytz.tzinfo object :param tz: the timezone :param first_date: the very first datetime that needs to be included in the transition times, typically the DTSTART value of the (first recurring) event :param last_date: the last datetime that needs to included, typically the end of the (very last) event (of a recursion set) :returns: timezone information we currently have a problem here: pytz.timezones only carry the absolute dates of time zone transitions, not their RRULEs. This will a) make for rather bloated VTIMEZONE components, especially for long recurring events, b) we'll need to specify for which time range this VTIMEZONE should be generated and c) will not be valid for recurring events that go into eternity. Possible Solutions: As this information is not provided by pytz at all, there is no easy solution, we'd really need to ship another version of the OLSON DB. """ if isinstance(tz, StaticTzInfo): return _create_timezone_static(tz) # TODO last_date = None, recurring to infinity first_date = dt.datetime.today() if not first_date else to_naive_utc(first_date) last_date = first_date + dt.timedelta(days=1) if not last_date else to_naive_utc(last_date) timezone = icalendar.Timezone() timezone.add('TZID', tz) dst = { one[2]: 'DST' in two.__repr__() > for one, two in iter(tz._tzinfos.items()) # type: ignore } E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute '_tzinfos' khal/khalendar/event.py:903: AttributeError ________________ test_remove_existing_location_if_set_to_empty _________________ def test_remove_existing_location_if_set_to_empty(): event = Event.fromString(_get_text('event_dt_simple_updated'), **EVENT_KWARGS) event.update_location('') > assert 'LOCATION' not in event.raw tests/event_test.py:127: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/event.py:385: in raw timezone = create_timezone(tzinfo, self.start) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tz = zoneinfo.ZoneInfo(key='Europe/Berlin') first_date = datetime.datetime(2014, 4, 9, 7, 30) last_date = datetime.datetime(2014, 4, 10, 7, 30) def create_timezone( tz: pytz.BaseTzInfo, first_date: Optional[dt.datetime]=None, last_date: Optional[dt.datetime]=None ) -> icalendar.Timezone: """ create an icalendar vtimezone from a pytz.tzinfo object :param tz: the timezone :param first_date: the very first datetime that needs to be included in the transition times, typically the DTSTART value of the (first recurring) event :param last_date: the last datetime that needs to included, typically the end of the (very last) event (of a recursion set) :returns: timezone information we currently have a problem here: pytz.timezones only carry the absolute dates of time zone transitions, not their RRULEs. This will a) make for rather bloated VTIMEZONE components, especially for long recurring events, b) we'll need to specify for which time range this VTIMEZONE should be generated and c) will not be valid for recurring events that go into eternity. Possible Solutions: As this information is not provided by pytz at all, there is no easy solution, we'd really need to ship another version of the OLSON DB. """ if isinstance(tz, StaticTzInfo): return _create_timezone_static(tz) # TODO last_date = None, recurring to infinity first_date = dt.datetime.today() if not first_date else to_naive_utc(first_date) last_date = first_date + dt.timedelta(days=1) if not last_date else to_naive_utc(last_date) timezone = icalendar.Timezone() timezone.add('TZID', tz) dst = { one[2]: 'DST' in two.__repr__() > for one, two in iter(tz._tzinfos.items()) # type: ignore } E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute '_tzinfos' khal/khalendar/event.py:903: AttributeError _______________ test_remove_existing_description_if_set_to_empty _______________ def test_remove_existing_description_if_set_to_empty(): event = Event.fromString(_get_text('event_dt_simple_updated'), **EVENT_KWARGS) event.update_description('') > assert 'DESCRIPTION' not in event.raw tests/event_test.py:133: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/event.py:385: in raw timezone = create_timezone(tzinfo, self.start) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tz = zoneinfo.ZoneInfo(key='Europe/Berlin') first_date = datetime.datetime(2014, 4, 9, 7, 30) last_date = datetime.datetime(2014, 4, 10, 7, 30) def create_timezone( tz: pytz.BaseTzInfo, first_date: Optional[dt.datetime]=None, last_date: Optional[dt.datetime]=None ) -> icalendar.Timezone: """ create an icalendar vtimezone from a pytz.tzinfo object :param tz: the timezone :param first_date: the very first datetime that needs to be included in the transition times, typically the DTSTART value of the (first recurring) event :param last_date: the last datetime that needs to included, typically the end of the (very last) event (of a recursion set) :returns: timezone information we currently have a problem here: pytz.timezones only carry the absolute dates of time zone transitions, not their RRULEs. This will a) make for rather bloated VTIMEZONE components, especially for long recurring events, b) we'll need to specify for which time range this VTIMEZONE should be generated and c) will not be valid for recurring events that go into eternity. Possible Solutions: As this information is not provided by pytz at all, there is no easy solution, we'd really need to ship another version of the OLSON DB. """ if isinstance(tz, StaticTzInfo): return _create_timezone_static(tz) # TODO last_date = None, recurring to infinity first_date = dt.datetime.today() if not first_date else to_naive_utc(first_date) last_date = first_date + dt.timedelta(days=1) if not last_date else to_naive_utc(last_date) timezone = icalendar.Timezone() timezone.add('TZID', tz) dst = { one[2]: 'DST' in two.__repr__() > for one, two in iter(tz._tzinfos.items()) # type: ignore } E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute '_tzinfos' khal/khalendar/event.py:903: AttributeError ___________________ test_remove_existing_url_if_set_to_empty ___________________ def test_remove_existing_url_if_set_to_empty(): event = Event.fromString(_get_text('event_dt_url'), **EVENT_KWARGS) event.update_url('') > assert 'URL' not in event.raw tests/event_test.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/event.py:385: in raw timezone = create_timezone(tzinfo, self.start) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tz = zoneinfo.ZoneInfo(key='Europe/Berlin') first_date = datetime.datetime(2014, 4, 9, 7, 30) last_date = datetime.datetime(2014, 4, 10, 7, 30) def create_timezone( tz: pytz.BaseTzInfo, first_date: Optional[dt.datetime]=None, last_date: Optional[dt.datetime]=None ) -> icalendar.Timezone: """ create an icalendar vtimezone from a pytz.tzinfo object :param tz: the timezone :param first_date: the very first datetime that needs to be included in the transition times, typically the DTSTART value of the (first recurring) event :param last_date: the last datetime that needs to included, typically the end of the (very last) event (of a recursion set) :returns: timezone information we currently have a problem here: pytz.timezones only carry the absolute dates of time zone transitions, not their RRULEs. This will a) make for rather bloated VTIMEZONE components, especially for long recurring events, b) we'll need to specify for which time range this VTIMEZONE should be generated and c) will not be valid for recurring events that go into eternity. Possible Solutions: As this information is not provided by pytz at all, there is no easy solution, we'd really need to ship another version of the OLSON DB. """ if isinstance(tz, StaticTzInfo): return _create_timezone_static(tz) # TODO last_date = None, recurring to infinity first_date = dt.datetime.today() if not first_date else to_naive_utc(first_date) last_date = first_date + dt.timedelta(days=1) if not last_date else to_naive_utc(last_date) timezone = icalendar.Timezone() timezone.add('TZID', tz) dst = { one[2]: 'DST' in two.__repr__() > for one, two in iter(tz._tzinfos.items()) # type: ignore } E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute '_tzinfos' khal/khalendar/event.py:903: AttributeError ________________________ test_update_remove_categories _________________________ def test_update_remove_categories(): event = Event.fromString(_get_text('event_dt_simple_updated'), **EVENT_KWARGS) event_nocat = Event.fromString(_get_text('event_dt_simple_nocat'), **EVENT_KWARGS) event.update_categories([]) > assert normalize_component(event.raw) == normalize_component(event_nocat.raw) tests/event_test.py:146: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/event.py:385: in raw timezone = create_timezone(tzinfo, self.start) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tz = zoneinfo.ZoneInfo(key='Europe/Berlin') first_date = datetime.datetime(2014, 4, 9, 7, 30) last_date = datetime.datetime(2014, 4, 10, 7, 30) def create_timezone( tz: pytz.BaseTzInfo, first_date: Optional[dt.datetime]=None, last_date: Optional[dt.datetime]=None ) -> icalendar.Timezone: """ create an icalendar vtimezone from a pytz.tzinfo object :param tz: the timezone :param first_date: the very first datetime that needs to be included in the transition times, typically the DTSTART value of the (first recurring) event :param last_date: the last datetime that needs to included, typically the end of the (very last) event (of a recursion set) :returns: timezone information we currently have a problem here: pytz.timezones only carry the absolute dates of time zone transitions, not their RRULEs. This will a) make for rather bloated VTIMEZONE components, especially for long recurring events, b) we'll need to specify for which time range this VTIMEZONE should be generated and c) will not be valid for recurring events that go into eternity. Possible Solutions: As this information is not provided by pytz at all, there is no easy solution, we'd really need to ship another version of the OLSON DB. """ if isinstance(tz, StaticTzInfo): return _create_timezone_static(tz) # TODO last_date = None, recurring to infinity first_date = dt.datetime.today() if not first_date else to_naive_utc(first_date) last_date = first_date + dt.timedelta(days=1) if not last_date else to_naive_utc(last_date) timezone = icalendar.Timezone() timezone.add('TZID', tz) dst = { one[2]: 'DST' in two.__repr__() > for one, two in iter(tz._tzinfos.items()) # type: ignore } E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute '_tzinfos' khal/khalendar/event.py:903: AttributeError _____________________________ test_transform_event _____________________________ def test_transform_event(): """test if transformation between different event types works""" event_d = _get_text('event_d') event = Event.fromString(event_d, **EVENT_KWARGS) assert isinstance(event, AllDayEvent) start = BERLIN.localize(dt.datetime(2014, 4, 9, 9, 30)) end = BERLIN.localize(dt.datetime(2014, 4, 9, 10, 30)) event.update_start_end(start, end) assert isinstance(event, LocalizedEvent) assert event.format(LIST_FORMAT, dt.date(2014, 4, 9)) == '09:30-10:30 An Event\x1b[0m' assert event.format(SEARCH_FORMAT, dt.date(2014, 4, 9)) == \ '09.04.2014 09:30-10:30 An Event\x1b[0m' analog_event = Event.fromString(_get_text('event_dt_simple'), **EVENT_KWARGS) > assert normalize_component(event.raw) == normalize_component(analog_event.raw) tests/event_test.py:184: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/event.py:385: in raw timezone = create_timezone(tzinfo, self.start) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tz = zoneinfo.ZoneInfo(key='Europe/Berlin') first_date = datetime.datetime(2014, 4, 9, 7, 30) last_date = datetime.datetime(2014, 4, 10, 7, 30) def create_timezone( tz: pytz.BaseTzInfo, first_date: Optional[dt.datetime]=None, last_date: Optional[dt.datetime]=None ) -> icalendar.Timezone: """ create an icalendar vtimezone from a pytz.tzinfo object :param tz: the timezone :param first_date: the very first datetime that needs to be included in the transition times, typically the DTSTART value of the (first recurring) event :param last_date: the last datetime that needs to included, typically the end of the (very last) event (of a recursion set) :returns: timezone information we currently have a problem here: pytz.timezones only carry the absolute dates of time zone transitions, not their RRULEs. This will a) make for rather bloated VTIMEZONE components, especially for long recurring events, b) we'll need to specify for which time range this VTIMEZONE should be generated and c) will not be valid for recurring events that go into eternity. Possible Solutions: As this information is not provided by pytz at all, there is no easy solution, we'd really need to ship another version of the OLSON DB. """ if isinstance(tz, StaticTzInfo): return _create_timezone_static(tz) # TODO last_date = None, recurring to infinity first_date = dt.datetime.today() if not first_date else to_naive_utc(first_date) last_date = first_date + dt.timedelta(days=1) if not last_date else to_naive_utc(last_date) timezone = icalendar.Timezone() timezone.add('TZID', tz) dst = { one[2]: 'DST' in two.__repr__() > for one, two in iter(tz._tzinfos.items()) # type: ignore } E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute '_tzinfos' khal/khalendar/event.py:903: AttributeError ________________________________ test_dt_two_tz ________________________________ def test_dt_two_tz(): event_dt_two_tz = _get_text('event_dt_two_tz') cal_dt_two_tz = _get_text('cal_dt_two_tz') event = Event.fromString(event_dt_two_tz, **EVENT_KWARGS) with freeze_time('2016-02-16 12:00:00'): > assert normalize_component(cal_dt_two_tz) == normalize_component(event.raw) tests/event_test.py:222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/event.py:385: in raw timezone = create_timezone(tzinfo, self.start) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tz = zoneinfo.ZoneInfo(key='Europe/Berlin') first_date = datetime.datetime(2014, 4, 9, 7, 30) last_date = datetime.datetime(2014, 4, 10, 7, 30) def create_timezone( tz: pytz.BaseTzInfo, first_date: Optional[dt.datetime]=None, last_date: Optional[dt.datetime]=None ) -> icalendar.Timezone: """ create an icalendar vtimezone from a pytz.tzinfo object :param tz: the timezone :param first_date: the very first datetime that needs to be included in the transition times, typically the DTSTART value of the (first recurring) event :param last_date: the last datetime that needs to included, typically the end of the (very last) event (of a recursion set) :returns: timezone information we currently have a problem here: pytz.timezones only carry the absolute dates of time zone transitions, not their RRULEs. This will a) make for rather bloated VTIMEZONE components, especially for long recurring events, b) we'll need to specify for which time range this VTIMEZONE should be generated and c) will not be valid for recurring events that go into eternity. Possible Solutions: As this information is not provided by pytz at all, there is no easy solution, we'd really need to ship another version of the OLSON DB. """ if isinstance(tz, StaticTzInfo): return _create_timezone_static(tz) # TODO last_date = None, recurring to infinity first_date = dt.datetime.today() if not first_date else to_naive_utc(first_date) last_date = first_date + dt.timedelta(days=1) if not last_date else to_naive_utc(last_date) timezone = icalendar.Timezone() timezone.add('TZID', tz) dst = { one[2]: 'DST' in two.__repr__() > for one, two in iter(tz._tzinfos.items()) # type: ignore } E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute '_tzinfos' khal/khalendar/event.py:903: AttributeError ______________________________ test_event_no_dst _______________________________ def test_event_no_dst(): """test the creation of a corect VTIMEZONE for timezones with no dst""" event_no_dst = _get_text('event_no_dst') cal_no_dst = _get_text('cal_no_dst') event = Event.fromString(event_no_dst, calendar='foobar', locale=LOCALE_BOGOTA) if version.parse(pytz.__version__) > version.Version('2017.1'): cal_no_dst = cal_no_dst.replace( 'TZNAME:COT', 'RDATE:20380118T221407\r\nTZNAME:-05' ) > assert normalize_component(event.raw) == normalize_component(cal_no_dst) tests/event_test.py:364: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/event.py:385: in raw timezone = create_timezone(tzinfo, self.start) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tz = zoneinfo.ZoneInfo(key='America/Bogota') first_date = datetime.datetime(2014, 4, 9, 14, 30) last_date = datetime.datetime(2014, 4, 10, 14, 30) def create_timezone( tz: pytz.BaseTzInfo, first_date: Optional[dt.datetime]=None, last_date: Optional[dt.datetime]=None ) -> icalendar.Timezone: """ create an icalendar vtimezone from a pytz.tzinfo object :param tz: the timezone :param first_date: the very first datetime that needs to be included in the transition times, typically the DTSTART value of the (first recurring) event :param last_date: the last datetime that needs to included, typically the end of the (very last) event (of a recursion set) :returns: timezone information we currently have a problem here: pytz.timezones only carry the absolute dates of time zone transitions, not their RRULEs. This will a) make for rather bloated VTIMEZONE components, especially for long recurring events, b) we'll need to specify for which time range this VTIMEZONE should be generated and c) will not be valid for recurring events that go into eternity. Possible Solutions: As this information is not provided by pytz at all, there is no easy solution, we'd really need to ship another version of the OLSON DB. """ if isinstance(tz, StaticTzInfo): return _create_timezone_static(tz) # TODO last_date = None, recurring to infinity first_date = dt.datetime.today() if not first_date else to_naive_utc(first_date) last_date = first_date + dt.timedelta(days=1) if not last_date else to_naive_utc(last_date) timezone = icalendar.Timezone() timezone.add('TZID', tz) dst = { one[2]: 'DST' in two.__repr__() > for one, two in iter(tz._tzinfos.items()) # type: ignore } E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute '_tzinfos' khal/khalendar/event.py:903: AttributeError ______________________________ test_event_raw_UTC ______________________________ def test_event_raw_UTC(): """test .raw() on events which are localized in UTC""" event_utc = _get_text('event_dt_simple_zulu') event = Event.fromString(event_utc, **EVENT_KWARGS) assert event.raw == '\r\n'.join([ '''BEGIN:VCALENDAR''', '''VERSION:2.0''', '''PRODID:-//PIMUTILS.ORG//NONSGML khal / icalendar //EN''', '''BEGIN:VEVENT''', '''SUMMARY:An Event''', '''DTSTART:20140409T093000Z''', '''DTEND:20140409T103000Z''', '''DTSTAMP:20140401T234817Z''', '''UID:V042MJ8B3SJNFXQOJL6P53OFMHJE8Z3VZWOU''', '''END:VEVENT''', > '''END:VCALENDAR\r\n''']) tests/event_test.py:384: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/event.py:385: in raw timezone = create_timezone(tzinfo, self.start) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tz = zoneinfo.ZoneInfo(key='UTC') first_date = datetime.datetime(2014, 4, 9, 9, 30) last_date = datetime.datetime(2014, 4, 10, 9, 30) def create_timezone( tz: pytz.BaseTzInfo, first_date: Optional[dt.datetime]=None, last_date: Optional[dt.datetime]=None ) -> icalendar.Timezone: """ create an icalendar vtimezone from a pytz.tzinfo object :param tz: the timezone :param first_date: the very first datetime that needs to be included in the transition times, typically the DTSTART value of the (first recurring) event :param last_date: the last datetime that needs to included, typically the end of the (very last) event (of a recursion set) :returns: timezone information we currently have a problem here: pytz.timezones only carry the absolute dates of time zone transitions, not their RRULEs. This will a) make for rather bloated VTIMEZONE components, especially for long recurring events, b) we'll need to specify for which time range this VTIMEZONE should be generated and c) will not be valid for recurring events that go into eternity. Possible Solutions: As this information is not provided by pytz at all, there is no easy solution, we'd really need to ship another version of the OLSON DB. """ if isinstance(tz, StaticTzInfo): return _create_timezone_static(tz) # TODO last_date = None, recurring to infinity first_date = dt.datetime.today() if not first_date else to_naive_utc(first_date) last_date = first_date + dt.timedelta(days=1) if not last_date else to_naive_utc(last_date) timezone = icalendar.Timezone() timezone.add('TZID', tz) dst = { one[2]: 'DST' in two.__repr__() > for one, two in iter(tz._tzinfos.items()) # type: ignore } E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute '_tzinfos' khal/khalendar/event.py:903: AttributeError ________________________________ test_multi_uid ________________________________ def test_multi_uid(): """test for support for events with consist of several sub events with the same uid""" orig_event_str = _get_text('event_rrule_recuid') event = Event.fromString(orig_event_str, **EVENT_KWARGS) for line in orig_event_str.split('\n'): > assert line in event.raw.split('\r\n') tests/event_test.py:406: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/event.py:385: in raw timezone = create_timezone(tzinfo, self.start) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tz = zoneinfo.ZoneInfo(key='Europe/Berlin') first_date = datetime.datetime(2014, 6, 30, 5, 0) last_date = datetime.datetime(2014, 7, 1, 5, 0) def create_timezone( tz: pytz.BaseTzInfo, first_date: Optional[dt.datetime]=None, last_date: Optional[dt.datetime]=None ) -> icalendar.Timezone: """ create an icalendar vtimezone from a pytz.tzinfo object :param tz: the timezone :param first_date: the very first datetime that needs to be included in the transition times, typically the DTSTART value of the (first recurring) event :param last_date: the last datetime that needs to included, typically the end of the (very last) event (of a recursion set) :returns: timezone information we currently have a problem here: pytz.timezones only carry the absolute dates of time zone transitions, not their RRULEs. This will a) make for rather bloated VTIMEZONE components, especially for long recurring events, b) we'll need to specify for which time range this VTIMEZONE should be generated and c) will not be valid for recurring events that go into eternity. Possible Solutions: As this information is not provided by pytz at all, there is no easy solution, we'd really need to ship another version of the OLSON DB. """ if isinstance(tz, StaticTzInfo): return _create_timezone_static(tz) # TODO last_date = None, recurring to infinity first_date = dt.datetime.today() if not first_date else to_naive_utc(first_date) last_date = first_date + dt.timedelta(days=1) if not last_date else to_naive_utc(last_date) timezone = icalendar.Timezone() timezone.add('TZID', tz) dst = { one[2]: 'DST' in two.__repr__() > for one, two in iter(tz._tzinfos.items()) # type: ignore } E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute '_tzinfos' khal/khalendar/event.py:903: AttributeError _______________________ test_remove_instance_from_recuid _______________________ def test_remove_instance_from_recuid(): """remove an istance from an event which is specified via an additional VEVENT with the same UID (which we call `recuid` here""" event = Event.fromString(_get_text('event_rrule_recuid'), **EVENT_KWARGS) > assert event.raw.split('\r\n').count('UID:event_rrule_recurrence_id') == 2 tests/event_test.py:469: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/event.py:385: in raw timezone = create_timezone(tzinfo, self.start) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tz = zoneinfo.ZoneInfo(key='Europe/Berlin') first_date = datetime.datetime(2014, 6, 30, 5, 0) last_date = datetime.datetime(2014, 7, 1, 5, 0) def create_timezone( tz: pytz.BaseTzInfo, first_date: Optional[dt.datetime]=None, last_date: Optional[dt.datetime]=None ) -> icalendar.Timezone: """ create an icalendar vtimezone from a pytz.tzinfo object :param tz: the timezone :param first_date: the very first datetime that needs to be included in the transition times, typically the DTSTART value of the (first recurring) event :param last_date: the last datetime that needs to included, typically the end of the (very last) event (of a recursion set) :returns: timezone information we currently have a problem here: pytz.timezones only carry the absolute dates of time zone transitions, not their RRULEs. This will a) make for rather bloated VTIMEZONE components, especially for long recurring events, b) we'll need to specify for which time range this VTIMEZONE should be generated and c) will not be valid for recurring events that go into eternity. Possible Solutions: As this information is not provided by pytz at all, there is no easy solution, we'd really need to ship another version of the OLSON DB. """ if isinstance(tz, StaticTzInfo): return _create_timezone_static(tz) # TODO last_date = None, recurring to infinity first_date = dt.datetime.today() if not first_date else to_naive_utc(first_date) last_date = first_date + dt.timedelta(days=1) if not last_date else to_naive_utc(last_date) timezone = icalendar.Timezone() timezone.add('TZID', tz) dst = { one[2]: 'DST' in two.__repr__() > for one, two in iter(tz._tzinfos.items()) # type: ignore } E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute '_tzinfos' khal/khalendar/event.py:903: AttributeError ________________________________ test_split_ics ________________________________ def test_split_ics(): cal = _get_text('cal_lots_of_timezones') > vevents = split_ics(cal) tests/icalendar_test.py:55: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ics = 'BEGIN:VCALENDAR\nVERSION:2.0\nPRODID:-//PIMUTILS.ORG//NONSGML khal / icalendar //EN\nBEGIN:VTIMEZONE\nTZID:IndianReun...nDTSTAMP:20140401T234817Z\nUID:abcde\nRECURRENCE-ID;TZID=Europe_Amsterdam:20140707T070000\nEND:VEVENT\nEND:VCALENDAR\n' random_uid = False, default_timezone = None def split_ics(ics: str, random_uid: bool=False, default_timezone=None): """split an ics string into several according to VEVENT's UIDs and sort the right VTIMEZONEs accordingly ignores all other ics components :param random_uid: assign random uids to all events :rtype list: """ cal = cal_from_ics(ics) tzs = {} events_grouped = defaultdict(list) for item in cal.walk(): # Since some events could have a Windows format timezone (e.g. 'New Zealand # Standard Time' for 'Pacific/Auckland' in Olson format), we convert any # Windows format timezones to Olson. if item.name == 'VTIMEZONE': > if item['TZID'] in icalendar.windows_to_olson.WINDOWS_TO_OLSON: E AttributeError: module 'icalendar' has no attribute 'windows_to_olson' khal/icalendar.py:59: AttributeError __________________________ test_split_ics_random_uid ___________________________ def test_split_ics_random_uid(): random.seed(123) cal = _get_text('cal_lots_of_timezones') > vevents = split_ics(cal, random_uid=True) tests/icalendar_test.py:73: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ics = 'BEGIN:VCALENDAR\nVERSION:2.0\nPRODID:-//PIMUTILS.ORG//NONSGML khal / icalendar //EN\nBEGIN:VTIMEZONE\nTZID:IndianReun...nDTSTAMP:20140401T234817Z\nUID:abcde\nRECURRENCE-ID;TZID=Europe_Amsterdam:20140707T070000\nEND:VEVENT\nEND:VCALENDAR\n' random_uid = True, default_timezone = None def split_ics(ics: str, random_uid: bool=False, default_timezone=None): """split an ics string into several according to VEVENT's UIDs and sort the right VTIMEZONEs accordingly ignores all other ics components :param random_uid: assign random uids to all events :rtype list: """ cal = cal_from_ics(ics) tzs = {} events_grouped = defaultdict(list) for item in cal.walk(): # Since some events could have a Windows format timezone (e.g. 'New Zealand # Standard Time' for 'Pacific/Auckland' in Olson format), we convert any # Windows format timezones to Olson. if item.name == 'VTIMEZONE': > if item['TZID'] in icalendar.windows_to_olson.WINDOWS_TO_OLSON: E AttributeError: module 'icalendar' has no attribute 'windows_to_olson' khal/icalendar.py:59: AttributeError ____________________________ test_windows_timezone _____________________________ caplog = <_pytest.logging.LogCaptureFixture object at 0xf4acbbb0> def test_windows_timezone(caplog): """Test if a windows tz format works""" cal = _get_text("tz_windows_format") > split_ics(cal) tests/icalendar_test.py:105: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ics = 'BEGIN:VCALENDAR\nVERSION:2.0\nPRODID:-//PIMUTILS.ORG//NONSGML khal / icalendar //EN\nBEGIN:VTIMEZONE\nTZID:New Zealan...DTSTAMP;VALUE=DATE-TIME:20191105T094904Z\nUID:PERSOYPOYGVR55JMICVAFVDWWBIKPC9PTAG6SN4B2YT\nEND:VEVENT\nEND:VCALENDAR\n' random_uid = False, default_timezone = None def split_ics(ics: str, random_uid: bool=False, default_timezone=None): """split an ics string into several according to VEVENT's UIDs and sort the right VTIMEZONEs accordingly ignores all other ics components :param random_uid: assign random uids to all events :rtype list: """ cal = cal_from_ics(ics) tzs = {} events_grouped = defaultdict(list) for item in cal.walk(): # Since some events could have a Windows format timezone (e.g. 'New Zealand # Standard Time' for 'Pacific/Auckland' in Olson format), we convert any # Windows format timezones to Olson. if item.name == 'VTIMEZONE': > if item['TZID'] in icalendar.windows_to_olson.WINDOWS_TO_OLSON: E AttributeError: module 'icalendar' has no attribute 'windows_to_olson' khal/icalendar.py:59: AttributeError __________________________ TestCollection.test_insert __________________________ self = coll_vdirs = (, {"Dad's calendar": , 'private': }) def test_insert(self, coll_vdirs): """insert a localized event""" coll, vdirs = coll_vdirs > coll.insert( Event.fromString(_get_text('event_dt_simple'), calendar=cal1, locale=LOCALE_BERLIN), cal1) tests/khalendar_test.py:171: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/khalendar.py:224: in insert event.href, event.etag = self._storages[calendar].upload(event) khal/khalendar/vdir.py:210: in upload if not isinstance(item.raw, str): khal/khalendar/event.py:385: in raw timezone = create_timezone(tzinfo, self.start) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tz = zoneinfo.ZoneInfo(key='Europe/Berlin') first_date = datetime.datetime(2014, 4, 9, 7, 30) last_date = datetime.datetime(2014, 4, 10, 7, 30) def create_timezone( tz: pytz.BaseTzInfo, first_date: Optional[dt.datetime]=None, last_date: Optional[dt.datetime]=None ) -> icalendar.Timezone: """ create an icalendar vtimezone from a pytz.tzinfo object :param tz: the timezone :param first_date: the very first datetime that needs to be included in the transition times, typically the DTSTART value of the (first recurring) event :param last_date: the last datetime that needs to included, typically the end of the (very last) event (of a recursion set) :returns: timezone information we currently have a problem here: pytz.timezones only carry the absolute dates of time zone transitions, not their RRULEs. This will a) make for rather bloated VTIMEZONE components, especially for long recurring events, b) we'll need to specify for which time range this VTIMEZONE should be generated and c) will not be valid for recurring events that go into eternity. Possible Solutions: As this information is not provided by pytz at all, there is no easy solution, we'd really need to ship another version of the OLSON DB. """ if isinstance(tz, StaticTzInfo): return _create_timezone_static(tz) # TODO last_date = None, recurring to infinity first_date = dt.datetime.today() if not first_date else to_naive_utc(first_date) last_date = first_date + dt.timedelta(days=1) if not last_date else to_naive_utc(last_date) timezone = icalendar.Timezone() timezone.add('TZID', tz) dst = { one[2]: 'DST' in two.__repr__() > for one, two in iter(tz._tzinfos.items()) # type: ignore } E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute '_tzinfos' khal/khalendar/event.py:903: AttributeError ___________________________ TestCollection.test_get ____________________________ self = coll_vdirs = (, {"Dad's calendar": , 'private': }) def test_get(self, coll_vdirs): """test getting an event by its href""" coll, vdirs = coll_vdirs event = Event.fromString( _get_text('event_dt_simple'), href='xyz.ics', calendar=cal1, locale=LOCALE_BERLIN, ) > coll.insert(event, cal1) tests/khalendar_test.py:224: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/khalendar.py:224: in insert event.href, event.etag = self._storages[calendar].upload(event) khal/khalendar/vdir.py:210: in upload if not isinstance(item.raw, str): khal/khalendar/event.py:385: in raw timezone = create_timezone(tzinfo, self.start) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tz = zoneinfo.ZoneInfo(key='Europe/Berlin') first_date = datetime.datetime(2014, 4, 9, 7, 30) last_date = datetime.datetime(2014, 4, 10, 7, 30) def create_timezone( tz: pytz.BaseTzInfo, first_date: Optional[dt.datetime]=None, last_date: Optional[dt.datetime]=None ) -> icalendar.Timezone: """ create an icalendar vtimezone from a pytz.tzinfo object :param tz: the timezone :param first_date: the very first datetime that needs to be included in the transition times, typically the DTSTART value of the (first recurring) event :param last_date: the last datetime that needs to included, typically the end of the (very last) event (of a recursion set) :returns: timezone information we currently have a problem here: pytz.timezones only carry the absolute dates of time zone transitions, not their RRULEs. This will a) make for rather bloated VTIMEZONE components, especially for long recurring events, b) we'll need to specify for which time range this VTIMEZONE should be generated and c) will not be valid for recurring events that go into eternity. Possible Solutions: As this information is not provided by pytz at all, there is no easy solution, we'd really need to ship another version of the OLSON DB. """ if isinstance(tz, StaticTzInfo): return _create_timezone_static(tz) # TODO last_date = None, recurring to infinity first_date = dt.datetime.today() if not first_date else to_naive_utc(first_date) last_date = first_date + dt.timedelta(days=1) if not last_date else to_naive_utc(last_date) timezone = icalendar.Timezone() timezone.add('TZID', tz) dst = { one[2]: 'DST' in two.__repr__() > for one, two in iter(tz._tzinfos.items()) # type: ignore } E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute '_tzinfos' khal/khalendar/event.py:903: AttributeError __________________________ TestCollection.test_change __________________________ self = coll_vdirs = (, {"Dad's calendar": , 'private': }) def test_change(self, coll_vdirs): """moving an event from one calendar to another""" coll, vdirs = coll_vdirs event = Event.fromString(_get_text('event_dt_simple'), calendar=cal1, locale=LOCALE_BERLIN) > coll.insert(event, cal1) tests/khalendar_test.py:235: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/khalendar.py:224: in insert event.href, event.etag = self._storages[calendar].upload(event) khal/khalendar/vdir.py:210: in upload if not isinstance(item.raw, str): khal/khalendar/event.py:385: in raw timezone = create_timezone(tzinfo, self.start) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tz = zoneinfo.ZoneInfo(key='Europe/Berlin') first_date = datetime.datetime(2014, 4, 9, 7, 30) last_date = datetime.datetime(2014, 4, 10, 7, 30) def create_timezone( tz: pytz.BaseTzInfo, first_date: Optional[dt.datetime]=None, last_date: Optional[dt.datetime]=None ) -> icalendar.Timezone: """ create an icalendar vtimezone from a pytz.tzinfo object :param tz: the timezone :param first_date: the very first datetime that needs to be included in the transition times, typically the DTSTART value of the (first recurring) event :param last_date: the last datetime that needs to included, typically the end of the (very last) event (of a recursion set) :returns: timezone information we currently have a problem here: pytz.timezones only carry the absolute dates of time zone transitions, not their RRULEs. This will a) make for rather bloated VTIMEZONE components, especially for long recurring events, b) we'll need to specify for which time range this VTIMEZONE should be generated and c) will not be valid for recurring events that go into eternity. Possible Solutions: As this information is not provided by pytz at all, there is no easy solution, we'd really need to ship another version of the OLSON DB. """ if isinstance(tz, StaticTzInfo): return _create_timezone_static(tz) # TODO last_date = None, recurring to infinity first_date = dt.datetime.today() if not first_date else to_naive_utc(first_date) last_date = first_date + dt.timedelta(days=1) if not last_date else to_naive_utc(last_date) timezone = icalendar.Timezone() timezone.add('TZID', tz) dst = { one[2]: 'DST' in two.__repr__() > for one, two in iter(tz._tzinfos.items()) # type: ignore } E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute '_tzinfos' khal/khalendar/event.py:903: AttributeError _______________________ TestCollection.test_update_event _______________________ self = coll_vdirs = (, {"Dad's calendar": , 'private': }) def test_update_event(self, coll_vdirs): """updating one event""" coll, vdirs = coll_vdirs event = Event.fromString( _get_text('event_dt_simple'), calendar=cal1, locale=LOCALE_BERLIN) > coll.insert(event, cal1) tests/khalendar_test.py:249: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/khalendar.py:224: in insert event.href, event.etag = self._storages[calendar].upload(event) khal/khalendar/vdir.py:210: in upload if not isinstance(item.raw, str): khal/khalendar/event.py:385: in raw timezone = create_timezone(tzinfo, self.start) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tz = zoneinfo.ZoneInfo(key='Europe/Berlin') first_date = datetime.datetime(2014, 4, 9, 7, 30) last_date = datetime.datetime(2014, 4, 10, 7, 30) def create_timezone( tz: pytz.BaseTzInfo, first_date: Optional[dt.datetime]=None, last_date: Optional[dt.datetime]=None ) -> icalendar.Timezone: """ create an icalendar vtimezone from a pytz.tzinfo object :param tz: the timezone :param first_date: the very first datetime that needs to be included in the transition times, typically the DTSTART value of the (first recurring) event :param last_date: the last datetime that needs to included, typically the end of the (very last) event (of a recursion set) :returns: timezone information we currently have a problem here: pytz.timezones only carry the absolute dates of time zone transitions, not their RRULEs. This will a) make for rather bloated VTIMEZONE components, especially for long recurring events, b) we'll need to specify for which time range this VTIMEZONE should be generated and c) will not be valid for recurring events that go into eternity. Possible Solutions: As this information is not provided by pytz at all, there is no easy solution, we'd really need to ship another version of the OLSON DB. """ if isinstance(tz, StaticTzInfo): return _create_timezone_static(tz) # TODO last_date = None, recurring to infinity first_date = dt.datetime.today() if not first_date else to_naive_utc(first_date) last_date = first_date + dt.timedelta(days=1) if not last_date else to_naive_utc(last_date) timezone = icalendar.Timezone() timezone.add('TZID', tz) dst = { one[2]: 'DST' in two.__repr__() > for one, two in iter(tz._tzinfos.items()) # type: ignore } E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute '_tzinfos' khal/khalendar/event.py:903: AttributeError __________________________ TestCollection.test_search __________________________ self = coll_vdirs = (, {"Dad's calendar": , 'private': }) def test_search(self, coll_vdirs): coll, vdirs = coll_vdirs assert len(list(coll.search('Event'))) == 0 event = Event.fromString( _get_text('event_dt_simple'), calendar=cal1, locale=LOCALE_BERLIN) > coll.insert(event, cal1) tests/khalendar_test.py:289: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/khalendar.py:224: in insert event.href, event.etag = self._storages[calendar].upload(event) khal/khalendar/vdir.py:210: in upload if not isinstance(item.raw, str): khal/khalendar/event.py:385: in raw timezone = create_timezone(tzinfo, self.start) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tz = zoneinfo.ZoneInfo(key='Europe/Berlin') first_date = datetime.datetime(2014, 4, 9, 7, 30) last_date = datetime.datetime(2014, 4, 10, 7, 30) def create_timezone( tz: pytz.BaseTzInfo, first_date: Optional[dt.datetime]=None, last_date: Optional[dt.datetime]=None ) -> icalendar.Timezone: """ create an icalendar vtimezone from a pytz.tzinfo object :param tz: the timezone :param first_date: the very first datetime that needs to be included in the transition times, typically the DTSTART value of the (first recurring) event :param last_date: the last datetime that needs to included, typically the end of the (very last) event (of a recursion set) :returns: timezone information we currently have a problem here: pytz.timezones only carry the absolute dates of time zone transitions, not their RRULEs. This will a) make for rather bloated VTIMEZONE components, especially for long recurring events, b) we'll need to specify for which time range this VTIMEZONE should be generated and c) will not be valid for recurring events that go into eternity. Possible Solutions: As this information is not provided by pytz at all, there is no easy solution, we'd really need to ship another version of the OLSON DB. """ if isinstance(tz, StaticTzInfo): return _create_timezone_static(tz) # TODO last_date = None, recurring to infinity first_date = dt.datetime.today() if not first_date else to_naive_utc(first_date) last_date = first_date + dt.timedelta(days=1) if not last_date else to_naive_utc(last_date) timezone = icalendar.Timezone() timezone.add('TZID', tz) dst = { one[2]: 'DST' in two.__repr__() > for one, two in iter(tz._tzinfos.items()) # type: ignore } E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute '_tzinfos' khal/khalendar/event.py:903: AttributeError ____________________ TestCollection.test_delete_two_events _____________________ self = coll_vdirs = (, {"Dad's calendar": , 'private': }) sleep_time = 0.011000000000000001 def test_delete_two_events(self, coll_vdirs, sleep_time): """testing if we can delete any of two events in two different calendars with the same filename""" coll, vdirs = coll_vdirs event1 = Event.fromString( _get_text('event_dt_simple'), calendar=cal1, locale=LOCALE_BERLIN) event2 = Event.fromString( _get_text('event_dt_simple'), calendar=cal2, locale=LOCALE_BERLIN) > coll.insert(event1, cal1) tests/khalendar_test.py:330: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/khalendar.py:224: in insert event.href, event.etag = self._storages[calendar].upload(event) khal/khalendar/vdir.py:210: in upload if not isinstance(item.raw, str): khal/khalendar/event.py:385: in raw timezone = create_timezone(tzinfo, self.start) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tz = zoneinfo.ZoneInfo(key='Europe/Berlin') first_date = datetime.datetime(2014, 4, 9, 7, 30) last_date = datetime.datetime(2014, 4, 10, 7, 30) def create_timezone( tz: pytz.BaseTzInfo, first_date: Optional[dt.datetime]=None, last_date: Optional[dt.datetime]=None ) -> icalendar.Timezone: """ create an icalendar vtimezone from a pytz.tzinfo object :param tz: the timezone :param first_date: the very first datetime that needs to be included in the transition times, typically the DTSTART value of the (first recurring) event :param last_date: the last datetime that needs to included, typically the end of the (very last) event (of a recursion set) :returns: timezone information we currently have a problem here: pytz.timezones only carry the absolute dates of time zone transitions, not their RRULEs. This will a) make for rather bloated VTIMEZONE components, especially for long recurring events, b) we'll need to specify for which time range this VTIMEZONE should be generated and c) will not be valid for recurring events that go into eternity. Possible Solutions: As this information is not provided by pytz at all, there is no easy solution, we'd really need to ship another version of the OLSON DB. """ if isinstance(tz, StaticTzInfo): return _create_timezone_static(tz) # TODO last_date = None, recurring to infinity first_date = dt.datetime.today() if not first_date else to_naive_utc(first_date) last_date = first_date + dt.timedelta(days=1) if not last_date else to_naive_utc(last_date) timezone = icalendar.Timezone() timezone.add('TZID', tz) dst = { one[2]: 'DST' in two.__repr__() > for one, two in iter(tz._tzinfos.items()) # type: ignore } E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute '_tzinfos' khal/khalendar/event.py:903: AttributeError ______________________ TestCollection.test_delete_recuid _______________________ self = coll_vdirs = (, {"Dad's calendar": , 'private': }) def test_delete_recuid(self, coll_vdirs: CollVdirType): """Testing if we can delete a recuid (add it to exdate)""" coll, _ = coll_vdirs event_str = _get_text('event_rrule_recuid') event = Event.fromString(event_str, calendar=cal1, locale=LOCALE_BERLIN) > coll.insert(event, cal1) tests/khalendar_test.py:349: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/khalendar.py:224: in insert event.href, event.etag = self._storages[calendar].upload(event) khal/khalendar/vdir.py:210: in upload if not isinstance(item.raw, str): khal/khalendar/event.py:385: in raw timezone = create_timezone(tzinfo, self.start) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tz = zoneinfo.ZoneInfo(key='Europe/Berlin') first_date = datetime.datetime(2014, 6, 30, 5, 0) last_date = datetime.datetime(2014, 7, 1, 5, 0) def create_timezone( tz: pytz.BaseTzInfo, first_date: Optional[dt.datetime]=None, last_date: Optional[dt.datetime]=None ) -> icalendar.Timezone: """ create an icalendar vtimezone from a pytz.tzinfo object :param tz: the timezone :param first_date: the very first datetime that needs to be included in the transition times, typically the DTSTART value of the (first recurring) event :param last_date: the last datetime that needs to included, typically the end of the (very last) event (of a recursion set) :returns: timezone information we currently have a problem here: pytz.timezones only carry the absolute dates of time zone transitions, not their RRULEs. This will a) make for rather bloated VTIMEZONE components, especially for long recurring events, b) we'll need to specify for which time range this VTIMEZONE should be generated and c) will not be valid for recurring events that go into eternity. Possible Solutions: As this information is not provided by pytz at all, there is no easy solution, we'd really need to ship another version of the OLSON DB. """ if isinstance(tz, StaticTzInfo): return _create_timezone_static(tz) # TODO last_date = None, recurring to infinity first_date = dt.datetime.today() if not first_date else to_naive_utc(first_date) last_date = first_date + dt.timedelta(days=1) if not last_date else to_naive_utc(last_date) timezone = icalendar.Timezone() timezone.add('TZID', tz) dst = { one[2]: 'DST' in two.__repr__() > for one, two in iter(tz._tzinfos.items()) # type: ignore } E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute '_tzinfos' khal/khalendar/event.py:903: AttributeError ____________________ TestCollection.test_invalid_timezones _____________________ self = coll_vdirs = (, {"Dad's calendar": , 'private': }) def test_invalid_timezones(self, coll_vdirs): """testing if we can delete any of two events in two different calendars with the same filename""" coll, vdirs = coll_vdirs event = Event.fromString( _get_text('invalid_tzoffset'), calendar=cal1, locale=LOCALE_BERLIN) > coll.insert(event, cal1) tests/khalendar_test.py:374: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/khalendar.py:224: in insert event.href, event.etag = self._storages[calendar].upload(event) khal/khalendar/vdir.py:210: in upload if not isinstance(item.raw, str): khal/khalendar/event.py:385: in raw timezone = create_timezone(tzinfo, self.start) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tz = zoneinfo.ZoneInfo(key='Europe/Berlin') first_date = datetime.datetime(2012, 12, 2, 7, 0) last_date = datetime.datetime(2012, 12, 3, 7, 0) def create_timezone( tz: pytz.BaseTzInfo, first_date: Optional[dt.datetime]=None, last_date: Optional[dt.datetime]=None ) -> icalendar.Timezone: """ create an icalendar vtimezone from a pytz.tzinfo object :param tz: the timezone :param first_date: the very first datetime that needs to be included in the transition times, typically the DTSTART value of the (first recurring) event :param last_date: the last datetime that needs to included, typically the end of the (very last) event (of a recursion set) :returns: timezone information we currently have a problem here: pytz.timezones only carry the absolute dates of time zone transitions, not their RRULEs. This will a) make for rather bloated VTIMEZONE components, especially for long recurring events, b) we'll need to specify for which time range this VTIMEZONE should be generated and c) will not be valid for recurring events that go into eternity. Possible Solutions: As this information is not provided by pytz at all, there is no easy solution, we'd really need to ship another version of the OLSON DB. """ if isinstance(tz, StaticTzInfo): return _create_timezone_static(tz) # TODO last_date = None, recurring to infinity first_date = dt.datetime.today() if not first_date else to_naive_utc(first_date) last_date = first_date + dt.timedelta(days=1) if not last_date else to_naive_utc(last_date) timezone = icalendar.Timezone() timezone.add('TZID', tz) dst = { one[2]: 'DST' in two.__repr__() > for one, two in iter(tz._tzinfos.items()) # type: ignore } E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute '_tzinfos' khal/khalendar/event.py:903: AttributeError ----------------------------- Captured stderr call ----------------------------- warning: Invalid timezone offset encountered, timezone information may be wrong: Offset must be less than 24 hours, was +5328 __________________________ TestExpand.test_expand_dt ___________________________ self = def test_expand_dt(self): vevent = _get_vevent(event_dt) > dtstart = icalendar_helpers.expand(vevent, berlin) tests/khalendar_utils_test.py:316: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/icalendar.py:315: in expand dtstartl = set(rrule) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ date = datetime.datetime(2013, 3, 1, 14, 0) def sanitize_datetime(date): if allday and isinstance(date, dt.datetime): date = date.date() if events_tz is not None: > date = events_tz.localize(date) E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute 'localize' khal/icalendar.py:256: AttributeError __________________________ TestExpand.test_expand_dtb __________________________ self = def test_expand_dtb(self): vevent = _get_vevent(event_dtb) > dtstart = icalendar_helpers.expand(vevent, berlin) tests/khalendar_utils_test.py:324: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/icalendar.py:315: in expand dtstartl = set(rrule) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ date = datetime.datetime(2013, 3, 1, 14, 0) def sanitize_datetime(date): if allday and isinstance(date, dt.datetime): date = date.date() if events_tz is not None: > date = events_tz.localize(date) E AttributeError: '_tzicalvtz' object has no attribute 'localize' khal/icalendar.py:256: AttributeError _________________________ TestExpand.test_expand_dttz __________________________ self = def test_expand_dttz(self): vevent = _get_vevent(event_dttz) > dtstart = icalendar_helpers.expand(vevent, berlin) tests/khalendar_utils_test.py:332: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/icalendar.py:315: in expand dtstartl = set(rrule) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ date = datetime.datetime(2013, 3, 1, 14, 0) def sanitize_datetime(date): if allday and isinstance(date, dt.datetime): date = date.date() if events_tz is not None: > date = events_tz.localize(date) E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute 'localize' khal/icalendar.py:256: AttributeError ____________________ TestExpand.test_expand_invalid_exdate _____________________ self = def test_expand_invalid_exdate(self): """testing if we can expand an event with EXDATEs that do not much its RRULE""" vevent = _get_vevent_file('event_invalid_exdate') > dtstartl = icalendar_helpers.expand(vevent, berlin) tests/khalendar_utils_test.py:363: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/icalendar.py:315: in expand dtstartl = set(rrule) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ date = datetime.datetime(2011, 11, 12, 15, 50) def sanitize_datetime(date): if allday and isinstance(date, dt.datetime): date = date.date() if events_tz is not None: > date = events_tz.localize(date) E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute 'localize' khal/icalendar.py:256: AttributeError ____________________ TestExpandNoRR.test_expand_dtr_exdatez ____________________ self = def test_expand_dtr_exdatez(self): """a recurring event with an EXDATE in Zulu time while DTSTART is localized""" vevent = _get_vevent_file('event_dtr_exdatez') > dtstart = icalendar_helpers.expand(vevent, berlin) tests/khalendar_utils_test.py:442: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/icalendar.py:315: in expand dtstartl = set(rrule) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ date = datetime.datetime(2014, 6, 30, 7, 30) def sanitize_datetime(date): if allday and isinstance(date, dt.datetime): date = date.date() if events_tz is not None: > date = events_tz.localize(date) E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute 'localize' khal/icalendar.py:256: AttributeError _________________________ TestSpecial.test_until_notz __________________________ self = def test_until_notz(self): vevent = _get_vevent(vevent_until_notz) > dtstart = icalendar_helpers.expand(vevent, berlin) tests/khalendar_utils_test.py:593: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/icalendar.py:315: in expand dtstartl = set(rrule) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ date = datetime.datetime(2014, 2, 3, 7, 0) def sanitize_datetime(date): if allday and isinstance(date, dt.datetime): date = date.date() if events_tz is not None: > date = events_tz.localize(date) E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute 'localize' khal/icalendar.py:256: AttributeError _______________________ TestSpecial.test_event_exdate_dt _______________________ self = def test_event_exdate_dt(self): """recurring event, one date excluded via EXCLUDE""" vevent = _get_vevent(event_exdate_dt) > dtstart = icalendar_helpers.expand(vevent, berlin) tests/khalendar_utils_test.py:625: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/icalendar.py:315: in expand dtstartl = set(rrule) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ date = datetime.datetime(2014, 7, 2, 19, 0) def sanitize_datetime(date): if allday and isinstance(date, dt.datetime): date = date.date() if events_tz is not None: > date = events_tz.localize(date) E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute 'localize' khal/icalendar.py:256: AttributeError ______________________ TestSpecial.test_event_exdates_dt _______________________ self = def test_event_exdates_dt(self): """recurring event, two dates excluded via EXCLUDE""" vevent = _get_vevent(event_exdates_dt) > dtstart = icalendar_helpers.expand(vevent, berlin) tests/khalendar_utils_test.py:635: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/icalendar.py:315: in expand dtstartl = set(rrule) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ date = datetime.datetime(2014, 7, 2, 19, 0) def sanitize_datetime(date): if allday and isinstance(date, dt.datetime): date = date.date() if events_tz is not None: > date = events_tz.localize(date) E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute 'localize' khal/icalendar.py:256: AttributeError ______________________ TestSpecial.test_event_exdatesl_dt ______________________ self = def test_event_exdatesl_dt(self): """recurring event, three dates exclude via two EXCLUDEs""" vevent = _get_vevent(event_exdatesl_dt) > dtstart = icalendar_helpers.expand(vevent, berlin) tests/khalendar_utils_test.py:645: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/icalendar.py:315: in expand dtstartl = set(rrule) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ date = datetime.datetime(2014, 7, 2, 19, 0) def sanitize_datetime(date): if allday and isinstance(date, dt.datetime): date = date.date() if events_tz is not None: > date = events_tz.localize(date) E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute 'localize' khal/icalendar.py:256: AttributeError ____________________ TestSpecial.test_event_exdates_remove _____________________ self = def test_event_exdates_remove(self): """check if we can remove one more instance""" vevent = _get_vevent(event_exdatesl_dt) > dtstart = icalendar_helpers.expand(vevent, berlin) tests/khalendar_utils_test.py:655: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/icalendar.py:315: in expand dtstartl = set(rrule) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ date = datetime.datetime(2014, 7, 2, 19, 0) def sanitize_datetime(date): if allday and isinstance(date, dt.datetime): date = date.date() if events_tz is not None: > date = events_tz.localize(date) E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute 'localize' khal/icalendar.py:256: AttributeError ________________ TestSpecial.test_event_dt_rrule_invalid_until2 ________________ self = def test_event_dt_rrule_invalid_until2(self): """same as above, but now dtstart is of type date and until is datetime """ vevent = _get_vevent(_get_text('event_dt_rrule_invalid_until2')) > dtstart = icalendar_helpers.expand(vevent, berlin) tests/khalendar_utils_test.py:681: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/icalendar.py:315: in expand dtstartl = set(rrule) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ date = datetime.datetime(2014, 4, 9, 9, 30) def sanitize_datetime(date): if allday and isinstance(date, dt.datetime): date = date.date() if events_tz is not None: > date = events_tz.localize(date) E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute 'localize' khal/icalendar.py:256: AttributeError _________________________ TestRDate.test_simple_rdate __________________________ self = def test_simple_rdate(self): vevent = _get_vevent(simple_rdate) > dtstart = icalendar_helpers.expand(vevent, berlin) tests/khalendar_utils_test.py:727: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/icalendar.py:335: in expand dtstartl.update(get_dates(vevent, 'RDATE') or ()) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ date = datetime.datetime(2013, 12, 13, 19, 0) def sanitize_datetime(date): if allday and isinstance(date, dt.datetime): date = date.date() if events_tz is not None: > date = events_tz.localize(date) E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute 'localize' khal/icalendar.py:256: AttributeError ________________________ TestRDate.test_rrule_and_rdate ________________________ self = def test_rrule_and_rdate(self): vevent = _get_vevent(rrule_and_rdate) > dtstart = icalendar_helpers.expand(vevent, berlin) tests/khalendar_utils_test.py:732: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/icalendar.py:315: in expand dtstartl = set(rrule) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ date = datetime.datetime(2013, 3, 1, 14, 0) def sanitize_datetime(date): if allday and isinstance(date, dt.datetime): date = date.date() if events_tz is not None: > date = events_tz.localize(date) E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute 'localize' khal/icalendar.py:256: AttributeError _________________________________ test_bogota __________________________________ def test_bogota(): vbogota = [b'BEGIN:VTIMEZONE', b'TZID:America/Bogota', b'BEGIN:STANDARD', b'DTSTART:19930206T230000', b'TZNAME:COT', b'TZOFFSETFROM:-0400', b'TZOFFSETTO:-0500', b'END:STANDARD', b'END:VTIMEZONE', b''] if version.parse(pytz.__version__) > version.Version('2017.1'): vbogota[4] = b'TZNAME:-05' vbogota.insert(4, b'RDATE:20380118T221407') > assert create_timezone(bogota, atime, atime).to_ical().split(b'\r\n') == vbogota E AssertionError: assert [b'BEGIN:VTIM...M:-0400', ...] == [b'BEGIN:VTIM...AME:-05', ...] E E At index 4 diff: b'TZNAME:-05' != b'RDATE:20380118T221407' E Right contains one more item: b'' E Use -v to get more diff tests/vtimezone_test.py:82: AssertionError =============================== warnings summary =============================== tests/backend_test.py:5 /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.13_khal/build/tests/backend_test.py:5: DeprecationWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html import pkg_resources tests/backend_test.py::test_event_rrule_recurrence_id /usr/lib/python3.13/inspect.py:1020: DeprecationWarning: urwid.lcd_display is moved to urwid.display.lcd if ismodule(module) and hasattr(module, '__file__'): tests/backend_test.py::test_event_rrule_recurrence_id /usr/lib/python3.13/inspect.py:1021: DeprecationWarning: urwid.lcd_display is moved to urwid.display.lcd f = module.__file__ tests/backend_test.py::test_event_rrule_recurrence_id /usr/lib/python3.13/inspect.py:922: DeprecationWarning: urwid.lcd_display is moved to urwid.display.lcd if getattr(object, '__file__', None): tests/backend_test.py::test_event_rrule_recurrence_id /usr/lib/python3.13/inspect.py:923: DeprecationWarning: urwid.lcd_display is moved to urwid.display.lcd return object.__file__ tests/backend_test.py::test_event_rrule_recurrence_id /usr/lib/python3.13/inspect.py:1020: DeprecationWarning: urwid.html_fragment is moved to urwid.display.html_fragment if ismodule(module) and hasattr(module, '__file__'): tests/backend_test.py::test_event_rrule_recurrence_id /usr/lib/python3.13/inspect.py:1021: DeprecationWarning: urwid.html_fragment is moved to urwid.display.html_fragment f = module.__file__ tests/backend_test.py::test_event_rrule_recurrence_id /usr/lib/python3.13/inspect.py:922: DeprecationWarning: urwid.html_fragment is moved to urwid.display.html_fragment if getattr(object, '__file__', None): tests/backend_test.py::test_event_rrule_recurrence_id /usr/lib/python3.13/inspect.py:923: DeprecationWarning: urwid.html_fragment is moved to urwid.display.html_fragment return object.__file__ tests/backend_test.py::test_event_rrule_recurrence_id /usr/lib/python3.13/inspect.py:1020: DeprecationWarning: urwid.web_display is moved to urwid.display.web if ismodule(module) and hasattr(module, '__file__'): tests/backend_test.py::test_event_rrule_recurrence_id /usr/lib/python3.13/inspect.py:1021: DeprecationWarning: urwid.web_display is moved to urwid.display.web f = module.__file__ tests/backend_test.py::test_event_rrule_recurrence_id /usr/lib/python3.13/inspect.py:922: DeprecationWarning: urwid.web_display is moved to urwid.display.web if getattr(object, '__file__', None): tests/backend_test.py::test_event_rrule_recurrence_id /usr/lib/python3.13/inspect.py:923: DeprecationWarning: urwid.web_display is moved to urwid.display.web return object.__file__ tests/backend_test.py::test_event_rrule_recurrence_id /usr/lib/python3.13/inspect.py:1020: DeprecationWarning: urwid.monitored_list is moved to urwid.widget.monitored_list if ismodule(module) and hasattr(module, '__file__'): tests/backend_test.py::test_event_rrule_recurrence_id /usr/lib/python3.13/inspect.py:1021: DeprecationWarning: urwid.monitored_list is moved to urwid.widget.monitored_list f = module.__file__ tests/backend_test.py::test_event_rrule_recurrence_id /usr/lib/python3.13/inspect.py:922: DeprecationWarning: urwid.monitored_list is moved to urwid.widget.monitored_list if getattr(object, '__file__', None): tests/backend_test.py::test_event_rrule_recurrence_id /usr/lib/python3.13/inspect.py:923: DeprecationWarning: urwid.monitored_list is moved to urwid.widget.monitored_list return object.__file__ tests/backend_test.py::test_event_rrule_recurrence_id /usr/lib/python3.13/inspect.py:1020: DeprecationWarning: urwid.listbox is moved to urwid.widget.listbox if ismodule(module) and hasattr(module, '__file__'): tests/backend_test.py::test_event_rrule_recurrence_id /usr/lib/python3.13/inspect.py:1021: DeprecationWarning: urwid.listbox is moved to urwid.widget.listbox f = module.__file__ tests/backend_test.py::test_event_rrule_recurrence_id /usr/lib/python3.13/inspect.py:922: DeprecationWarning: urwid.listbox is moved to urwid.widget.listbox if getattr(object, '__file__', None): tests/backend_test.py::test_event_rrule_recurrence_id /usr/lib/python3.13/inspect.py:923: DeprecationWarning: urwid.listbox is moved to urwid.widget.listbox return object.__file__ tests/backend_test.py::test_event_rrule_recurrence_id /usr/lib/python3.13/inspect.py:1020: DeprecationWarning: urwid.treetools is moved to urwid.widget.treetools if ismodule(module) and hasattr(module, '__file__'): tests/backend_test.py::test_event_rrule_recurrence_id /usr/lib/python3.13/inspect.py:1021: DeprecationWarning: urwid.treetools is moved to urwid.widget.treetools f = module.__file__ tests/backend_test.py::test_event_rrule_recurrence_id /usr/lib/python3.13/inspect.py:922: DeprecationWarning: urwid.treetools is moved to urwid.widget.treetools if getattr(object, '__file__', None): tests/backend_test.py::test_event_rrule_recurrence_id /usr/lib/python3.13/inspect.py:923: DeprecationWarning: urwid.treetools is moved to urwid.widget.treetools return object.__file__ tests/backend_test.py: 8 warnings tests/cli_test.py: 1 warning tests/khalendar_test.py: 3 warnings /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.13_khal/build/khal/khalendar/backend.py:517: DeprecationWarning: datetime.datetime.utcfromtimestamp() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.fromtimestamp(timestamp, datetime.UTC). start = pytz.UTC.localize(dt.datetime.utcfromtimestamp(start_timestamp)) tests/backend_test.py: 8 warnings tests/cli_test.py: 1 warning tests/khalendar_test.py: 3 warnings /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.13_khal/build/khal/khalendar/backend.py:518: DeprecationWarning: datetime.datetime.utcfromtimestamp() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.fromtimestamp(timestamp, datetime.UTC). end = pytz.UTC.localize(dt.datetime.utcfromtimestamp(end_timestamp)) tests/backend_test.py: 34 warnings tests/cli_test.py: 2 warnings tests/controller_test.py: 3 warnings tests/khalendar_test.py: 15 warnings /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.13_khal/build/khal/khalendar/backend.py:563: DeprecationWarning: datetime.datetime.utcfromtimestamp() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.fromtimestamp(timestamp, datetime.UTC). start_dt = dt.datetime.utcfromtimestamp(start_s) tests/backend_test.py: 34 warnings tests/cli_test.py: 2 warnings tests/controller_test.py: 3 warnings tests/khalendar_test.py: 15 warnings /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.13_khal/build/khal/khalendar/backend.py:564: DeprecationWarning: datetime.datetime.utcfromtimestamp() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.fromtimestamp(timestamp, datetime.UTC). end_dt = dt.datetime.utcfromtimestamp(end_s) tests/backend_test.py::test_event_recuid_rrule_no_master tests/backend_test.py::test_event_recuid_rrule_no_master tests/cli_test.py::test_import_proper tests/cli_test.py::test_import_invalid_choice_and_prefix tests/cli_test.py::test_edit tests/khalendar_test.py::TestCollection::test_search_recurrence_id_only tests/khalendar_test.py::TestCollection::test_search_recurrence_id_only_multi tests/khalendar_test.py::TestCollection::test_search_recurrence_id_only_multi /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.13_khal/build/khal/khalendar/backend.py:614: DeprecationWarning: datetime.datetime.utcfromtimestamp() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.fromtimestamp(timestamp, datetime.UTC). start = dt.datetime.utcfromtimestamp(start) tests/backend_test.py::test_event_recuid_rrule_no_master tests/backend_test.py::test_event_recuid_rrule_no_master tests/cli_test.py::test_import_proper tests/cli_test.py::test_import_invalid_choice_and_prefix tests/cli_test.py::test_edit tests/khalendar_test.py::TestCollection::test_search_recurrence_id_only tests/khalendar_test.py::TestCollection::test_search_recurrence_id_only_multi tests/khalendar_test.py::TestCollection::test_search_recurrence_id_only_multi /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.13_khal/build/khal/khalendar/backend.py:615: DeprecationWarning: datetime.datetime.utcfromtimestamp() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.fromtimestamp(timestamp, datetime.UTC). end = dt.datetime.utcfromtimestamp(end) tests/cli_test.py: 2 warnings tests/controller_test.py: 3 warnings tests/parse_datetime_test.py: 11 warnings /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.13_khal/build/khal/parse_datetime.py:82: DeprecationWarning: Parsing dates involving a day of month without a year specified is ambiguious and fails to parse leap day. The default behavior will change in Python 3.15 to either always raise an exception or to use a different default year (TBD). To avoid trouble, add a specific year to the input & format. See https://github.com/python/cpython/issues/70647. dtstart_struct = strptime(dtstring, dateformat) tests/cli_test.py::test_edit /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.13_khal/build/khal/khalendar/backend.py:597: DeprecationWarning: datetime.datetime.utcfromtimestamp() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.fromtimestamp(timestamp, datetime.UTC). start = pytz.UTC.localize(dt.datetime.utcfromtimestamp(start)) tests/cli_test.py::test_edit /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.13_khal/build/khal/khalendar/backend.py:598: DeprecationWarning: datetime.datetime.utcfromtimestamp() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.fromtimestamp(timestamp, datetime.UTC). end = pytz.UTC.localize(dt.datetime.utcfromtimestamp(end)) tests/controller_test.py::TestImport::test_mix_datetime_types tests/controller_test.py::TestImport::test_mix_datetime_types /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.13_khal/build/khal/icalendar.py:81: DeprecationWarning: The 'warn' method is deprecated, use 'warning' instead logger.warn(f'Error when trying to import the event {uid}') -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info ============================ FAILED tests/backend_test.py::test_event_rrule_recurrence_id - AttributeError... FAILED tests/backend_test.py::test_event_rrule_recurrence_id_reverse - Attrib... FAILED tests/backend_test.py::test_event_rrule_recurrence_id_update_with_exclude FAILED tests/backend_test.py::test_event_delete - AttributeError: 'zoneinfo.Z... FAILED tests/backend_test.py::test_this_and_prior - AttributeError: 'zoneinfo... FAILED tests/backend_test.py::test_event_rrule_this_and_future - AttributeErr... FAILED tests/backend_test.py::test_event_rrule_this_and_future_multi_day_shift FAILED tests/backend_test.py::test_two_calendars_same_uid - AttributeError: '... FAILED tests/cli_test.py::test_simple - assert not AttributeError("'zoneinfo.... FAILED tests/cli_test.py::test_simple_color - assert not AttributeError("'zon... FAILED tests/cli_test.py::test_days - assert not AttributeError("'zoneinfo.Zo... FAILED tests/cli_test.py::test_notstarted - assert not AttributeError("'zonei... FAILED tests/cli_test.py::test_invalid_calendar - assert not AttributeError("... FAILED tests/cli_test.py::test_list - AssertionError: assert False FAILED tests/cli_test.py::test_search - AssertionError: assert False FAILED tests/cli_test.py::test_import_proper_invalid_timezone - assert not Sy... FAILED tests/cli_test.py::test_edit - assert not AttributeError("'zoneinfo.Zo... FAILED tests/cli_test.py::test_new_interactive - assert not AttributeError("'... FAILED tests/cli_test.py::test_new_interactive_extensive - assert not Attribu... FAILED tests/cli_test.py::test_issue_1056 - assert not AttributeError("'zonei... FAILED tests/controller_test.py::TestImport::test_import - AttributeError: 'z... FAILED tests/controller_test.py::TestImport::test_mix_datetime_types - khal.e... FAILED tests/event_test.py::test_raw_dt - AttributeError: 'zoneinfo.ZoneInfo'... FAILED tests/event_test.py::test_update_simple - AttributeError: 'zoneinfo.Zo... FAILED tests/event_test.py::test_add_url - AttributeError: 'zoneinfo.ZoneInfo... FAILED tests/event_test.py::test_do_not_save_empty_location - AttributeError:... FAILED tests/event_test.py::test_do_not_save_empty_description - AttributeErr... FAILED tests/event_test.py::test_do_not_save_empty_url - AttributeError: 'zon... FAILED tests/event_test.py::test_remove_existing_location_if_set_to_empty - A... FAILED tests/event_test.py::test_remove_existing_description_if_set_to_empty FAILED tests/event_test.py::test_remove_existing_url_if_set_to_empty - Attrib... FAILED tests/event_test.py::test_update_remove_categories - AttributeError: '... FAILED tests/event_test.py::test_transform_event - AttributeError: 'zoneinfo.... FAILED tests/event_test.py::test_dt_two_tz - AttributeError: 'zoneinfo.ZoneIn... FAILED tests/event_test.py::test_event_no_dst - AttributeError: 'zoneinfo.Zon... FAILED tests/event_test.py::test_event_raw_UTC - AttributeError: 'zoneinfo.Zo... FAILED tests/event_test.py::test_multi_uid - AttributeError: 'zoneinfo.ZoneIn... FAILED tests/event_test.py::test_remove_instance_from_recuid - AttributeError... FAILED tests/icalendar_test.py::test_split_ics - AttributeError: module 'ical... FAILED tests/icalendar_test.py::test_split_ics_random_uid - AttributeError: m... FAILED tests/icalendar_test.py::test_windows_timezone - AttributeError: modul... FAILED tests/khalendar_test.py::TestCollection::test_insert - AttributeError:... FAILED tests/khalendar_test.py::TestCollection::test_get - AttributeError: 'z... FAILED tests/khalendar_test.py::TestCollection::test_change - AttributeError:... FAILED tests/khalendar_test.py::TestCollection::test_update_event - Attribute... FAILED tests/khalendar_test.py::TestCollection::test_search - AttributeError:... FAILED tests/khalendar_test.py::TestCollection::test_delete_two_events - Attr... FAILED tests/khalendar_test.py::TestCollection::test_delete_recuid - Attribut... FAILED tests/khalendar_test.py::TestCollection::test_invalid_timezones - Attr... FAILED tests/khalendar_utils_test.py::TestExpand::test_expand_dt - AttributeE... FAILED tests/khalendar_utils_test.py::TestExpand::test_expand_dtb - Attribute... FAILED tests/khalendar_utils_test.py::TestExpand::test_expand_dttz - Attribut... FAILED tests/khalendar_utils_test.py::TestExpand::test_expand_invalid_exdate FAILED tests/khalendar_utils_test.py::TestExpandNoRR::test_expand_dtr_exdatez FAILED tests/khalendar_utils_test.py::TestSpecial::test_until_notz - Attribut... FAILED tests/khalendar_utils_test.py::TestSpecial::test_event_exdate_dt - Att... FAILED tests/khalendar_utils_test.py::TestSpecial::test_event_exdates_dt - At... FAILED tests/khalendar_utils_test.py::TestSpecial::test_event_exdatesl_dt - A... FAILED tests/khalendar_utils_test.py::TestSpecial::test_event_exdates_remove FAILED tests/khalendar_utils_test.py::TestSpecial::test_event_dt_rrule_invalid_until2 FAILED tests/khalendar_utils_test.py::TestRDate::test_simple_rdate - Attribut... FAILED tests/khalendar_utils_test.py::TestRDate::test_rrule_and_rdate - Attri... FAILED tests/vtimezone_test.py::test_bogota - AssertionError: assert [b'BEGIN... ===== 63 failed, 249 passed, 2 xfailed, 1 xpassed, 193 warnings in 30.30s ====== E: pybuild pybuild:389: test: plugin distutils failed with: exit code=1: cd /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.13_khal/build; python3.13 -m pytest tests I: pybuild base:311: cd /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.12_khal/build; python3.12 -m pytest tests ============================= test session starts ============================== platform linux -- Python 3.12.7, pytest-8.3.3, pluggy-1.5.0 rootdir: /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.12_khal/build configfile: pyproject.toml plugins: typeguard-4.4.1, hypothesis-6.116.0 collected 315 items tests/backend_test.py .F.FF...FFFF....F............. [ 9%] tests/cal_display_test.py ......... [ 12%] tests/cli_test.py .FFFF...F.xX.x..FF....F...........F.F.FF. [ 25%] tests/configwizard_test.py .. [ 26%] tests/controller_test.py .....FF..... [ 29%] tests/event_test.py ..F.FF..FFFFFFF...F..F.........FF..F.......F........ [ 46%] .... [ 47%] tests/icalendar_test.py ..FF.F. [ 49%] tests/khalendar_test.py .......F..FFF..F..FFF......... [ 59%] tests/khalendar_utils_test.py FFF....F.....F...F...FFFF.F..FF.......... [ 72%] tests/parse_datetime_test.py ........................................... [ 86%] ..... [ 87%] tests/settings_test.py ............ [ 91%] tests/terminal_test.py ... [ 92%] tests/ui/test_calendarwidget.py ..... [ 93%] tests/ui/test_editor.py .... [ 95%] tests/ui/test_widgets.py . [ 95%] tests/utils_test.py ........ [ 98%] tests/vdir_test.py ... [ 99%] tests/vtimezone_test.py ..F [100%] =================================== FAILURES =================================== ________________________ test_event_rrule_recurrence_id ________________________ def test_event_rrule_recurrence_id(): dbi = backend.SQLiteDb([calname], ':memory:', locale=LOCALE_BERLIN) assert dbi.list(calname) == [] events = dbi.get_localized( BERLIN.localize(dt.datetime(2014, 6, 30, 0, 0)), BERLIN.localize(dt.datetime(2014, 8, 26, 0, 0)), ) assert list(events) == [] > dbi.update(_get_text('event_rrule_recuid'), href='12345.ics', etag='abcd', calendar=calname) tests/backend_test.py:31: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/backend.py:246: in update self._update_impl(vevent, href, calendar) khal/khalendar/backend.py:367: in _update_impl dtstartend = expand_vevent(vevent, href) khal/icalendar.py:315: in expand dtstartl = set(rrule) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ date = datetime.datetime(2014, 6, 30, 7, 0) def sanitize_datetime(date): if allday and isinstance(date, dt.datetime): date = date.date() if events_tz is not None: > date = events_tz.localize(date) E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute 'localize' khal/icalendar.py:256: AttributeError ____________________ test_event_rrule_recurrence_id_reverse ____________________ def test_event_rrule_recurrence_id_reverse(): """as icalendar elements can be saved in arbitrary order, we also have to deal with `reverse` ordered icalendar files """ dbi = backend.SQLiteDb([calname], ':memory:', locale=LOCALE_BERLIN) assert dbi.list(calname) == [] events = dbi.get_localized( BERLIN.localize(dt.datetime(2014, 6, 30, 0, 0)), BERLIN.localize(dt.datetime(2014, 8, 26, 0, 0))) assert list(events) == [] > dbi.update(event_rrule_recurrence_id_reverse, href='12345.ics', etag='abcd', calendar=calname) tests/backend_test.py:104: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/backend.py:246: in update self._update_impl(vevent, href, calendar) khal/khalendar/backend.py:367: in _update_impl dtstartend = expand_vevent(vevent, href) khal/icalendar.py:315: in expand dtstartl = set(rrule) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ date = datetime.datetime(2014, 6, 30, 7, 0) def sanitize_datetime(date): if allday and isinstance(date, dt.datetime): date = date.date() if events_tz is not None: > date = events_tz.localize(date) E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute 'localize' khal/icalendar.py:256: AttributeError ______________ test_event_rrule_recurrence_id_update_with_exclude ______________ def test_event_rrule_recurrence_id_update_with_exclude(): """ test if updates work as they should. The updated event has the extra RECURRENCE-ID event removed and one recurrence date excluded via EXDATE """ dbi = backend.SQLiteDb([calname], ':memory:', locale=LOCALE_BERLIN) > dbi.update(_get_text('event_rrule_recuid'), href='12345.ics', etag='abcd', calendar=calname) tests/backend_test.py:126: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/backend.py:246: in update self._update_impl(vevent, href, calendar) khal/khalendar/backend.py:367: in _update_impl dtstartend = expand_vevent(vevent, href) khal/icalendar.py:315: in expand dtstartl = set(rrule) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ date = datetime.datetime(2014, 6, 30, 7, 0) def sanitize_datetime(date): if allday and isinstance(date, dt.datetime): date = date.date() if events_tz is not None: > date = events_tz.localize(date) E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute 'localize' khal/icalendar.py:256: AttributeError ______________________________ test_event_delete _______________________________ def test_event_delete(): dbi = backend.SQLiteDb([calname], ':memory:', locale=LOCALE_BERLIN) assert dbi.list(calname) == [] events = dbi.get_localized(BERLIN.localize(dt.datetime(2014, 6, 30, 0, 0)), BERLIN.localize(dt.datetime(2014, 8, 26, 0, 0))) assert list(events) == [] > dbi.update(event_rrule_recurrence_id_reverse, href='12345.ics', etag='abcd', calendar=calname) tests/backend_test.py:200: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/backend.py:246: in update self._update_impl(vevent, href, calendar) khal/khalendar/backend.py:367: in _update_impl dtstartend = expand_vevent(vevent, href) khal/icalendar.py:315: in expand dtstartl = set(rrule) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ date = datetime.datetime(2014, 6, 30, 7, 0) def sanitize_datetime(date): if allday and isinstance(date, dt.datetime): date = date.date() if events_tz is not None: > date = events_tz.localize(date) E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute 'localize' khal/icalendar.py:256: AttributeError _____________________________ test_this_and_prior ______________________________ def test_this_and_prior(): """we do not support THISANDPRIOR, therefore this should fail""" dbi = backend.SQLiteDb([calname], ':memory:', locale=LOCALE_BERLIN) with pytest.raises(UpdateFailed): > dbi.update(event_rrule_this_and_prior, href='12345.ics', etag='abcd', calendar=calname) tests/backend_test.py:235: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/backend.py:246: in update self._update_impl(vevent, href, calendar) khal/khalendar/backend.py:367: in _update_impl dtstartend = expand_vevent(vevent, href) khal/icalendar.py:315: in expand dtstartl = set(rrule) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ date = datetime.datetime(2014, 6, 30, 7, 0) def sanitize_datetime(date): if allday and isinstance(date, dt.datetime): date = date.date() if events_tz is not None: > date = events_tz.localize(date) E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute 'localize' khal/icalendar.py:256: AttributeError _______________________ test_event_rrule_this_and_future _______________________ def test_event_rrule_this_and_future(): dbi = backend.SQLiteDb([calname], ':memory:', locale=LOCALE_BERLIN) > dbi.update(event_rrule_this_and_future, href='12345.ics', etag='abcd', calendar=calname) tests/backend_test.py:263: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/backend.py:246: in update self._update_impl(vevent, href, calendar) khal/khalendar/backend.py:367: in _update_impl dtstartend = expand_vevent(vevent, href) khal/icalendar.py:315: in expand dtstartl = set(rrule) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ date = datetime.datetime(2014, 6, 30, 7, 0) def sanitize_datetime(date): if allday and isinstance(date, dt.datetime): date = date.date() if events_tz is not None: > date = events_tz.localize(date) E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute 'localize' khal/icalendar.py:256: AttributeError _______________ test_event_rrule_this_and_future_multi_day_shift _______________ def test_event_rrule_this_and_future_multi_day_shift(): dbi = backend.SQLiteDb([calname], ':memory:', locale=LOCALE_BERLIN) > dbi.update(event_rrule_this_and_future_multi_day_shift, href='12345.ics', etag='abcd', calendar=calname) tests/backend_test.py:295: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/backend.py:246: in update self._update_impl(vevent, href, calendar) khal/khalendar/backend.py:367: in _update_impl dtstartend = expand_vevent(vevent, href) khal/icalendar.py:315: in expand dtstartl = set(rrule) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ date = datetime.datetime(2014, 6, 30, 7, 0) def sanitize_datetime(date): if allday and isinstance(date, dt.datetime): date = date.date() if events_tz is not None: > date = events_tz.localize(date) E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute 'localize' khal/icalendar.py:256: AttributeError _________________________ test_two_calendars_same_uid __________________________ def test_two_calendars_same_uid(): home = 'home' work = 'work' dbi = backend.SQLiteDb([home, work], ':memory:', locale=LOCALE_BERLIN) assert dbi.list(home) == [] assert dbi.list(work) == [] > dbi.update(event_a, href='12345.ics', etag='abcd', calendar=home) tests/backend_test.py:513: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/backend.py:246: in update self._update_impl(vevent, href, calendar) khal/khalendar/backend.py:367: in _update_impl dtstartend = expand_vevent(vevent, href) khal/icalendar.py:315: in expand dtstartl = set(rrule) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ date = datetime.datetime(2014, 6, 30, 7, 0) def sanitize_datetime(date): if allday and isinstance(date, dt.datetime): date = date.date() if events_tz is not None: > date = events_tz.localize(date) E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute 'localize' khal/icalendar.py:256: AttributeError _________________________________ test_simple __________________________________ runner = def test_simple(runner): runner = runner(days=2) result = runner.invoke(main_khal, ['list']) assert not result.exception assert result.output == '' now = dt.datetime.now().strftime('%d.%m.%Y') result = runner.invoke( main_khal, f'new {now} 18:00 myevent'.split()) assert result.output == '' > assert not result.exception E assert not AttributeError("'zoneinfo.ZoneInfo' object has no attribute '_tzinfos'") E + where AttributeError("'zoneinfo.ZoneInfo' object has no attribute '_tzinfos'") = .exception tests/cli_test.py:137: AssertionError ______________________________ test_simple_color _______________________________ runner = def test_simple_color(runner): runner = runner(days=2) now = dt.datetime.now().strftime('%d.%m.%Y') result = runner.invoke(main_khal, f'new {now} 18:00 myevent'.split()) assert result.output == '' > assert not result.exception E assert not AttributeError("'zoneinfo.ZoneInfo' object has no attribute '_tzinfos'") E + where AttributeError("'zoneinfo.ZoneInfo' object has no attribute '_tzinfos'") = .exception tests/cli_test.py:153: AssertionError __________________________________ test_days ___________________________________ runner = def test_days(runner): runner = runner(days=9) when = (dt.datetime.now() + dt.timedelta(days=7)).strftime('%d.%m.%Y') result = runner.invoke(main_khal, f'new {when} 18:00 nextweek'.split()) assert result.output == '' > assert not result.exception E assert not AttributeError("'zoneinfo.ZoneInfo' object has no attribute '_tzinfos'") E + where AttributeError("'zoneinfo.ZoneInfo' object has no attribute '_tzinfos'") = .exception tests/cli_test.py:166: AssertionError _______________________________ test_notstarted ________________________________ runner = def test_notstarted(runner): with freeze_time('2015-6-1 15:00'): runner = runner(days=2) for command in [ 'new 30.5.2015 5.6.2015 long event', 'new 2.6.2015 4.6.2015 two day event', 'new 1.6.2015 14:00 18:00 four hour event', 'new 1.6.2015 16:00 17:00 one hour event', 'new 2.6.2015 10:00 13:00 three hour event', ]: result = runner.invoke(main_khal, command.split()) > assert not result.exception E assert not AttributeError("'zoneinfo.ZoneInfo' object has no attribute '_tzinfos'") E + where AttributeError("'zoneinfo.ZoneInfo' object has no attribute '_tzinfos'") = .exception tests/cli_test.py:191: AssertionError ____________________________ test_invalid_calendar _____________________________ runner = def test_invalid_calendar(runner): runner = runner(days=2) result = runner.invoke( main_khal, ['new'] + '-a one 18:00 myevent'.split()) > assert not result.exception E assert not AttributeError("'zoneinfo.ZoneInfo' object has no attribute '_tzinfos'") E + where AttributeError("'zoneinfo.ZoneInfo' object has no attribute '_tzinfos'") = .exception tests/cli_test.py:314: AssertionError __________________________________ test_list ___________________________________ runner = def test_list(runner): runner = runner(days=2) now = dt.datetime.now().strftime('%d.%m.%Y') result = runner.invoke( main_khal, f'new {now} 18:00 myevent'.split()) format = '{red}{start-end-time-style}{reset} {title} :: {description}' args = ['--color', 'list', '--format', format, '--day-format', 'header', '18:30'] result = runner.invoke(main_khal, args) expected = 'header\x1b[0m\n\x1b[31m18:00-19:00\x1b[0m myevent :: \x1b[0m\n' assert not result.exception > assert result.output.startswith(expected) E AssertionError: assert False E + where False = ('header\x1b[0m\n\x1b[31m18:00-19:00\x1b[0m myevent :: \x1b[0m\n') E + where = ''.startswith E + where '' = .output tests/cli_test.py:414: AssertionError _________________________________ test_search __________________________________ runner = def test_search(runner): runner = runner(days=2) now = dt.datetime.now().strftime('%d.%m.%Y') result = runner.invoke(main_khal, f'new {now} 18:00 myevent'.split()) format = '{red}{start-end-time-style}{reset} {title} :: {description}' result = runner.invoke(main_khal, ['--color', 'search', '--format', format, 'myevent']) assert not result.exception > assert result.output.startswith('\x1b[34m\x1b[31m18:00') E AssertionError: assert False E + where False = ('\x1b[34m\x1b[31m18:00') E + where = ''.startswith E + where '' = .output tests/cli_test.py:424: AssertionError _____________________ test_import_proper_invalid_timezone ______________________ runner = def test_import_proper_invalid_timezone(runner): runner = runner() result = runner.invoke( main_khal, ['import', _get_ics_filepath('invalid_tzoffset')], input='0\ny\n') assert result.output.startswith( 'warning: Invalid timezone offset encountered, timezone information may be wrong') > assert not result.exception E assert not SystemExit(1) E + where SystemExit(1) = .exception tests/cli_test.py:491: AssertionError __________________________________ test_edit ___________________________________ runner = def test_edit(runner): runner = runner() result = runner.invoke(main_khal, ['list']) assert not result.exception assert result.output == '' for name in ['event_dt_simple', 'event_d_15']: cal_dt = _get_text(name) event = runner.calendars['one'].join(f'{name}.ics') event.write(cal_dt) format = '{start-end-time-style}: {title}' result = runner.invoke( main_khal, ['edit', '--show-past', 'Event'], input='s\nGreat Event\nn\nn\n') > assert not result.exception E assert not AttributeError("'zoneinfo.ZoneInfo' object has no attribute '_tzinfos'") E + where AttributeError("'zoneinfo.ZoneInfo' object has no attribute '_tzinfos'") = .exception tests/cli_test.py:819: AssertionError _____________________________ test_new_interactive _____________________________ runner = @freeze_time('2015-6-1 8:00') def test_new_interactive(runner): runner = runner(print_new='path') result = runner.invoke( main_khal, 'new -i'.split(), 'Another event\n13:00 17:00\n\nNone\nn\n' ) > assert not result.exception E assert not AttributeError("'zoneinfo.ZoneInfo' object has no attribute '_tzinfos'") E + where AttributeError("'zoneinfo.ZoneInfo' object has no attribute '_tzinfos'") = .exception tests/cli_test.py:849: AssertionError ________________________ test_new_interactive_extensive ________________________ runner = @freeze_time('2015-6-1 8:00') def test_new_interactive_extensive(runner): runner = runner(print_new='path', default_calendar=False) result = runner.invoke( main_khal, 'new -i 15:00 15:30'.split(), '?\ninvalid\ntwo\n' 'Unicce Name\n' '\n' 'Europe/London\n' 'bar\n' 'l\non a boat\n' 'p\nweekly\n' '1.1.2018\n' 'a\n30m\n' 'c\nwork\n' 'n\n' ) > assert not result.exception E assert not AttributeError("'zoneinfo.ZoneInfo' object has no attribute '_tzinfos'") E + where AttributeError("'zoneinfo.ZoneInfo' object has no attribute '_tzinfos'") = .exception tests/cli_test.py:880: AssertionError _______________________________ test_issue_1056 ________________________________ runner = @freeze_time('2015-6-1 8:00') def test_issue_1056(runner): """if an ansi escape sequence is contained in the output, we can't parse it properly""" runner = runner(print_new='path', default_calendar=False) result = runner.invoke( main_khal, 'new -i'.split(), 'two\n' 'new event\n' 'now\n' 'Europe/London\n' 'None\n' 't\n' # edit datetime range '\n' 'n\n' ) assert 'error parsing range' not in result.output > assert not result.exception E assert not AttributeError("'zoneinfo.ZoneInfo' object has no attribute '_tzinfos'") E + where AttributeError("'zoneinfo.ZoneInfo' object has no attribute '_tzinfos'") = .exception tests/cli_test.py:903: AssertionError ____________________________ TestImport.test_import ____________________________ self = coll_vdirs = (, {"Dad's calendar": , 'private': }) def test_import(self, coll_vdirs): coll, vdirs = coll_vdirs view = {'event_format': '{title}'} conf = {'locale': utils.LOCALE_BERLIN, 'view': view} > import_ics(coll, conf, _get_text('event_rrule_recuid'), batch=True) tests/controller_test.py:100: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/controllers.py:617: in import_ics import_event(vevent, collection, conf['locale'], batch, format, env) khal/controllers.py:665: in import_event collection.insert(Item(vevent), collection=calendar_name) khal/khalendar/khalendar.py:228: in insert self._backend.update(event.raw, event.href, event.etag, calendar=calendar) khal/khalendar/backend.py:246: in update self._update_impl(vevent, href, calendar) khal/khalendar/backend.py:367: in _update_impl dtstartend = expand_vevent(vevent, href) khal/icalendar.py:315: in expand dtstartl = set(rrule) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ date = datetime.datetime(2014, 6, 30, 7, 0) def sanitize_datetime(date): if allday and isinstance(date, dt.datetime): date = date.date() if events_tz is not None: > date = events_tz.localize(date) E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute 'localize' khal/icalendar.py:256: AttributeError ----------------------------- Captured stderr call ----------------------------- warning: Cannot find timezone `Europe/Berlin` in .ics file, this could be a bug, please report this issue at http://github.com/pimutils/khal/. warning: Cannot find timezone `UTC` in .ics file, this could be a bug, please report this issue at http://github.com/pimutils/khal/. ______________________ TestImport.test_mix_datetime_types ______________________ collection = conf = {'locale': {'dateformat': '%d.%m.', 'datetimeformat': '%d.%m. %H:%M', 'default_timezone': , 'firstweekday': 0, ...}, 'view': {'event_format': '{title}'}} ics = 'BEGIN:VCALENDAR\nVERSION:2.0\nPRODID:ownCloud Calendar 0.7.3\nBEGIN:VEVENT\nSUMMARY:Termin:Junghackertag\nURL:http://...DTEND:20150602T160000\nDESCRIPTION:Junghackertag\nDTSTAMP:20150626T182050\nSEQUENCE:10172\nEND:VEVENT\nEND:VCALENDAR\n' batch = True, random_uid = False, format = '{title}', env = None def import_ics(collection, conf, ics, batch=False, random_uid=False, format=None, env=None): """ :param batch: setting this to True will insert without asking for approval, even when an event with the same uid already exists :type batch: bool :param random_uid: whether to assign a random UID to imported events or not :type random_uid: bool :param format: the format string to print events with :type format: str """ if format is None: format = conf['view']['event_format'] try: > vevents = split_ics(ics, random_uid, conf['locale']['default_timezone']) khal/controllers.py:613: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/icalendar.py:86: in split_ics raise saved_exception khal/icalendar.py:79: in split_ics ics = ics_from_list(events, tzs, random_uid, default_timezone) khal/icalendar.py:178: in ics_from_list sub_event = sanitize(sub_event, default_timezone=default_timezone) khal/icalendar.py:406: in sanitize dtstart, dtend = sanitize_timerange( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ dtstart = datetime.datetime(2015, 5, 30, 12, 0) dtend = datetime.datetime(2015, 5, 30, 16, 0, tzinfo=zoneinfo.ZoneInfo(key='Europe/Berlin')) duration = None def sanitize_timerange(dtstart, dtend, duration=None): '''return sensible dtstart and end for events that have an invalid or missing DTEND, assuming the event just lasts one hour.''' if isinstance(dtstart, dt.datetime) and isinstance(dtend, dt.datetime): if dtstart.tzinfo and not dtend.tzinfo: logger.warning( "Event end time has no timezone. " "Assuming it's the same timezone as the start time" ) dtend = dtstart.tzinfo.localize(dtend) if not dtstart.tzinfo and dtend.tzinfo: logger.warning( "Event start time has no timezone. " "Assuming it's the same timezone as the end time" ) > dtstart = dtend.tzinfo.localize(dtstart) E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute 'localize' khal/icalendar.py:431: AttributeError During handling of the above exception, another exception occurred: self = coll_vdirs = (, {"Dad's calendar": , 'private': }) def test_mix_datetime_types(self, coll_vdirs): """ Test importing events with mixed tz-aware and tz-naive datetimes. """ coll, vdirs = coll_vdirs view = {'event_format': '{title}'} > import_ics( coll, {'locale': utils.LOCALE_BERLIN, 'view': view}, _get_text('event_dt_mixed_awareness'), batch=True ) tests/controller_test.py:125: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ collection = conf = {'locale': {'dateformat': '%d.%m.', 'datetimeformat': '%d.%m. %H:%M', 'default_timezone': , 'firstweekday': 0, ...}, 'view': {'event_format': '{title}'}} ics = 'BEGIN:VCALENDAR\nVERSION:2.0\nPRODID:ownCloud Calendar 0.7.3\nBEGIN:VEVENT\nSUMMARY:Termin:Junghackertag\nURL:http://...DTEND:20150602T160000\nDESCRIPTION:Junghackertag\nDTSTAMP:20150626T182050\nSEQUENCE:10172\nEND:VEVENT\nEND:VCALENDAR\n' batch = True, random_uid = False, format = '{title}', env = None def import_ics(collection, conf, ics, batch=False, random_uid=False, format=None, env=None): """ :param batch: setting this to True will insert without asking for approval, even when an event with the same uid already exists :type batch: bool :param random_uid: whether to assign a random UID to imported events or not :type random_uid: bool :param format: the format string to print events with :type format: str """ if format is None: format = conf['view']['event_format'] try: vevents = split_ics(ics, random_uid, conf['locale']['default_timezone']) except Exception as error: > raise FatalError(error) E khal.exceptions.FatalError: 'zoneinfo.ZoneInfo' object has no attribute 'localize' khal/controllers.py:615: FatalError ----------------------------- Captured stderr call ----------------------------- warning: Event end time has no timezone. Assuming it's the same timezone as the start time warning: Error when trying to import the event S9HZETRQne warning: Event start time has no timezone. Assuming it's the same timezone as the end time warning: Error when trying to import the event http://wiki.hamburg.ccc.de/Termin:Junghackertag _________________________________ test_raw_dt __________________________________ def test_raw_dt(): event_dt = _get_text('event_dt_simple') start = BERLIN.localize(dt.datetime(2014, 4, 9, 9, 30)) end = BERLIN.localize(dt.datetime(2014, 4, 9, 10, 30)) event = Event.fromString(event_dt, start=start, end=end, **EVENT_KWARGS) with freeze_time('2016-1-1'): assert normalize_component(event.raw) == \ > normalize_component(_get_text('event_dt_simple_inkl_vtimezone')) tests/event_test.py:51: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/event.py:385: in raw timezone = create_timezone(tzinfo, self.start) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tz = zoneinfo.ZoneInfo(key='Europe/Berlin') first_date = datetime.datetime(2014, 4, 9, 7, 30) last_date = datetime.datetime(2014, 4, 10, 7, 30) def create_timezone( tz: pytz.BaseTzInfo, first_date: Optional[dt.datetime]=None, last_date: Optional[dt.datetime]=None ) -> icalendar.Timezone: """ create an icalendar vtimezone from a pytz.tzinfo object :param tz: the timezone :param first_date: the very first datetime that needs to be included in the transition times, typically the DTSTART value of the (first recurring) event :param last_date: the last datetime that needs to included, typically the end of the (very last) event (of a recursion set) :returns: timezone information we currently have a problem here: pytz.timezones only carry the absolute dates of time zone transitions, not their RRULEs. This will a) make for rather bloated VTIMEZONE components, especially for long recurring events, b) we'll need to specify for which time range this VTIMEZONE should be generated and c) will not be valid for recurring events that go into eternity. Possible Solutions: As this information is not provided by pytz at all, there is no easy solution, we'd really need to ship another version of the OLSON DB. """ if isinstance(tz, StaticTzInfo): return _create_timezone_static(tz) # TODO last_date = None, recurring to infinity first_date = dt.datetime.today() if not first_date else to_naive_utc(first_date) last_date = first_date + dt.timedelta(days=1) if not last_date else to_naive_utc(last_date) timezone = icalendar.Timezone() timezone.add('TZID', tz) dst = { one[2]: 'DST' in two.__repr__() > for one, two in iter(tz._tzinfos.items()) # type: ignore } E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute '_tzinfos' khal/khalendar/event.py:903: AttributeError ______________________________ test_update_simple ______________________________ def test_update_simple(): event = Event.fromString(_get_text('event_dt_simple'), **EVENT_KWARGS) event_updated = Event.fromString(_get_text('event_dt_simple_updated'), **EVENT_KWARGS) event.update_summary('A not so simple Event') event.update_description('Everything has changed') event.update_location('anywhere') event.update_categories(['meeting']) > assert normalize_component(event.raw) == normalize_component(event_updated.raw) tests/event_test.py:83: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/event.py:385: in raw timezone = create_timezone(tzinfo, self.start) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tz = zoneinfo.ZoneInfo(key='Europe/Berlin') first_date = datetime.datetime(2014, 4, 9, 7, 30) last_date = datetime.datetime(2014, 4, 10, 7, 30) def create_timezone( tz: pytz.BaseTzInfo, first_date: Optional[dt.datetime]=None, last_date: Optional[dt.datetime]=None ) -> icalendar.Timezone: """ create an icalendar vtimezone from a pytz.tzinfo object :param tz: the timezone :param first_date: the very first datetime that needs to be included in the transition times, typically the DTSTART value of the (first recurring) event :param last_date: the last datetime that needs to included, typically the end of the (very last) event (of a recursion set) :returns: timezone information we currently have a problem here: pytz.timezones only carry the absolute dates of time zone transitions, not their RRULEs. This will a) make for rather bloated VTIMEZONE components, especially for long recurring events, b) we'll need to specify for which time range this VTIMEZONE should be generated and c) will not be valid for recurring events that go into eternity. Possible Solutions: As this information is not provided by pytz at all, there is no easy solution, we'd really need to ship another version of the OLSON DB. """ if isinstance(tz, StaticTzInfo): return _create_timezone_static(tz) # TODO last_date = None, recurring to infinity first_date = dt.datetime.today() if not first_date else to_naive_utc(first_date) last_date = first_date + dt.timedelta(days=1) if not last_date else to_naive_utc(last_date) timezone = icalendar.Timezone() timezone.add('TZID', tz) dst = { one[2]: 'DST' in two.__repr__() > for one, two in iter(tz._tzinfos.items()) # type: ignore } E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute '_tzinfos' khal/khalendar/event.py:903: AttributeError _________________________________ test_add_url _________________________________ def test_add_url(): event = Event.fromString(_get_text('event_dt_simple'), **EVENT_KWARGS) event.update_url('https://github.com/pimutils/khal') > assert 'URL:https://github.com/pimutils/khal' in event.raw tests/event_test.py:89: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/event.py:385: in raw timezone = create_timezone(tzinfo, self.start) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tz = zoneinfo.ZoneInfo(key='Europe/Berlin') first_date = datetime.datetime(2014, 4, 9, 7, 30) last_date = datetime.datetime(2014, 4, 10, 7, 30) def create_timezone( tz: pytz.BaseTzInfo, first_date: Optional[dt.datetime]=None, last_date: Optional[dt.datetime]=None ) -> icalendar.Timezone: """ create an icalendar vtimezone from a pytz.tzinfo object :param tz: the timezone :param first_date: the very first datetime that needs to be included in the transition times, typically the DTSTART value of the (first recurring) event :param last_date: the last datetime that needs to included, typically the end of the (very last) event (of a recursion set) :returns: timezone information we currently have a problem here: pytz.timezones only carry the absolute dates of time zone transitions, not their RRULEs. This will a) make for rather bloated VTIMEZONE components, especially for long recurring events, b) we'll need to specify for which time range this VTIMEZONE should be generated and c) will not be valid for recurring events that go into eternity. Possible Solutions: As this information is not provided by pytz at all, there is no easy solution, we'd really need to ship another version of the OLSON DB. """ if isinstance(tz, StaticTzInfo): return _create_timezone_static(tz) # TODO last_date = None, recurring to infinity first_date = dt.datetime.today() if not first_date else to_naive_utc(first_date) last_date = first_date + dt.timedelta(days=1) if not last_date else to_naive_utc(last_date) timezone = icalendar.Timezone() timezone.add('TZID', tz) dst = { one[2]: 'DST' in two.__repr__() > for one, two in iter(tz._tzinfos.items()) # type: ignore } E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute '_tzinfos' khal/khalendar/event.py:903: AttributeError _______________________ test_do_not_save_empty_location ________________________ def test_do_not_save_empty_location(): event = Event.fromString(_get_text('event_dt_simple'), **EVENT_KWARGS) event.update_location('') > assert 'LOCATION' not in event.raw tests/event_test.py:109: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/event.py:385: in raw timezone = create_timezone(tzinfo, self.start) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tz = zoneinfo.ZoneInfo(key='Europe/Berlin') first_date = datetime.datetime(2014, 4, 9, 7, 30) last_date = datetime.datetime(2014, 4, 10, 7, 30) def create_timezone( tz: pytz.BaseTzInfo, first_date: Optional[dt.datetime]=None, last_date: Optional[dt.datetime]=None ) -> icalendar.Timezone: """ create an icalendar vtimezone from a pytz.tzinfo object :param tz: the timezone :param first_date: the very first datetime that needs to be included in the transition times, typically the DTSTART value of the (first recurring) event :param last_date: the last datetime that needs to included, typically the end of the (very last) event (of a recursion set) :returns: timezone information we currently have a problem here: pytz.timezones only carry the absolute dates of time zone transitions, not their RRULEs. This will a) make for rather bloated VTIMEZONE components, especially for long recurring events, b) we'll need to specify for which time range this VTIMEZONE should be generated and c) will not be valid for recurring events that go into eternity. Possible Solutions: As this information is not provided by pytz at all, there is no easy solution, we'd really need to ship another version of the OLSON DB. """ if isinstance(tz, StaticTzInfo): return _create_timezone_static(tz) # TODO last_date = None, recurring to infinity first_date = dt.datetime.today() if not first_date else to_naive_utc(first_date) last_date = first_date + dt.timedelta(days=1) if not last_date else to_naive_utc(last_date) timezone = icalendar.Timezone() timezone.add('TZID', tz) dst = { one[2]: 'DST' in two.__repr__() > for one, two in iter(tz._tzinfos.items()) # type: ignore } E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute '_tzinfos' khal/khalendar/event.py:903: AttributeError ______________________ test_do_not_save_empty_description ______________________ def test_do_not_save_empty_description(): event = Event.fromString(_get_text('event_dt_simple'), **EVENT_KWARGS) event.update_description('') > assert 'DESCRIPTION' not in event.raw tests/event_test.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/event.py:385: in raw timezone = create_timezone(tzinfo, self.start) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tz = zoneinfo.ZoneInfo(key='Europe/Berlin') first_date = datetime.datetime(2014, 4, 9, 7, 30) last_date = datetime.datetime(2014, 4, 10, 7, 30) def create_timezone( tz: pytz.BaseTzInfo, first_date: Optional[dt.datetime]=None, last_date: Optional[dt.datetime]=None ) -> icalendar.Timezone: """ create an icalendar vtimezone from a pytz.tzinfo object :param tz: the timezone :param first_date: the very first datetime that needs to be included in the transition times, typically the DTSTART value of the (first recurring) event :param last_date: the last datetime that needs to included, typically the end of the (very last) event (of a recursion set) :returns: timezone information we currently have a problem here: pytz.timezones only carry the absolute dates of time zone transitions, not their RRULEs. This will a) make for rather bloated VTIMEZONE components, especially for long recurring events, b) we'll need to specify for which time range this VTIMEZONE should be generated and c) will not be valid for recurring events that go into eternity. Possible Solutions: As this information is not provided by pytz at all, there is no easy solution, we'd really need to ship another version of the OLSON DB. """ if isinstance(tz, StaticTzInfo): return _create_timezone_static(tz) # TODO last_date = None, recurring to infinity first_date = dt.datetime.today() if not first_date else to_naive_utc(first_date) last_date = first_date + dt.timedelta(days=1) if not last_date else to_naive_utc(last_date) timezone = icalendar.Timezone() timezone.add('TZID', tz) dst = { one[2]: 'DST' in two.__repr__() > for one, two in iter(tz._tzinfos.items()) # type: ignore } E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute '_tzinfos' khal/khalendar/event.py:903: AttributeError __________________________ test_do_not_save_empty_url __________________________ def test_do_not_save_empty_url(): event = Event.fromString(_get_text('event_dt_simple'), **EVENT_KWARGS) event.update_url('') > assert 'URL' not in event.raw tests/event_test.py:121: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/event.py:385: in raw timezone = create_timezone(tzinfo, self.start) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tz = zoneinfo.ZoneInfo(key='Europe/Berlin') first_date = datetime.datetime(2014, 4, 9, 7, 30) last_date = datetime.datetime(2014, 4, 10, 7, 30) def create_timezone( tz: pytz.BaseTzInfo, first_date: Optional[dt.datetime]=None, last_date: Optional[dt.datetime]=None ) -> icalendar.Timezone: """ create an icalendar vtimezone from a pytz.tzinfo object :param tz: the timezone :param first_date: the very first datetime that needs to be included in the transition times, typically the DTSTART value of the (first recurring) event :param last_date: the last datetime that needs to included, typically the end of the (very last) event (of a recursion set) :returns: timezone information we currently have a problem here: pytz.timezones only carry the absolute dates of time zone transitions, not their RRULEs. This will a) make for rather bloated VTIMEZONE components, especially for long recurring events, b) we'll need to specify for which time range this VTIMEZONE should be generated and c) will not be valid for recurring events that go into eternity. Possible Solutions: As this information is not provided by pytz at all, there is no easy solution, we'd really need to ship another version of the OLSON DB. """ if isinstance(tz, StaticTzInfo): return _create_timezone_static(tz) # TODO last_date = None, recurring to infinity first_date = dt.datetime.today() if not first_date else to_naive_utc(first_date) last_date = first_date + dt.timedelta(days=1) if not last_date else to_naive_utc(last_date) timezone = icalendar.Timezone() timezone.add('TZID', tz) dst = { one[2]: 'DST' in two.__repr__() > for one, two in iter(tz._tzinfos.items()) # type: ignore } E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute '_tzinfos' khal/khalendar/event.py:903: AttributeError ________________ test_remove_existing_location_if_set_to_empty _________________ def test_remove_existing_location_if_set_to_empty(): event = Event.fromString(_get_text('event_dt_simple_updated'), **EVENT_KWARGS) event.update_location('') > assert 'LOCATION' not in event.raw tests/event_test.py:127: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/event.py:385: in raw timezone = create_timezone(tzinfo, self.start) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tz = zoneinfo.ZoneInfo(key='Europe/Berlin') first_date = datetime.datetime(2014, 4, 9, 7, 30) last_date = datetime.datetime(2014, 4, 10, 7, 30) def create_timezone( tz: pytz.BaseTzInfo, first_date: Optional[dt.datetime]=None, last_date: Optional[dt.datetime]=None ) -> icalendar.Timezone: """ create an icalendar vtimezone from a pytz.tzinfo object :param tz: the timezone :param first_date: the very first datetime that needs to be included in the transition times, typically the DTSTART value of the (first recurring) event :param last_date: the last datetime that needs to included, typically the end of the (very last) event (of a recursion set) :returns: timezone information we currently have a problem here: pytz.timezones only carry the absolute dates of time zone transitions, not their RRULEs. This will a) make for rather bloated VTIMEZONE components, especially for long recurring events, b) we'll need to specify for which time range this VTIMEZONE should be generated and c) will not be valid for recurring events that go into eternity. Possible Solutions: As this information is not provided by pytz at all, there is no easy solution, we'd really need to ship another version of the OLSON DB. """ if isinstance(tz, StaticTzInfo): return _create_timezone_static(tz) # TODO last_date = None, recurring to infinity first_date = dt.datetime.today() if not first_date else to_naive_utc(first_date) last_date = first_date + dt.timedelta(days=1) if not last_date else to_naive_utc(last_date) timezone = icalendar.Timezone() timezone.add('TZID', tz) dst = { one[2]: 'DST' in two.__repr__() > for one, two in iter(tz._tzinfos.items()) # type: ignore } E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute '_tzinfos' khal/khalendar/event.py:903: AttributeError _______________ test_remove_existing_description_if_set_to_empty _______________ def test_remove_existing_description_if_set_to_empty(): event = Event.fromString(_get_text('event_dt_simple_updated'), **EVENT_KWARGS) event.update_description('') > assert 'DESCRIPTION' not in event.raw tests/event_test.py:133: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/event.py:385: in raw timezone = create_timezone(tzinfo, self.start) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tz = zoneinfo.ZoneInfo(key='Europe/Berlin') first_date = datetime.datetime(2014, 4, 9, 7, 30) last_date = datetime.datetime(2014, 4, 10, 7, 30) def create_timezone( tz: pytz.BaseTzInfo, first_date: Optional[dt.datetime]=None, last_date: Optional[dt.datetime]=None ) -> icalendar.Timezone: """ create an icalendar vtimezone from a pytz.tzinfo object :param tz: the timezone :param first_date: the very first datetime that needs to be included in the transition times, typically the DTSTART value of the (first recurring) event :param last_date: the last datetime that needs to included, typically the end of the (very last) event (of a recursion set) :returns: timezone information we currently have a problem here: pytz.timezones only carry the absolute dates of time zone transitions, not their RRULEs. This will a) make for rather bloated VTIMEZONE components, especially for long recurring events, b) we'll need to specify for which time range this VTIMEZONE should be generated and c) will not be valid for recurring events that go into eternity. Possible Solutions: As this information is not provided by pytz at all, there is no easy solution, we'd really need to ship another version of the OLSON DB. """ if isinstance(tz, StaticTzInfo): return _create_timezone_static(tz) # TODO last_date = None, recurring to infinity first_date = dt.datetime.today() if not first_date else to_naive_utc(first_date) last_date = first_date + dt.timedelta(days=1) if not last_date else to_naive_utc(last_date) timezone = icalendar.Timezone() timezone.add('TZID', tz) dst = { one[2]: 'DST' in two.__repr__() > for one, two in iter(tz._tzinfos.items()) # type: ignore } E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute '_tzinfos' khal/khalendar/event.py:903: AttributeError ___________________ test_remove_existing_url_if_set_to_empty ___________________ def test_remove_existing_url_if_set_to_empty(): event = Event.fromString(_get_text('event_dt_url'), **EVENT_KWARGS) event.update_url('') > assert 'URL' not in event.raw tests/event_test.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/event.py:385: in raw timezone = create_timezone(tzinfo, self.start) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tz = zoneinfo.ZoneInfo(key='Europe/Berlin') first_date = datetime.datetime(2014, 4, 9, 7, 30) last_date = datetime.datetime(2014, 4, 10, 7, 30) def create_timezone( tz: pytz.BaseTzInfo, first_date: Optional[dt.datetime]=None, last_date: Optional[dt.datetime]=None ) -> icalendar.Timezone: """ create an icalendar vtimezone from a pytz.tzinfo object :param tz: the timezone :param first_date: the very first datetime that needs to be included in the transition times, typically the DTSTART value of the (first recurring) event :param last_date: the last datetime that needs to included, typically the end of the (very last) event (of a recursion set) :returns: timezone information we currently have a problem here: pytz.timezones only carry the absolute dates of time zone transitions, not their RRULEs. This will a) make for rather bloated VTIMEZONE components, especially for long recurring events, b) we'll need to specify for which time range this VTIMEZONE should be generated and c) will not be valid for recurring events that go into eternity. Possible Solutions: As this information is not provided by pytz at all, there is no easy solution, we'd really need to ship another version of the OLSON DB. """ if isinstance(tz, StaticTzInfo): return _create_timezone_static(tz) # TODO last_date = None, recurring to infinity first_date = dt.datetime.today() if not first_date else to_naive_utc(first_date) last_date = first_date + dt.timedelta(days=1) if not last_date else to_naive_utc(last_date) timezone = icalendar.Timezone() timezone.add('TZID', tz) dst = { one[2]: 'DST' in two.__repr__() > for one, two in iter(tz._tzinfos.items()) # type: ignore } E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute '_tzinfos' khal/khalendar/event.py:903: AttributeError ________________________ test_update_remove_categories _________________________ def test_update_remove_categories(): event = Event.fromString(_get_text('event_dt_simple_updated'), **EVENT_KWARGS) event_nocat = Event.fromString(_get_text('event_dt_simple_nocat'), **EVENT_KWARGS) event.update_categories([]) > assert normalize_component(event.raw) == normalize_component(event_nocat.raw) tests/event_test.py:146: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/event.py:385: in raw timezone = create_timezone(tzinfo, self.start) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tz = zoneinfo.ZoneInfo(key='Europe/Berlin') first_date = datetime.datetime(2014, 4, 9, 7, 30) last_date = datetime.datetime(2014, 4, 10, 7, 30) def create_timezone( tz: pytz.BaseTzInfo, first_date: Optional[dt.datetime]=None, last_date: Optional[dt.datetime]=None ) -> icalendar.Timezone: """ create an icalendar vtimezone from a pytz.tzinfo object :param tz: the timezone :param first_date: the very first datetime that needs to be included in the transition times, typically the DTSTART value of the (first recurring) event :param last_date: the last datetime that needs to included, typically the end of the (very last) event (of a recursion set) :returns: timezone information we currently have a problem here: pytz.timezones only carry the absolute dates of time zone transitions, not their RRULEs. This will a) make for rather bloated VTIMEZONE components, especially for long recurring events, b) we'll need to specify for which time range this VTIMEZONE should be generated and c) will not be valid for recurring events that go into eternity. Possible Solutions: As this information is not provided by pytz at all, there is no easy solution, we'd really need to ship another version of the OLSON DB. """ if isinstance(tz, StaticTzInfo): return _create_timezone_static(tz) # TODO last_date = None, recurring to infinity first_date = dt.datetime.today() if not first_date else to_naive_utc(first_date) last_date = first_date + dt.timedelta(days=1) if not last_date else to_naive_utc(last_date) timezone = icalendar.Timezone() timezone.add('TZID', tz) dst = { one[2]: 'DST' in two.__repr__() > for one, two in iter(tz._tzinfos.items()) # type: ignore } E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute '_tzinfos' khal/khalendar/event.py:903: AttributeError _____________________________ test_transform_event _____________________________ def test_transform_event(): """test if transformation between different event types works""" event_d = _get_text('event_d') event = Event.fromString(event_d, **EVENT_KWARGS) assert isinstance(event, AllDayEvent) start = BERLIN.localize(dt.datetime(2014, 4, 9, 9, 30)) end = BERLIN.localize(dt.datetime(2014, 4, 9, 10, 30)) event.update_start_end(start, end) assert isinstance(event, LocalizedEvent) assert event.format(LIST_FORMAT, dt.date(2014, 4, 9)) == '09:30-10:30 An Event\x1b[0m' assert event.format(SEARCH_FORMAT, dt.date(2014, 4, 9)) == \ '09.04.2014 09:30-10:30 An Event\x1b[0m' analog_event = Event.fromString(_get_text('event_dt_simple'), **EVENT_KWARGS) > assert normalize_component(event.raw) == normalize_component(analog_event.raw) tests/event_test.py:184: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/event.py:385: in raw timezone = create_timezone(tzinfo, self.start) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tz = zoneinfo.ZoneInfo(key='Europe/Berlin') first_date = datetime.datetime(2014, 4, 9, 7, 30) last_date = datetime.datetime(2014, 4, 10, 7, 30) def create_timezone( tz: pytz.BaseTzInfo, first_date: Optional[dt.datetime]=None, last_date: Optional[dt.datetime]=None ) -> icalendar.Timezone: """ create an icalendar vtimezone from a pytz.tzinfo object :param tz: the timezone :param first_date: the very first datetime that needs to be included in the transition times, typically the DTSTART value of the (first recurring) event :param last_date: the last datetime that needs to included, typically the end of the (very last) event (of a recursion set) :returns: timezone information we currently have a problem here: pytz.timezones only carry the absolute dates of time zone transitions, not their RRULEs. This will a) make for rather bloated VTIMEZONE components, especially for long recurring events, b) we'll need to specify for which time range this VTIMEZONE should be generated and c) will not be valid for recurring events that go into eternity. Possible Solutions: As this information is not provided by pytz at all, there is no easy solution, we'd really need to ship another version of the OLSON DB. """ if isinstance(tz, StaticTzInfo): return _create_timezone_static(tz) # TODO last_date = None, recurring to infinity first_date = dt.datetime.today() if not first_date else to_naive_utc(first_date) last_date = first_date + dt.timedelta(days=1) if not last_date else to_naive_utc(last_date) timezone = icalendar.Timezone() timezone.add('TZID', tz) dst = { one[2]: 'DST' in two.__repr__() > for one, two in iter(tz._tzinfos.items()) # type: ignore } E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute '_tzinfos' khal/khalendar/event.py:903: AttributeError ________________________________ test_dt_two_tz ________________________________ def test_dt_two_tz(): event_dt_two_tz = _get_text('event_dt_two_tz') cal_dt_two_tz = _get_text('cal_dt_two_tz') event = Event.fromString(event_dt_two_tz, **EVENT_KWARGS) with freeze_time('2016-02-16 12:00:00'): > assert normalize_component(cal_dt_two_tz) == normalize_component(event.raw) tests/event_test.py:222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/event.py:385: in raw timezone = create_timezone(tzinfo, self.start) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tz = zoneinfo.ZoneInfo(key='Europe/Berlin') first_date = datetime.datetime(2014, 4, 9, 7, 30) last_date = datetime.datetime(2014, 4, 10, 7, 30) def create_timezone( tz: pytz.BaseTzInfo, first_date: Optional[dt.datetime]=None, last_date: Optional[dt.datetime]=None ) -> icalendar.Timezone: """ create an icalendar vtimezone from a pytz.tzinfo object :param tz: the timezone :param first_date: the very first datetime that needs to be included in the transition times, typically the DTSTART value of the (first recurring) event :param last_date: the last datetime that needs to included, typically the end of the (very last) event (of a recursion set) :returns: timezone information we currently have a problem here: pytz.timezones only carry the absolute dates of time zone transitions, not their RRULEs. This will a) make for rather bloated VTIMEZONE components, especially for long recurring events, b) we'll need to specify for which time range this VTIMEZONE should be generated and c) will not be valid for recurring events that go into eternity. Possible Solutions: As this information is not provided by pytz at all, there is no easy solution, we'd really need to ship another version of the OLSON DB. """ if isinstance(tz, StaticTzInfo): return _create_timezone_static(tz) # TODO last_date = None, recurring to infinity first_date = dt.datetime.today() if not first_date else to_naive_utc(first_date) last_date = first_date + dt.timedelta(days=1) if not last_date else to_naive_utc(last_date) timezone = icalendar.Timezone() timezone.add('TZID', tz) dst = { one[2]: 'DST' in two.__repr__() > for one, two in iter(tz._tzinfos.items()) # type: ignore } E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute '_tzinfos' khal/khalendar/event.py:903: AttributeError ______________________________ test_event_no_dst _______________________________ def test_event_no_dst(): """test the creation of a corect VTIMEZONE for timezones with no dst""" event_no_dst = _get_text('event_no_dst') cal_no_dst = _get_text('cal_no_dst') event = Event.fromString(event_no_dst, calendar='foobar', locale=LOCALE_BOGOTA) if version.parse(pytz.__version__) > version.Version('2017.1'): cal_no_dst = cal_no_dst.replace( 'TZNAME:COT', 'RDATE:20380118T221407\r\nTZNAME:-05' ) > assert normalize_component(event.raw) == normalize_component(cal_no_dst) tests/event_test.py:364: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/event.py:385: in raw timezone = create_timezone(tzinfo, self.start) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tz = zoneinfo.ZoneInfo(key='America/Bogota') first_date = datetime.datetime(2014, 4, 9, 14, 30) last_date = datetime.datetime(2014, 4, 10, 14, 30) def create_timezone( tz: pytz.BaseTzInfo, first_date: Optional[dt.datetime]=None, last_date: Optional[dt.datetime]=None ) -> icalendar.Timezone: """ create an icalendar vtimezone from a pytz.tzinfo object :param tz: the timezone :param first_date: the very first datetime that needs to be included in the transition times, typically the DTSTART value of the (first recurring) event :param last_date: the last datetime that needs to included, typically the end of the (very last) event (of a recursion set) :returns: timezone information we currently have a problem here: pytz.timezones only carry the absolute dates of time zone transitions, not their RRULEs. This will a) make for rather bloated VTIMEZONE components, especially for long recurring events, b) we'll need to specify for which time range this VTIMEZONE should be generated and c) will not be valid for recurring events that go into eternity. Possible Solutions: As this information is not provided by pytz at all, there is no easy solution, we'd really need to ship another version of the OLSON DB. """ if isinstance(tz, StaticTzInfo): return _create_timezone_static(tz) # TODO last_date = None, recurring to infinity first_date = dt.datetime.today() if not first_date else to_naive_utc(first_date) last_date = first_date + dt.timedelta(days=1) if not last_date else to_naive_utc(last_date) timezone = icalendar.Timezone() timezone.add('TZID', tz) dst = { one[2]: 'DST' in two.__repr__() > for one, two in iter(tz._tzinfos.items()) # type: ignore } E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute '_tzinfos' khal/khalendar/event.py:903: AttributeError ______________________________ test_event_raw_UTC ______________________________ def test_event_raw_UTC(): """test .raw() on events which are localized in UTC""" event_utc = _get_text('event_dt_simple_zulu') event = Event.fromString(event_utc, **EVENT_KWARGS) assert event.raw == '\r\n'.join([ '''BEGIN:VCALENDAR''', '''VERSION:2.0''', '''PRODID:-//PIMUTILS.ORG//NONSGML khal / icalendar //EN''', '''BEGIN:VEVENT''', '''SUMMARY:An Event''', '''DTSTART:20140409T093000Z''', '''DTEND:20140409T103000Z''', '''DTSTAMP:20140401T234817Z''', '''UID:V042MJ8B3SJNFXQOJL6P53OFMHJE8Z3VZWOU''', '''END:VEVENT''', > '''END:VCALENDAR\r\n''']) tests/event_test.py:384: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/event.py:385: in raw timezone = create_timezone(tzinfo, self.start) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tz = zoneinfo.ZoneInfo(key='UTC') first_date = datetime.datetime(2014, 4, 9, 9, 30) last_date = datetime.datetime(2014, 4, 10, 9, 30) def create_timezone( tz: pytz.BaseTzInfo, first_date: Optional[dt.datetime]=None, last_date: Optional[dt.datetime]=None ) -> icalendar.Timezone: """ create an icalendar vtimezone from a pytz.tzinfo object :param tz: the timezone :param first_date: the very first datetime that needs to be included in the transition times, typically the DTSTART value of the (first recurring) event :param last_date: the last datetime that needs to included, typically the end of the (very last) event (of a recursion set) :returns: timezone information we currently have a problem here: pytz.timezones only carry the absolute dates of time zone transitions, not their RRULEs. This will a) make for rather bloated VTIMEZONE components, especially for long recurring events, b) we'll need to specify for which time range this VTIMEZONE should be generated and c) will not be valid for recurring events that go into eternity. Possible Solutions: As this information is not provided by pytz at all, there is no easy solution, we'd really need to ship another version of the OLSON DB. """ if isinstance(tz, StaticTzInfo): return _create_timezone_static(tz) # TODO last_date = None, recurring to infinity first_date = dt.datetime.today() if not first_date else to_naive_utc(first_date) last_date = first_date + dt.timedelta(days=1) if not last_date else to_naive_utc(last_date) timezone = icalendar.Timezone() timezone.add('TZID', tz) dst = { one[2]: 'DST' in two.__repr__() > for one, two in iter(tz._tzinfos.items()) # type: ignore } E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute '_tzinfos' khal/khalendar/event.py:903: AttributeError ________________________________ test_multi_uid ________________________________ def test_multi_uid(): """test for support for events with consist of several sub events with the same uid""" orig_event_str = _get_text('event_rrule_recuid') event = Event.fromString(orig_event_str, **EVENT_KWARGS) for line in orig_event_str.split('\n'): > assert line in event.raw.split('\r\n') tests/event_test.py:406: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/event.py:385: in raw timezone = create_timezone(tzinfo, self.start) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tz = zoneinfo.ZoneInfo(key='Europe/Berlin') first_date = datetime.datetime(2014, 6, 30, 5, 0) last_date = datetime.datetime(2014, 7, 1, 5, 0) def create_timezone( tz: pytz.BaseTzInfo, first_date: Optional[dt.datetime]=None, last_date: Optional[dt.datetime]=None ) -> icalendar.Timezone: """ create an icalendar vtimezone from a pytz.tzinfo object :param tz: the timezone :param first_date: the very first datetime that needs to be included in the transition times, typically the DTSTART value of the (first recurring) event :param last_date: the last datetime that needs to included, typically the end of the (very last) event (of a recursion set) :returns: timezone information we currently have a problem here: pytz.timezones only carry the absolute dates of time zone transitions, not their RRULEs. This will a) make for rather bloated VTIMEZONE components, especially for long recurring events, b) we'll need to specify for which time range this VTIMEZONE should be generated and c) will not be valid for recurring events that go into eternity. Possible Solutions: As this information is not provided by pytz at all, there is no easy solution, we'd really need to ship another version of the OLSON DB. """ if isinstance(tz, StaticTzInfo): return _create_timezone_static(tz) # TODO last_date = None, recurring to infinity first_date = dt.datetime.today() if not first_date else to_naive_utc(first_date) last_date = first_date + dt.timedelta(days=1) if not last_date else to_naive_utc(last_date) timezone = icalendar.Timezone() timezone.add('TZID', tz) dst = { one[2]: 'DST' in two.__repr__() > for one, two in iter(tz._tzinfos.items()) # type: ignore } E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute '_tzinfos' khal/khalendar/event.py:903: AttributeError _______________________ test_remove_instance_from_recuid _______________________ def test_remove_instance_from_recuid(): """remove an istance from an event which is specified via an additional VEVENT with the same UID (which we call `recuid` here""" event = Event.fromString(_get_text('event_rrule_recuid'), **EVENT_KWARGS) > assert event.raw.split('\r\n').count('UID:event_rrule_recurrence_id') == 2 tests/event_test.py:469: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/event.py:385: in raw timezone = create_timezone(tzinfo, self.start) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tz = zoneinfo.ZoneInfo(key='Europe/Berlin') first_date = datetime.datetime(2014, 6, 30, 5, 0) last_date = datetime.datetime(2014, 7, 1, 5, 0) def create_timezone( tz: pytz.BaseTzInfo, first_date: Optional[dt.datetime]=None, last_date: Optional[dt.datetime]=None ) -> icalendar.Timezone: """ create an icalendar vtimezone from a pytz.tzinfo object :param tz: the timezone :param first_date: the very first datetime that needs to be included in the transition times, typically the DTSTART value of the (first recurring) event :param last_date: the last datetime that needs to included, typically the end of the (very last) event (of a recursion set) :returns: timezone information we currently have a problem here: pytz.timezones only carry the absolute dates of time zone transitions, not their RRULEs. This will a) make for rather bloated VTIMEZONE components, especially for long recurring events, b) we'll need to specify for which time range this VTIMEZONE should be generated and c) will not be valid for recurring events that go into eternity. Possible Solutions: As this information is not provided by pytz at all, there is no easy solution, we'd really need to ship another version of the OLSON DB. """ if isinstance(tz, StaticTzInfo): return _create_timezone_static(tz) # TODO last_date = None, recurring to infinity first_date = dt.datetime.today() if not first_date else to_naive_utc(first_date) last_date = first_date + dt.timedelta(days=1) if not last_date else to_naive_utc(last_date) timezone = icalendar.Timezone() timezone.add('TZID', tz) dst = { one[2]: 'DST' in two.__repr__() > for one, two in iter(tz._tzinfos.items()) # type: ignore } E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute '_tzinfos' khal/khalendar/event.py:903: AttributeError ________________________________ test_split_ics ________________________________ def test_split_ics(): cal = _get_text('cal_lots_of_timezones') > vevents = split_ics(cal) tests/icalendar_test.py:55: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ics = 'BEGIN:VCALENDAR\nVERSION:2.0\nPRODID:-//PIMUTILS.ORG//NONSGML khal / icalendar //EN\nBEGIN:VTIMEZONE\nTZID:IndianReun...nDTSTAMP:20140401T234817Z\nUID:abcde\nRECURRENCE-ID;TZID=Europe_Amsterdam:20140707T070000\nEND:VEVENT\nEND:VCALENDAR\n' random_uid = False, default_timezone = None def split_ics(ics: str, random_uid: bool=False, default_timezone=None): """split an ics string into several according to VEVENT's UIDs and sort the right VTIMEZONEs accordingly ignores all other ics components :param random_uid: assign random uids to all events :rtype list: """ cal = cal_from_ics(ics) tzs = {} events_grouped = defaultdict(list) for item in cal.walk(): # Since some events could have a Windows format timezone (e.g. 'New Zealand # Standard Time' for 'Pacific/Auckland' in Olson format), we convert any # Windows format timezones to Olson. if item.name == 'VTIMEZONE': > if item['TZID'] in icalendar.windows_to_olson.WINDOWS_TO_OLSON: E AttributeError: module 'icalendar' has no attribute 'windows_to_olson' khal/icalendar.py:59: AttributeError __________________________ test_split_ics_random_uid ___________________________ def test_split_ics_random_uid(): random.seed(123) cal = _get_text('cal_lots_of_timezones') > vevents = split_ics(cal, random_uid=True) tests/icalendar_test.py:73: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ics = 'BEGIN:VCALENDAR\nVERSION:2.0\nPRODID:-//PIMUTILS.ORG//NONSGML khal / icalendar //EN\nBEGIN:VTIMEZONE\nTZID:IndianReun...nDTSTAMP:20140401T234817Z\nUID:abcde\nRECURRENCE-ID;TZID=Europe_Amsterdam:20140707T070000\nEND:VEVENT\nEND:VCALENDAR\n' random_uid = True, default_timezone = None def split_ics(ics: str, random_uid: bool=False, default_timezone=None): """split an ics string into several according to VEVENT's UIDs and sort the right VTIMEZONEs accordingly ignores all other ics components :param random_uid: assign random uids to all events :rtype list: """ cal = cal_from_ics(ics) tzs = {} events_grouped = defaultdict(list) for item in cal.walk(): # Since some events could have a Windows format timezone (e.g. 'New Zealand # Standard Time' for 'Pacific/Auckland' in Olson format), we convert any # Windows format timezones to Olson. if item.name == 'VTIMEZONE': > if item['TZID'] in icalendar.windows_to_olson.WINDOWS_TO_OLSON: E AttributeError: module 'icalendar' has no attribute 'windows_to_olson' khal/icalendar.py:59: AttributeError ____________________________ test_windows_timezone _____________________________ caplog = <_pytest.logging.LogCaptureFixture object at 0xf4ad4ba0> def test_windows_timezone(caplog): """Test if a windows tz format works""" cal = _get_text("tz_windows_format") > split_ics(cal) tests/icalendar_test.py:105: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ics = 'BEGIN:VCALENDAR\nVERSION:2.0\nPRODID:-//PIMUTILS.ORG//NONSGML khal / icalendar //EN\nBEGIN:VTIMEZONE\nTZID:New Zealan...DTSTAMP;VALUE=DATE-TIME:20191105T094904Z\nUID:PERSOYPOYGVR55JMICVAFVDWWBIKPC9PTAG6SN4B2YT\nEND:VEVENT\nEND:VCALENDAR\n' random_uid = False, default_timezone = None def split_ics(ics: str, random_uid: bool=False, default_timezone=None): """split an ics string into several according to VEVENT's UIDs and sort the right VTIMEZONEs accordingly ignores all other ics components :param random_uid: assign random uids to all events :rtype list: """ cal = cal_from_ics(ics) tzs = {} events_grouped = defaultdict(list) for item in cal.walk(): # Since some events could have a Windows format timezone (e.g. 'New Zealand # Standard Time' for 'Pacific/Auckland' in Olson format), we convert any # Windows format timezones to Olson. if item.name == 'VTIMEZONE': > if item['TZID'] in icalendar.windows_to_olson.WINDOWS_TO_OLSON: E AttributeError: module 'icalendar' has no attribute 'windows_to_olson' khal/icalendar.py:59: AttributeError __________________________ TestCollection.test_insert __________________________ self = coll_vdirs = (, {"Dad's calendar": , 'private': }) def test_insert(self, coll_vdirs): """insert a localized event""" coll, vdirs = coll_vdirs > coll.insert( Event.fromString(_get_text('event_dt_simple'), calendar=cal1, locale=LOCALE_BERLIN), cal1) tests/khalendar_test.py:171: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/khalendar.py:224: in insert event.href, event.etag = self._storages[calendar].upload(event) khal/khalendar/vdir.py:210: in upload if not isinstance(item.raw, str): khal/khalendar/event.py:385: in raw timezone = create_timezone(tzinfo, self.start) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tz = zoneinfo.ZoneInfo(key='Europe/Berlin') first_date = datetime.datetime(2014, 4, 9, 7, 30) last_date = datetime.datetime(2014, 4, 10, 7, 30) def create_timezone( tz: pytz.BaseTzInfo, first_date: Optional[dt.datetime]=None, last_date: Optional[dt.datetime]=None ) -> icalendar.Timezone: """ create an icalendar vtimezone from a pytz.tzinfo object :param tz: the timezone :param first_date: the very first datetime that needs to be included in the transition times, typically the DTSTART value of the (first recurring) event :param last_date: the last datetime that needs to included, typically the end of the (very last) event (of a recursion set) :returns: timezone information we currently have a problem here: pytz.timezones only carry the absolute dates of time zone transitions, not their RRULEs. This will a) make for rather bloated VTIMEZONE components, especially for long recurring events, b) we'll need to specify for which time range this VTIMEZONE should be generated and c) will not be valid for recurring events that go into eternity. Possible Solutions: As this information is not provided by pytz at all, there is no easy solution, we'd really need to ship another version of the OLSON DB. """ if isinstance(tz, StaticTzInfo): return _create_timezone_static(tz) # TODO last_date = None, recurring to infinity first_date = dt.datetime.today() if not first_date else to_naive_utc(first_date) last_date = first_date + dt.timedelta(days=1) if not last_date else to_naive_utc(last_date) timezone = icalendar.Timezone() timezone.add('TZID', tz) dst = { one[2]: 'DST' in two.__repr__() > for one, two in iter(tz._tzinfos.items()) # type: ignore } E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute '_tzinfos' khal/khalendar/event.py:903: AttributeError ___________________________ TestCollection.test_get ____________________________ self = coll_vdirs = (, {"Dad's calendar": , 'private': }) def test_get(self, coll_vdirs): """test getting an event by its href""" coll, vdirs = coll_vdirs event = Event.fromString( _get_text('event_dt_simple'), href='xyz.ics', calendar=cal1, locale=LOCALE_BERLIN, ) > coll.insert(event, cal1) tests/khalendar_test.py:224: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/khalendar.py:224: in insert event.href, event.etag = self._storages[calendar].upload(event) khal/khalendar/vdir.py:210: in upload if not isinstance(item.raw, str): khal/khalendar/event.py:385: in raw timezone = create_timezone(tzinfo, self.start) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tz = zoneinfo.ZoneInfo(key='Europe/Berlin') first_date = datetime.datetime(2014, 4, 9, 7, 30) last_date = datetime.datetime(2014, 4, 10, 7, 30) def create_timezone( tz: pytz.BaseTzInfo, first_date: Optional[dt.datetime]=None, last_date: Optional[dt.datetime]=None ) -> icalendar.Timezone: """ create an icalendar vtimezone from a pytz.tzinfo object :param tz: the timezone :param first_date: the very first datetime that needs to be included in the transition times, typically the DTSTART value of the (first recurring) event :param last_date: the last datetime that needs to included, typically the end of the (very last) event (of a recursion set) :returns: timezone information we currently have a problem here: pytz.timezones only carry the absolute dates of time zone transitions, not their RRULEs. This will a) make for rather bloated VTIMEZONE components, especially for long recurring events, b) we'll need to specify for which time range this VTIMEZONE should be generated and c) will not be valid for recurring events that go into eternity. Possible Solutions: As this information is not provided by pytz at all, there is no easy solution, we'd really need to ship another version of the OLSON DB. """ if isinstance(tz, StaticTzInfo): return _create_timezone_static(tz) # TODO last_date = None, recurring to infinity first_date = dt.datetime.today() if not first_date else to_naive_utc(first_date) last_date = first_date + dt.timedelta(days=1) if not last_date else to_naive_utc(last_date) timezone = icalendar.Timezone() timezone.add('TZID', tz) dst = { one[2]: 'DST' in two.__repr__() > for one, two in iter(tz._tzinfos.items()) # type: ignore } E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute '_tzinfos' khal/khalendar/event.py:903: AttributeError __________________________ TestCollection.test_change __________________________ self = coll_vdirs = (, {"Dad's calendar": , 'private': }) def test_change(self, coll_vdirs): """moving an event from one calendar to another""" coll, vdirs = coll_vdirs event = Event.fromString(_get_text('event_dt_simple'), calendar=cal1, locale=LOCALE_BERLIN) > coll.insert(event, cal1) tests/khalendar_test.py:235: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/khalendar.py:224: in insert event.href, event.etag = self._storages[calendar].upload(event) khal/khalendar/vdir.py:210: in upload if not isinstance(item.raw, str): khal/khalendar/event.py:385: in raw timezone = create_timezone(tzinfo, self.start) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tz = zoneinfo.ZoneInfo(key='Europe/Berlin') first_date = datetime.datetime(2014, 4, 9, 7, 30) last_date = datetime.datetime(2014, 4, 10, 7, 30) def create_timezone( tz: pytz.BaseTzInfo, first_date: Optional[dt.datetime]=None, last_date: Optional[dt.datetime]=None ) -> icalendar.Timezone: """ create an icalendar vtimezone from a pytz.tzinfo object :param tz: the timezone :param first_date: the very first datetime that needs to be included in the transition times, typically the DTSTART value of the (first recurring) event :param last_date: the last datetime that needs to included, typically the end of the (very last) event (of a recursion set) :returns: timezone information we currently have a problem here: pytz.timezones only carry the absolute dates of time zone transitions, not their RRULEs. This will a) make for rather bloated VTIMEZONE components, especially for long recurring events, b) we'll need to specify for which time range this VTIMEZONE should be generated and c) will not be valid for recurring events that go into eternity. Possible Solutions: As this information is not provided by pytz at all, there is no easy solution, we'd really need to ship another version of the OLSON DB. """ if isinstance(tz, StaticTzInfo): return _create_timezone_static(tz) # TODO last_date = None, recurring to infinity first_date = dt.datetime.today() if not first_date else to_naive_utc(first_date) last_date = first_date + dt.timedelta(days=1) if not last_date else to_naive_utc(last_date) timezone = icalendar.Timezone() timezone.add('TZID', tz) dst = { one[2]: 'DST' in two.__repr__() > for one, two in iter(tz._tzinfos.items()) # type: ignore } E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute '_tzinfos' khal/khalendar/event.py:903: AttributeError _______________________ TestCollection.test_update_event _______________________ self = coll_vdirs = (, {"Dad's calendar": , 'private': }) def test_update_event(self, coll_vdirs): """updating one event""" coll, vdirs = coll_vdirs event = Event.fromString( _get_text('event_dt_simple'), calendar=cal1, locale=LOCALE_BERLIN) > coll.insert(event, cal1) tests/khalendar_test.py:249: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/khalendar.py:224: in insert event.href, event.etag = self._storages[calendar].upload(event) khal/khalendar/vdir.py:210: in upload if not isinstance(item.raw, str): khal/khalendar/event.py:385: in raw timezone = create_timezone(tzinfo, self.start) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tz = zoneinfo.ZoneInfo(key='Europe/Berlin') first_date = datetime.datetime(2014, 4, 9, 7, 30) last_date = datetime.datetime(2014, 4, 10, 7, 30) def create_timezone( tz: pytz.BaseTzInfo, first_date: Optional[dt.datetime]=None, last_date: Optional[dt.datetime]=None ) -> icalendar.Timezone: """ create an icalendar vtimezone from a pytz.tzinfo object :param tz: the timezone :param first_date: the very first datetime that needs to be included in the transition times, typically the DTSTART value of the (first recurring) event :param last_date: the last datetime that needs to included, typically the end of the (very last) event (of a recursion set) :returns: timezone information we currently have a problem here: pytz.timezones only carry the absolute dates of time zone transitions, not their RRULEs. This will a) make for rather bloated VTIMEZONE components, especially for long recurring events, b) we'll need to specify for which time range this VTIMEZONE should be generated and c) will not be valid for recurring events that go into eternity. Possible Solutions: As this information is not provided by pytz at all, there is no easy solution, we'd really need to ship another version of the OLSON DB. """ if isinstance(tz, StaticTzInfo): return _create_timezone_static(tz) # TODO last_date = None, recurring to infinity first_date = dt.datetime.today() if not first_date else to_naive_utc(first_date) last_date = first_date + dt.timedelta(days=1) if not last_date else to_naive_utc(last_date) timezone = icalendar.Timezone() timezone.add('TZID', tz) dst = { one[2]: 'DST' in two.__repr__() > for one, two in iter(tz._tzinfos.items()) # type: ignore } E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute '_tzinfos' khal/khalendar/event.py:903: AttributeError __________________________ TestCollection.test_search __________________________ self = coll_vdirs = (, {"Dad's calendar": , 'private': }) def test_search(self, coll_vdirs): coll, vdirs = coll_vdirs assert len(list(coll.search('Event'))) == 0 event = Event.fromString( _get_text('event_dt_simple'), calendar=cal1, locale=LOCALE_BERLIN) > coll.insert(event, cal1) tests/khalendar_test.py:289: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/khalendar.py:224: in insert event.href, event.etag = self._storages[calendar].upload(event) khal/khalendar/vdir.py:210: in upload if not isinstance(item.raw, str): khal/khalendar/event.py:385: in raw timezone = create_timezone(tzinfo, self.start) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tz = zoneinfo.ZoneInfo(key='Europe/Berlin') first_date = datetime.datetime(2014, 4, 9, 7, 30) last_date = datetime.datetime(2014, 4, 10, 7, 30) def create_timezone( tz: pytz.BaseTzInfo, first_date: Optional[dt.datetime]=None, last_date: Optional[dt.datetime]=None ) -> icalendar.Timezone: """ create an icalendar vtimezone from a pytz.tzinfo object :param tz: the timezone :param first_date: the very first datetime that needs to be included in the transition times, typically the DTSTART value of the (first recurring) event :param last_date: the last datetime that needs to included, typically the end of the (very last) event (of a recursion set) :returns: timezone information we currently have a problem here: pytz.timezones only carry the absolute dates of time zone transitions, not their RRULEs. This will a) make for rather bloated VTIMEZONE components, especially for long recurring events, b) we'll need to specify for which time range this VTIMEZONE should be generated and c) will not be valid for recurring events that go into eternity. Possible Solutions: As this information is not provided by pytz at all, there is no easy solution, we'd really need to ship another version of the OLSON DB. """ if isinstance(tz, StaticTzInfo): return _create_timezone_static(tz) # TODO last_date = None, recurring to infinity first_date = dt.datetime.today() if not first_date else to_naive_utc(first_date) last_date = first_date + dt.timedelta(days=1) if not last_date else to_naive_utc(last_date) timezone = icalendar.Timezone() timezone.add('TZID', tz) dst = { one[2]: 'DST' in two.__repr__() > for one, two in iter(tz._tzinfos.items()) # type: ignore } E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute '_tzinfos' khal/khalendar/event.py:903: AttributeError ____________________ TestCollection.test_delete_two_events _____________________ self = coll_vdirs = (, {"Dad's calendar": , 'private': }) sleep_time = 0.011000000000000001 def test_delete_two_events(self, coll_vdirs, sleep_time): """testing if we can delete any of two events in two different calendars with the same filename""" coll, vdirs = coll_vdirs event1 = Event.fromString( _get_text('event_dt_simple'), calendar=cal1, locale=LOCALE_BERLIN) event2 = Event.fromString( _get_text('event_dt_simple'), calendar=cal2, locale=LOCALE_BERLIN) > coll.insert(event1, cal1) tests/khalendar_test.py:330: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/khalendar.py:224: in insert event.href, event.etag = self._storages[calendar].upload(event) khal/khalendar/vdir.py:210: in upload if not isinstance(item.raw, str): khal/khalendar/event.py:385: in raw timezone = create_timezone(tzinfo, self.start) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tz = zoneinfo.ZoneInfo(key='Europe/Berlin') first_date = datetime.datetime(2014, 4, 9, 7, 30) last_date = datetime.datetime(2014, 4, 10, 7, 30) def create_timezone( tz: pytz.BaseTzInfo, first_date: Optional[dt.datetime]=None, last_date: Optional[dt.datetime]=None ) -> icalendar.Timezone: """ create an icalendar vtimezone from a pytz.tzinfo object :param tz: the timezone :param first_date: the very first datetime that needs to be included in the transition times, typically the DTSTART value of the (first recurring) event :param last_date: the last datetime that needs to included, typically the end of the (very last) event (of a recursion set) :returns: timezone information we currently have a problem here: pytz.timezones only carry the absolute dates of time zone transitions, not their RRULEs. This will a) make for rather bloated VTIMEZONE components, especially for long recurring events, b) we'll need to specify for which time range this VTIMEZONE should be generated and c) will not be valid for recurring events that go into eternity. Possible Solutions: As this information is not provided by pytz at all, there is no easy solution, we'd really need to ship another version of the OLSON DB. """ if isinstance(tz, StaticTzInfo): return _create_timezone_static(tz) # TODO last_date = None, recurring to infinity first_date = dt.datetime.today() if not first_date else to_naive_utc(first_date) last_date = first_date + dt.timedelta(days=1) if not last_date else to_naive_utc(last_date) timezone = icalendar.Timezone() timezone.add('TZID', tz) dst = { one[2]: 'DST' in two.__repr__() > for one, two in iter(tz._tzinfos.items()) # type: ignore } E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute '_tzinfos' khal/khalendar/event.py:903: AttributeError ______________________ TestCollection.test_delete_recuid _______________________ self = coll_vdirs = (, {"Dad's calendar": , 'private': }) def test_delete_recuid(self, coll_vdirs: CollVdirType): """Testing if we can delete a recuid (add it to exdate)""" coll, _ = coll_vdirs event_str = _get_text('event_rrule_recuid') event = Event.fromString(event_str, calendar=cal1, locale=LOCALE_BERLIN) > coll.insert(event, cal1) tests/khalendar_test.py:349: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/khalendar.py:224: in insert event.href, event.etag = self._storages[calendar].upload(event) khal/khalendar/vdir.py:210: in upload if not isinstance(item.raw, str): khal/khalendar/event.py:385: in raw timezone = create_timezone(tzinfo, self.start) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tz = zoneinfo.ZoneInfo(key='Europe/Berlin') first_date = datetime.datetime(2014, 6, 30, 5, 0) last_date = datetime.datetime(2014, 7, 1, 5, 0) def create_timezone( tz: pytz.BaseTzInfo, first_date: Optional[dt.datetime]=None, last_date: Optional[dt.datetime]=None ) -> icalendar.Timezone: """ create an icalendar vtimezone from a pytz.tzinfo object :param tz: the timezone :param first_date: the very first datetime that needs to be included in the transition times, typically the DTSTART value of the (first recurring) event :param last_date: the last datetime that needs to included, typically the end of the (very last) event (of a recursion set) :returns: timezone information we currently have a problem here: pytz.timezones only carry the absolute dates of time zone transitions, not their RRULEs. This will a) make for rather bloated VTIMEZONE components, especially for long recurring events, b) we'll need to specify for which time range this VTIMEZONE should be generated and c) will not be valid for recurring events that go into eternity. Possible Solutions: As this information is not provided by pytz at all, there is no easy solution, we'd really need to ship another version of the OLSON DB. """ if isinstance(tz, StaticTzInfo): return _create_timezone_static(tz) # TODO last_date = None, recurring to infinity first_date = dt.datetime.today() if not first_date else to_naive_utc(first_date) last_date = first_date + dt.timedelta(days=1) if not last_date else to_naive_utc(last_date) timezone = icalendar.Timezone() timezone.add('TZID', tz) dst = { one[2]: 'DST' in two.__repr__() > for one, two in iter(tz._tzinfos.items()) # type: ignore } E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute '_tzinfos' khal/khalendar/event.py:903: AttributeError ____________________ TestCollection.test_invalid_timezones _____________________ self = coll_vdirs = (, {"Dad's calendar": , 'private': }) def test_invalid_timezones(self, coll_vdirs): """testing if we can delete any of two events in two different calendars with the same filename""" coll, vdirs = coll_vdirs event = Event.fromString( _get_text('invalid_tzoffset'), calendar=cal1, locale=LOCALE_BERLIN) > coll.insert(event, cal1) tests/khalendar_test.py:374: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/khalendar/khalendar.py:224: in insert event.href, event.etag = self._storages[calendar].upload(event) khal/khalendar/vdir.py:210: in upload if not isinstance(item.raw, str): khal/khalendar/event.py:385: in raw timezone = create_timezone(tzinfo, self.start) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tz = zoneinfo.ZoneInfo(key='Europe/Berlin') first_date = datetime.datetime(2012, 12, 2, 7, 0) last_date = datetime.datetime(2012, 12, 3, 7, 0) def create_timezone( tz: pytz.BaseTzInfo, first_date: Optional[dt.datetime]=None, last_date: Optional[dt.datetime]=None ) -> icalendar.Timezone: """ create an icalendar vtimezone from a pytz.tzinfo object :param tz: the timezone :param first_date: the very first datetime that needs to be included in the transition times, typically the DTSTART value of the (first recurring) event :param last_date: the last datetime that needs to included, typically the end of the (very last) event (of a recursion set) :returns: timezone information we currently have a problem here: pytz.timezones only carry the absolute dates of time zone transitions, not their RRULEs. This will a) make for rather bloated VTIMEZONE components, especially for long recurring events, b) we'll need to specify for which time range this VTIMEZONE should be generated and c) will not be valid for recurring events that go into eternity. Possible Solutions: As this information is not provided by pytz at all, there is no easy solution, we'd really need to ship another version of the OLSON DB. """ if isinstance(tz, StaticTzInfo): return _create_timezone_static(tz) # TODO last_date = None, recurring to infinity first_date = dt.datetime.today() if not first_date else to_naive_utc(first_date) last_date = first_date + dt.timedelta(days=1) if not last_date else to_naive_utc(last_date) timezone = icalendar.Timezone() timezone.add('TZID', tz) dst = { one[2]: 'DST' in two.__repr__() > for one, two in iter(tz._tzinfos.items()) # type: ignore } E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute '_tzinfos' khal/khalendar/event.py:903: AttributeError ----------------------------- Captured stderr call ----------------------------- warning: Invalid timezone offset encountered, timezone information may be wrong: Offset must be less than 24 hours, was +5328 __________________________ TestExpand.test_expand_dt ___________________________ self = def test_expand_dt(self): vevent = _get_vevent(event_dt) > dtstart = icalendar_helpers.expand(vevent, berlin) tests/khalendar_utils_test.py:316: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/icalendar.py:315: in expand dtstartl = set(rrule) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ date = datetime.datetime(2013, 3, 1, 14, 0) def sanitize_datetime(date): if allday and isinstance(date, dt.datetime): date = date.date() if events_tz is not None: > date = events_tz.localize(date) E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute 'localize' khal/icalendar.py:256: AttributeError __________________________ TestExpand.test_expand_dtb __________________________ self = def test_expand_dtb(self): vevent = _get_vevent(event_dtb) > dtstart = icalendar_helpers.expand(vevent, berlin) tests/khalendar_utils_test.py:324: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/icalendar.py:315: in expand dtstartl = set(rrule) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ date = datetime.datetime(2013, 3, 1, 14, 0) def sanitize_datetime(date): if allday and isinstance(date, dt.datetime): date = date.date() if events_tz is not None: > date = events_tz.localize(date) E AttributeError: '_tzicalvtz' object has no attribute 'localize' khal/icalendar.py:256: AttributeError _________________________ TestExpand.test_expand_dttz __________________________ self = def test_expand_dttz(self): vevent = _get_vevent(event_dttz) > dtstart = icalendar_helpers.expand(vevent, berlin) tests/khalendar_utils_test.py:332: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/icalendar.py:315: in expand dtstartl = set(rrule) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ date = datetime.datetime(2013, 3, 1, 14, 0) def sanitize_datetime(date): if allday and isinstance(date, dt.datetime): date = date.date() if events_tz is not None: > date = events_tz.localize(date) E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute 'localize' khal/icalendar.py:256: AttributeError ____________________ TestExpand.test_expand_invalid_exdate _____________________ self = def test_expand_invalid_exdate(self): """testing if we can expand an event with EXDATEs that do not much its RRULE""" vevent = _get_vevent_file('event_invalid_exdate') > dtstartl = icalendar_helpers.expand(vevent, berlin) tests/khalendar_utils_test.py:363: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/icalendar.py:315: in expand dtstartl = set(rrule) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ date = datetime.datetime(2011, 11, 12, 15, 50) def sanitize_datetime(date): if allday and isinstance(date, dt.datetime): date = date.date() if events_tz is not None: > date = events_tz.localize(date) E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute 'localize' khal/icalendar.py:256: AttributeError ____________________ TestExpandNoRR.test_expand_dtr_exdatez ____________________ self = def test_expand_dtr_exdatez(self): """a recurring event with an EXDATE in Zulu time while DTSTART is localized""" vevent = _get_vevent_file('event_dtr_exdatez') > dtstart = icalendar_helpers.expand(vevent, berlin) tests/khalendar_utils_test.py:442: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/icalendar.py:315: in expand dtstartl = set(rrule) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ date = datetime.datetime(2014, 6, 30, 7, 30) def sanitize_datetime(date): if allday and isinstance(date, dt.datetime): date = date.date() if events_tz is not None: > date = events_tz.localize(date) E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute 'localize' khal/icalendar.py:256: AttributeError _________________________ TestSpecial.test_until_notz __________________________ self = def test_until_notz(self): vevent = _get_vevent(vevent_until_notz) > dtstart = icalendar_helpers.expand(vevent, berlin) tests/khalendar_utils_test.py:593: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/icalendar.py:315: in expand dtstartl = set(rrule) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ date = datetime.datetime(2014, 2, 3, 7, 0) def sanitize_datetime(date): if allday and isinstance(date, dt.datetime): date = date.date() if events_tz is not None: > date = events_tz.localize(date) E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute 'localize' khal/icalendar.py:256: AttributeError _______________________ TestSpecial.test_event_exdate_dt _______________________ self = def test_event_exdate_dt(self): """recurring event, one date excluded via EXCLUDE""" vevent = _get_vevent(event_exdate_dt) > dtstart = icalendar_helpers.expand(vevent, berlin) tests/khalendar_utils_test.py:625: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/icalendar.py:315: in expand dtstartl = set(rrule) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ date = datetime.datetime(2014, 7, 2, 19, 0) def sanitize_datetime(date): if allday and isinstance(date, dt.datetime): date = date.date() if events_tz is not None: > date = events_tz.localize(date) E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute 'localize' khal/icalendar.py:256: AttributeError ______________________ TestSpecial.test_event_exdates_dt _______________________ self = def test_event_exdates_dt(self): """recurring event, two dates excluded via EXCLUDE""" vevent = _get_vevent(event_exdates_dt) > dtstart = icalendar_helpers.expand(vevent, berlin) tests/khalendar_utils_test.py:635: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/icalendar.py:315: in expand dtstartl = set(rrule) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ date = datetime.datetime(2014, 7, 2, 19, 0) def sanitize_datetime(date): if allday and isinstance(date, dt.datetime): date = date.date() if events_tz is not None: > date = events_tz.localize(date) E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute 'localize' khal/icalendar.py:256: AttributeError ______________________ TestSpecial.test_event_exdatesl_dt ______________________ self = def test_event_exdatesl_dt(self): """recurring event, three dates exclude via two EXCLUDEs""" vevent = _get_vevent(event_exdatesl_dt) > dtstart = icalendar_helpers.expand(vevent, berlin) tests/khalendar_utils_test.py:645: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/icalendar.py:315: in expand dtstartl = set(rrule) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ date = datetime.datetime(2014, 7, 2, 19, 0) def sanitize_datetime(date): if allday and isinstance(date, dt.datetime): date = date.date() if events_tz is not None: > date = events_tz.localize(date) E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute 'localize' khal/icalendar.py:256: AttributeError ____________________ TestSpecial.test_event_exdates_remove _____________________ self = def test_event_exdates_remove(self): """check if we can remove one more instance""" vevent = _get_vevent(event_exdatesl_dt) > dtstart = icalendar_helpers.expand(vevent, berlin) tests/khalendar_utils_test.py:655: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/icalendar.py:315: in expand dtstartl = set(rrule) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ date = datetime.datetime(2014, 7, 2, 19, 0) def sanitize_datetime(date): if allday and isinstance(date, dt.datetime): date = date.date() if events_tz is not None: > date = events_tz.localize(date) E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute 'localize' khal/icalendar.py:256: AttributeError ________________ TestSpecial.test_event_dt_rrule_invalid_until2 ________________ self = def test_event_dt_rrule_invalid_until2(self): """same as above, but now dtstart is of type date and until is datetime """ vevent = _get_vevent(_get_text('event_dt_rrule_invalid_until2')) > dtstart = icalendar_helpers.expand(vevent, berlin) tests/khalendar_utils_test.py:681: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/icalendar.py:315: in expand dtstartl = set(rrule) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ date = datetime.datetime(2014, 4, 9, 9, 30) def sanitize_datetime(date): if allday and isinstance(date, dt.datetime): date = date.date() if events_tz is not None: > date = events_tz.localize(date) E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute 'localize' khal/icalendar.py:256: AttributeError _________________________ TestRDate.test_simple_rdate __________________________ self = def test_simple_rdate(self): vevent = _get_vevent(simple_rdate) > dtstart = icalendar_helpers.expand(vevent, berlin) tests/khalendar_utils_test.py:727: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/icalendar.py:335: in expand dtstartl.update(get_dates(vevent, 'RDATE') or ()) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ date = datetime.datetime(2013, 12, 13, 19, 0) def sanitize_datetime(date): if allday and isinstance(date, dt.datetime): date = date.date() if events_tz is not None: > date = events_tz.localize(date) E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute 'localize' khal/icalendar.py:256: AttributeError ________________________ TestRDate.test_rrule_and_rdate ________________________ self = def test_rrule_and_rdate(self): vevent = _get_vevent(rrule_and_rdate) > dtstart = icalendar_helpers.expand(vevent, berlin) tests/khalendar_utils_test.py:732: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ khal/icalendar.py:315: in expand dtstartl = set(rrule) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ date = datetime.datetime(2013, 3, 1, 14, 0) def sanitize_datetime(date): if allday and isinstance(date, dt.datetime): date = date.date() if events_tz is not None: > date = events_tz.localize(date) E AttributeError: 'zoneinfo.ZoneInfo' object has no attribute 'localize' khal/icalendar.py:256: AttributeError _________________________________ test_bogota __________________________________ def test_bogota(): vbogota = [b'BEGIN:VTIMEZONE', b'TZID:America/Bogota', b'BEGIN:STANDARD', b'DTSTART:19930206T230000', b'TZNAME:COT', b'TZOFFSETFROM:-0400', b'TZOFFSETTO:-0500', b'END:STANDARD', b'END:VTIMEZONE', b''] if version.parse(pytz.__version__) > version.Version('2017.1'): vbogota[4] = b'TZNAME:-05' vbogota.insert(4, b'RDATE:20380118T221407') > assert create_timezone(bogota, atime, atime).to_ical().split(b'\r\n') == vbogota E AssertionError: assert [b'BEGIN:VTIM...M:-0400', ...] == [b'BEGIN:VTIM...AME:-05', ...] E E At index 4 diff: b'TZNAME:-05' != b'RDATE:20380118T221407' E Right contains one more item: b'' E Use -v to get more diff tests/vtimezone_test.py:82: AssertionError =============================== warnings summary =============================== tests/backend_test.py:5 /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.12_khal/build/tests/backend_test.py:5: DeprecationWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html import pkg_resources tests/backend_test.py::test_event_rrule_recurrence_id /usr/lib/python3.12/inspect.py:1007: DeprecationWarning: urwid.lcd_display is moved to urwid.display.lcd if ismodule(module) and hasattr(module, '__file__'): tests/backend_test.py::test_event_rrule_recurrence_id /usr/lib/python3.12/inspect.py:1008: DeprecationWarning: urwid.lcd_display is moved to urwid.display.lcd f = module.__file__ tests/backend_test.py::test_event_rrule_recurrence_id /usr/lib/python3.12/inspect.py:914: DeprecationWarning: urwid.lcd_display is moved to urwid.display.lcd if getattr(object, '__file__', None): tests/backend_test.py::test_event_rrule_recurrence_id /usr/lib/python3.12/inspect.py:915: DeprecationWarning: urwid.lcd_display is moved to urwid.display.lcd return object.__file__ tests/backend_test.py::test_event_rrule_recurrence_id /usr/lib/python3.12/inspect.py:1007: DeprecationWarning: urwid.html_fragment is moved to urwid.display.html_fragment if ismodule(module) and hasattr(module, '__file__'): tests/backend_test.py::test_event_rrule_recurrence_id /usr/lib/python3.12/inspect.py:1008: DeprecationWarning: urwid.html_fragment is moved to urwid.display.html_fragment f = module.__file__ tests/backend_test.py::test_event_rrule_recurrence_id /usr/lib/python3.12/inspect.py:914: DeprecationWarning: urwid.html_fragment is moved to urwid.display.html_fragment if getattr(object, '__file__', None): tests/backend_test.py::test_event_rrule_recurrence_id /usr/lib/python3.12/inspect.py:915: DeprecationWarning: urwid.html_fragment is moved to urwid.display.html_fragment return object.__file__ tests/backend_test.py::test_event_rrule_recurrence_id /usr/lib/python3.12/inspect.py:1007: DeprecationWarning: urwid.web_display is moved to urwid.display.web if ismodule(module) and hasattr(module, '__file__'): tests/backend_test.py::test_event_rrule_recurrence_id /usr/lib/python3.12/inspect.py:1008: DeprecationWarning: urwid.web_display is moved to urwid.display.web f = module.__file__ tests/backend_test.py::test_event_rrule_recurrence_id /usr/lib/python3.12/inspect.py:914: DeprecationWarning: urwid.web_display is moved to urwid.display.web if getattr(object, '__file__', None): tests/backend_test.py::test_event_rrule_recurrence_id /usr/lib/python3.12/inspect.py:915: DeprecationWarning: urwid.web_display is moved to urwid.display.web return object.__file__ tests/backend_test.py::test_event_rrule_recurrence_id /usr/lib/python3.12/inspect.py:1007: DeprecationWarning: urwid.monitored_list is moved to urwid.widget.monitored_list if ismodule(module) and hasattr(module, '__file__'): tests/backend_test.py::test_event_rrule_recurrence_id /usr/lib/python3.12/inspect.py:1008: DeprecationWarning: urwid.monitored_list is moved to urwid.widget.monitored_list f = module.__file__ tests/backend_test.py::test_event_rrule_recurrence_id /usr/lib/python3.12/inspect.py:914: DeprecationWarning: urwid.monitored_list is moved to urwid.widget.monitored_list if getattr(object, '__file__', None): tests/backend_test.py::test_event_rrule_recurrence_id /usr/lib/python3.12/inspect.py:915: DeprecationWarning: urwid.monitored_list is moved to urwid.widget.monitored_list return object.__file__ tests/backend_test.py::test_event_rrule_recurrence_id /usr/lib/python3.12/inspect.py:1007: DeprecationWarning: urwid.listbox is moved to urwid.widget.listbox if ismodule(module) and hasattr(module, '__file__'): tests/backend_test.py::test_event_rrule_recurrence_id /usr/lib/python3.12/inspect.py:1008: DeprecationWarning: urwid.listbox is moved to urwid.widget.listbox f = module.__file__ tests/backend_test.py::test_event_rrule_recurrence_id /usr/lib/python3.12/inspect.py:914: DeprecationWarning: urwid.listbox is moved to urwid.widget.listbox if getattr(object, '__file__', None): tests/backend_test.py::test_event_rrule_recurrence_id /usr/lib/python3.12/inspect.py:915: DeprecationWarning: urwid.listbox is moved to urwid.widget.listbox return object.__file__ tests/backend_test.py::test_event_rrule_recurrence_id /usr/lib/python3.12/inspect.py:1007: DeprecationWarning: urwid.treetools is moved to urwid.widget.treetools if ismodule(module) and hasattr(module, '__file__'): tests/backend_test.py::test_event_rrule_recurrence_id /usr/lib/python3.12/inspect.py:1008: DeprecationWarning: urwid.treetools is moved to urwid.widget.treetools f = module.__file__ tests/backend_test.py::test_event_rrule_recurrence_id /usr/lib/python3.12/inspect.py:914: DeprecationWarning: urwid.treetools is moved to urwid.widget.treetools if getattr(object, '__file__', None): tests/backend_test.py::test_event_rrule_recurrence_id /usr/lib/python3.12/inspect.py:915: DeprecationWarning: urwid.treetools is moved to urwid.widget.treetools return object.__file__ tests/backend_test.py: 8 warnings tests/cli_test.py: 1 warning tests/khalendar_test.py: 3 warnings /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.12_khal/build/khal/khalendar/backend.py:517: DeprecationWarning: datetime.datetime.utcfromtimestamp() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.fromtimestamp(timestamp, datetime.UTC). start = pytz.UTC.localize(dt.datetime.utcfromtimestamp(start_timestamp)) tests/backend_test.py: 8 warnings tests/cli_test.py: 1 warning tests/khalendar_test.py: 3 warnings /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.12_khal/build/khal/khalendar/backend.py:518: DeprecationWarning: datetime.datetime.utcfromtimestamp() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.fromtimestamp(timestamp, datetime.UTC). end = pytz.UTC.localize(dt.datetime.utcfromtimestamp(end_timestamp)) tests/backend_test.py: 34 warnings tests/cli_test.py: 2 warnings tests/controller_test.py: 3 warnings tests/khalendar_test.py: 15 warnings /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.12_khal/build/khal/khalendar/backend.py:563: DeprecationWarning: datetime.datetime.utcfromtimestamp() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.fromtimestamp(timestamp, datetime.UTC). start_dt = dt.datetime.utcfromtimestamp(start_s) tests/backend_test.py: 34 warnings tests/cli_test.py: 2 warnings tests/controller_test.py: 3 warnings tests/khalendar_test.py: 15 warnings /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.12_khal/build/khal/khalendar/backend.py:564: DeprecationWarning: datetime.datetime.utcfromtimestamp() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.fromtimestamp(timestamp, datetime.UTC). end_dt = dt.datetime.utcfromtimestamp(end_s) tests/backend_test.py::test_event_recuid_rrule_no_master tests/backend_test.py::test_event_recuid_rrule_no_master tests/cli_test.py::test_import_proper tests/cli_test.py::test_import_invalid_choice_and_prefix tests/cli_test.py::test_edit tests/khalendar_test.py::TestCollection::test_search_recurrence_id_only tests/khalendar_test.py::TestCollection::test_search_recurrence_id_only_multi tests/khalendar_test.py::TestCollection::test_search_recurrence_id_only_multi /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.12_khal/build/khal/khalendar/backend.py:614: DeprecationWarning: datetime.datetime.utcfromtimestamp() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.fromtimestamp(timestamp, datetime.UTC). start = dt.datetime.utcfromtimestamp(start) tests/backend_test.py::test_event_recuid_rrule_no_master tests/backend_test.py::test_event_recuid_rrule_no_master tests/cli_test.py::test_import_proper tests/cli_test.py::test_import_invalid_choice_and_prefix tests/cli_test.py::test_edit tests/khalendar_test.py::TestCollection::test_search_recurrence_id_only tests/khalendar_test.py::TestCollection::test_search_recurrence_id_only_multi tests/khalendar_test.py::TestCollection::test_search_recurrence_id_only_multi /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.12_khal/build/khal/khalendar/backend.py:615: DeprecationWarning: datetime.datetime.utcfromtimestamp() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.fromtimestamp(timestamp, datetime.UTC). end = dt.datetime.utcfromtimestamp(end) tests/cli_test.py::test_edit /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.12_khal/build/khal/khalendar/backend.py:597: DeprecationWarning: datetime.datetime.utcfromtimestamp() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.fromtimestamp(timestamp, datetime.UTC). start = pytz.UTC.localize(dt.datetime.utcfromtimestamp(start)) tests/cli_test.py::test_edit /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.12_khal/build/khal/khalendar/backend.py:598: DeprecationWarning: datetime.datetime.utcfromtimestamp() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.fromtimestamp(timestamp, datetime.UTC). end = pytz.UTC.localize(dt.datetime.utcfromtimestamp(end)) tests/controller_test.py::TestImport::test_mix_datetime_types tests/controller_test.py::TestImport::test_mix_datetime_types /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.12_khal/build/khal/icalendar.py:81: DeprecationWarning: The 'warn' method is deprecated, use 'warning' instead logger.warn(f'Error when trying to import the event {uid}') -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info ============================ FAILED tests/backend_test.py::test_event_rrule_recurrence_id - AttributeError... FAILED tests/backend_test.py::test_event_rrule_recurrence_id_reverse - Attrib... FAILED tests/backend_test.py::test_event_rrule_recurrence_id_update_with_exclude FAILED tests/backend_test.py::test_event_delete - AttributeError: 'zoneinfo.Z... FAILED tests/backend_test.py::test_this_and_prior - AttributeError: 'zoneinfo... FAILED tests/backend_test.py::test_event_rrule_this_and_future - AttributeErr... FAILED tests/backend_test.py::test_event_rrule_this_and_future_multi_day_shift FAILED tests/backend_test.py::test_two_calendars_same_uid - AttributeError: '... FAILED tests/cli_test.py::test_simple - assert not AttributeError("'zoneinfo.... FAILED tests/cli_test.py::test_simple_color - assert not AttributeError("'zon... FAILED tests/cli_test.py::test_days - assert not AttributeError("'zoneinfo.Zo... FAILED tests/cli_test.py::test_notstarted - assert not AttributeError("'zonei... FAILED tests/cli_test.py::test_invalid_calendar - assert not AttributeError("... FAILED tests/cli_test.py::test_list - AssertionError: assert False FAILED tests/cli_test.py::test_search - AssertionError: assert False FAILED tests/cli_test.py::test_import_proper_invalid_timezone - assert not Sy... FAILED tests/cli_test.py::test_edit - assert not AttributeError("'zoneinfo.Zo... FAILED tests/cli_test.py::test_new_interactive - assert not AttributeError("'... FAILED tests/cli_test.py::test_new_interactive_extensive - assert not Attribu... FAILED tests/cli_test.py::test_issue_1056 - assert not AttributeError("'zonei... FAILED tests/controller_test.py::TestImport::test_import - AttributeError: 'z... FAILED tests/controller_test.py::TestImport::test_mix_datetime_types - khal.e... FAILED tests/event_test.py::test_raw_dt - AttributeError: 'zoneinfo.ZoneInfo'... FAILED tests/event_test.py::test_update_simple - AttributeError: 'zoneinfo.Zo... FAILED tests/event_test.py::test_add_url - AttributeError: 'zoneinfo.ZoneInfo... FAILED tests/event_test.py::test_do_not_save_empty_location - AttributeError:... FAILED tests/event_test.py::test_do_not_save_empty_description - AttributeErr... FAILED tests/event_test.py::test_do_not_save_empty_url - AttributeError: 'zon... FAILED tests/event_test.py::test_remove_existing_location_if_set_to_empty - A... FAILED tests/event_test.py::test_remove_existing_description_if_set_to_empty FAILED tests/event_test.py::test_remove_existing_url_if_set_to_empty - Attrib... FAILED tests/event_test.py::test_update_remove_categories - AttributeError: '... FAILED tests/event_test.py::test_transform_event - AttributeError: 'zoneinfo.... FAILED tests/event_test.py::test_dt_two_tz - AttributeError: 'zoneinfo.ZoneIn... FAILED tests/event_test.py::test_event_no_dst - AttributeError: 'zoneinfo.Zon... FAILED tests/event_test.py::test_event_raw_UTC - AttributeError: 'zoneinfo.Zo... FAILED tests/event_test.py::test_multi_uid - AttributeError: 'zoneinfo.ZoneIn... FAILED tests/event_test.py::test_remove_instance_from_recuid - AttributeError... FAILED tests/icalendar_test.py::test_split_ics - AttributeError: module 'ical... FAILED tests/icalendar_test.py::test_split_ics_random_uid - AttributeError: m... FAILED tests/icalendar_test.py::test_windows_timezone - AttributeError: modul... FAILED tests/khalendar_test.py::TestCollection::test_insert - AttributeError:... FAILED tests/khalendar_test.py::TestCollection::test_get - AttributeError: 'z... FAILED tests/khalendar_test.py::TestCollection::test_change - AttributeError:... FAILED tests/khalendar_test.py::TestCollection::test_update_event - Attribute... FAILED tests/khalendar_test.py::TestCollection::test_search - AttributeError:... FAILED tests/khalendar_test.py::TestCollection::test_delete_two_events - Attr... FAILED tests/khalendar_test.py::TestCollection::test_delete_recuid - Attribut... FAILED tests/khalendar_test.py::TestCollection::test_invalid_timezones - Attr... FAILED tests/khalendar_utils_test.py::TestExpand::test_expand_dt - AttributeE... FAILED tests/khalendar_utils_test.py::TestExpand::test_expand_dtb - Attribute... FAILED tests/khalendar_utils_test.py::TestExpand::test_expand_dttz - Attribut... FAILED tests/khalendar_utils_test.py::TestExpand::test_expand_invalid_exdate FAILED tests/khalendar_utils_test.py::TestExpandNoRR::test_expand_dtr_exdatez FAILED tests/khalendar_utils_test.py::TestSpecial::test_until_notz - Attribut... FAILED tests/khalendar_utils_test.py::TestSpecial::test_event_exdate_dt - Att... FAILED tests/khalendar_utils_test.py::TestSpecial::test_event_exdates_dt - At... FAILED tests/khalendar_utils_test.py::TestSpecial::test_event_exdatesl_dt - A... FAILED tests/khalendar_utils_test.py::TestSpecial::test_event_exdates_remove FAILED tests/khalendar_utils_test.py::TestSpecial::test_event_dt_rrule_invalid_until2 FAILED tests/khalendar_utils_test.py::TestRDate::test_simple_rdate - Attribut... FAILED tests/khalendar_utils_test.py::TestRDate::test_rrule_and_rdate - Attri... FAILED tests/vtimezone_test.py::test_bogota - AssertionError: assert [b'BEGIN... ===== 63 failed, 249 passed, 2 xfailed, 1 xpassed, 177 warnings in 15.17s ====== E: pybuild pybuild:389: test: plugin distutils failed with: exit code=1: cd /build/reproducible-path/khal-0.11.3/.pybuild/cpython3_3.12_khal/build; python3.12 -m pytest tests dh_auto_test: error: pybuild --test --test-pytest -i python{version} -p "3.13 3.12" returned exit code 13 make[1]: *** [debian/rules:58: override_dh_auto_test] Error 25 make[1]: Leaving directory '/build/reproducible-path/khal-0.11.3' make: *** [debian/rules:17: binary] Error 2 dpkg-buildpackage: error: debian/rules binary subprocess returned exit status 2 I: copying local configuration E: Failed autobuilding of package I: unmounting dev/ptmx filesystem I: unmounting dev/pts filesystem I: unmounting dev/shm filesystem I: unmounting proc filesystem I: unmounting sys filesystem I: cleaning the build env I: removing directory /srv/workspace/pbuilder/12131 and its subdirectories