ics-py / ics-py

Pythonic and easy iCalendar library (rfc5545)

Home Page:http://icspy.readthedocs.org/en/stable/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

ValueError: attribute TZNAME can only be set once, second occurrence is TZNAME='CET'

JulienPalard opened this issue · comments

reproducer:

from ics import Calendar
import requests
Calendar(requests.get('https://fr.ftp.opendatasoft.com/openscol/fr-en-calendrier-scolaire/Zone-C.ics').text)

It gives:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/mdk/Org/.venv/lib/python3.11/site-packages/ics/icalendar.py", line 90, in __init__
    self.populate(container)
  File "/home/mdk/Org/.venv/lib/python3.11/site-packages/ics/component.py", line 55, in populate
    ComponentMeta.BY_TYPE[type(self)].populate_instance(self, container, context)
  File "/home/mdk/Org/.venv/lib/python3.11/site-packages/ics/converter/component.py", line 147, in populate_instance
    self._populate_attrs(instance, container, context)
  File "/home/mdk/Org/.venv/lib/python3.11/site-packages/ics/converter/types/calendar.py", line 34, in _populate_attrs
    tz = Timezone.from_container(child)
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/mdk/Org/.venv/lib/python3.11/site-packages/ics/component.py", line 47, in from_container
    return ComponentMeta.BY_TYPE[cls].load_instance(container, context)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/mdk/Org/.venv/lib/python3.11/site-packages/ics/converter/types/timezone.py", line 28, in load_instance
    instance = super().load_instance(container, context)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/mdk/Org/.venv/lib/python3.11/site-packages/ics/converter/component.py", line 197, in load_instance
    self.populate_instance(comp, container, context)
  File "/home/mdk/Org/.venv/lib/python3.11/site-packages/ics/converter/component.py", line 147, in populate_instance
    self._populate_attrs(instance, container, context)
  File "/home/mdk/Org/.venv/lib/python3.11/site-packages/ics/converter/component.py", line 155, in _populate_attrs
    if conv.populate(instance, line, context):
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/mdk/Org/.venv/lib/python3.11/site-packages/ics/converter/types/timezone.py", line 52, in populate
    component, TimezoneDaylightObservance.from_container(item, context)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/mdk/Org/.venv/lib/python3.11/site-packages/ics/component.py", line 47, in from_container
    return ComponentMeta.BY_TYPE[cls].load_instance(container, context)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/mdk/Org/.venv/lib/python3.11/site-packages/ics/converter/component.py", line 197, in load_instance
    self.populate_instance(comp, container, context)
  File "/home/mdk/Org/.venv/lib/python3.11/site-packages/ics/converter/component.py", line 147, in populate_instance
    self._populate_attrs(instance, container, context)
  File "/home/mdk/Org/.venv/lib/python3.11/site-packages/ics/converter/component.py", line 155, in _populate_attrs
    if conv.populate(instance, line, context):
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/mdk/Org/.venv/lib/python3.11/site-packages/ics/converter/value.py", line 75, in populate
    raise ValueError(
ValueError: attribute TZNAME can only be set once, second occurrence is TZNAME='CET'

with:

$ pip list
Package             Version
------------------- ----------
attrs               22.2.0
certifi             2022.12.7
charset-normalizer  3.0.1
ics                 0.8.0.dev0
ics-vtimezones      2020.1
idna                3.4
importlib-resources 1.5.0
jours-feries-france 0.7.0
Levenshtein         0.20.9
pip                 23.0
python-dateutil     2.8.2
rapidfuzz           2.13.7
requests            2.28.2
setuptools          66.1.1
six                 1.16.0
urllib3             1.26.14

commented

Hi,

By looking at the file you try to parse, you can see this (L11-L18)

BEGIN:DAYLIGHT
DTSTART:19700329T020000
	TZNAME:CEST
	TZOFFSETFROM:+0100
	TZOFFSETTO:+0200
	RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=3;BYDAY=-1SU
	TZNAME:CET
END:DAYLIGHT

And there is indeed twice a line declaring TZNAME (CEST on L11 and CET on L17).
This is not allowed by the RFC5545: The following is OPTIONAL, but MUST NOT occur more than once.

This means your ics file is invalid and so ics-py refuses to parse it, there is not much more we can do on our side. If you remove L17 'by hand', you should be able to parse it :)

You're right, thanks for the explanations, happy holidays!