Example #1
1
    def test_issue_142(self):
        """Issue #142 - Multivalued parameters
        This is needed for VCard 3.0.
        https://github.com/collective/icalendar/pull/142
        """
        from icalendar.parser import Contentline, Parameters

        ctl = Contentline.from_ical("TEL;TYPE=HOME,VOICE:000000000")

        self.assertEqual(
            ctl.parts(),
            (u'TEL', Parameters({'TYPE': ['HOME', 'VOICE']}), u'000000000'),
        )
Example #2
1
    def test_issue_143(self):
        """Issue #143 - Allow dots in property names.
        Another vCard related issue.
        https://github.com/collective/icalendar/pull/143
        """
        from icalendar.parser import Contentline, Parameters

        ctl = Contentline.from_ical("ITEMADRNULLTHISISTHEADRESS08158SOMECITY12345.ADR:;;This is the Adress 08; Some City;;12345;Germany")  # nopep8
        self.assertEqual(
            ctl.parts(),
            (u'ITEMADRNULLTHISISTHEADRESS08158SOMECITY12345.ADR',
             Parameters(),
             u';;This is the Adress 08; Some City;;12345;Germany'),
        )

        ctl2 = Contentline.from_ical("ITEMADRNULLTHISISTHEADRESS08158SOMECITY12345.X-ABLABEL:")  # nopep8
        self.assertEqual(
            ctl2.parts(),
            (u'ITEMADRNULLTHISISTHEADRESS08158SOMECITY12345.X-ABLABEL',
             Parameters(),
             u''),
        )
Example #3
1
    def from_ical(cls, st, multiple=False):
        """Populates the component recursively from a string.
        """
        stack = []  # a stack of components
        comps = []
        previous_line = None
        for line in Contentlines.from_ical(st):  # raw parsing
            if not line:
                continue

            try:
                name, params, vals = line.parts()
                previous_line = line
            except ValueError as err:
                # if unable to parse a line within a component
                # that ignores exceptions, mark the component
                # as broken and skip the line. otherwise raise.
                try:
                    if previous_line and name in NEWLINE_FIX_NAMES:
                        try:
                            #Try to generate line from last name key (fix malformed line breaks)
                            new_line = Contentline.from_ical(
                                previous_line + escape_char('\n') + line)
                            name, params, vals = new_line.parts()
                            component = stack[-1]
                            component.pop(name)
                            previous_line = new_line
                        except:
                            raise
                    else:
                        raise
                except ValueError as err: 
                    component = stack[-1] if stack else None
                    if not component or not component.ignore_exceptions:
                        raise
                    component.is_broken = True
                    print "Broken: " + str(component)
                    continue

            uname = name.upper()
            # check for start of component
            if uname == 'BEGIN':
                # try and create one of the components defined in the spec,
                # otherwise get a general Components for robustness.
                c_name = vals.upper()
                c_class = component_factory.get(c_name, cls)
                component = c_class()
                if not getattr(component, 'name', ''):  # undefined components
                    component.name = c_name
                stack.append(component)
            # check for end of event
            elif uname == 'END':
                # we are done adding properties to this component
                # so pop it from the stack and add it to the new top.
                component = stack.pop()
                if not stack:  # we are at the end
                    comps.append(component)
                else:
                    if not component.is_broken:
                        stack[-1].add_component(component)
            # we are adding properties to the current top of the stack
            else:
                factory = types_factory.for_property(name)
                component = stack[-1]
                datetime_names = ('DTSTART', 'DTEND', 'RECURRENCE-ID', 'DUE',
                                  'FREEBUSY', 'RDATE', 'EXDATE')
                try:
                    if name in datetime_names and 'TZID' in params:
                        vals = factory(factory.from_ical(vals, params['TZID']))
                    else:
                        vals = factory(factory.from_ical(vals))
                except ValueError:
                    if not component.ignore_exceptions:
                        raise
                    component.is_broken = True
                else:
                    vals.params = params
                    component.add(name, vals, encode=0)

        if multiple:
            return comps
        if len(comps) > 1:
            raise ValueError('Found multiple components where '
                             'only one is allowed: {st!r}'.format(**locals()))
        if len(comps) < 1:
            #Fix missing END:VCALENDAR flag problem
            if len(stack)==1 and stack[-1].name == u'VCALENDAR':
                component = stack.pop()
                comps.append(component)
            else:
                raise ValueError('Found no components where '
                                 'exactly one is required: '
                                 '{st!r}'.format(**locals()))
        return comps[0]
Example #4
0
 def testHmm(self):
     from icalendar.parser import Contentlines, Contentline
     c = Contentlines([Contentline('BEGIN:VEVENT\r\n')])
     c.append(Contentline(''.join(['123456789 ']*10)+'\r\n'))
     output = str(c)
     self.assertEqual(output, 
             'BEGIN:VEVENT\r\n\r\n123456789 123456789 123456789 123456789 123456789 123456789 123456789 1234\r\n 56789 123456789 123456789 \r\n')
Example #5
0
 def XtestLongLine(self):
     from icalendar.parser import Contentlines, Contentline
     c = Contentlines([Contentline('BEGIN:VEVENT\\r\\n')])
     c.append(Contentline(''.join(['123456789 ']*10)+'\\r\\n'))
     import pdb ; pdb.set_trace()
     output = str(c)
     self.assertEqual(output, 
             "BEGIN:VEVENT\\r\\n\\r\\n123456789 123456789 123456789 123456789 123456789 123456789 123456789 1234\\r\\n 56789 123456789 123456789 \\r\\n")
Example #6
0
 def test_long_lines(self):
     from icalendar.parser import Contentlines, Contentline
     c = Contentlines([Contentline('BEGIN:VEVENT\r\n')])
     c.append(Contentline(''.join('123456789 ' * 10) + '\r\n'))
     self.assertEqual(
         c.to_ical(),
         'BEGIN:VEVENT\r\n\r\n123456789 123456789 123456789 123456789 '
         '123456789 123456789 123456789 1234\r\n 56789 123456789 '
         '123456789 \r\n\r\n')
Example #7
0
 def XtestLongLine(self):
     from icalendar.parser import Contentlines, Contentline
     c = Contentlines([Contentline('BEGIN:VEVENT\\r\\n')])
     c.append(Contentline(''.join(['123456789 '] * 10) + '\\r\\n'))
     output = c.to_ical()
     cmp = ("BEGIN:VEVENT\\r\\n\\r\\n123456789 123456789 123456789 "
            "123456789 123456789 123456789 123456789 1234\\r\\n 56789 "
            "123456789 123456789 \\r\\n")
     self.assertEqual(output, cmp)
Example #8
0
 def testHmm(self):
     from icalendar.parser import Contentlines, Contentline
     c = Contentlines([Contentline('BEGIN:VEVENT\r\n')])
     c.append(Contentline(''.join(['123456789 '] * 10) + '\r\n'))
     output = c.to_ical()
     # XXX: sure? looks weird in conjunction with generated content above.
     #cmp = ('BEGIN:VEVENT\r\n\r\n123456789 123456789 123456789 123456789 '
     #       '123456789 123456789 123456789 1234\r\n 56789 123456789 '
     #       '123456789 \r\n')
     cmp = ('BEGIN:VEVENT\r\n\r\n123456789 123456789 123456789 123456789 '
            '123456789 123456789 123456789 \r\n 123456789 123456789 '
            '123456789 \r\n\r\n')
     self.assertEqual(output, cmp)
Example #9
0
    def test_main(self, lines):
        cl = Contentlines()
        for key, params, value in lines:
            params = Parameters(**params)
            cl.append(Contentline.from_parts(key, params, value))
        cl.append('')

        assert Contentlines.from_ical(cl.to_ical()) == cl
Example #10
0
 def content_lines(self):
     "Converts the Component and subcomponents into content lines"
     contentlines = Contentlines()
     for name, values in self.property_items():
         params = getattr(values, 'params', Parameters())
         contentlines.append(Contentline.from_parts((name, params, values)))
     contentlines.append('') # remember the empty string in the end
     return contentlines
Example #11
0
 def content_lines(self):
     "Converts the Component and subcomponents into content lines"
     contentlines = Contentlines()
     for name, values in self.property_items():
         params = getattr(values, 'params', Parameters())
         contentlines.append(Contentline.from_parts((name, params, values)))
     contentlines.append('')  # remember the empty string in the end
     return contentlines
Example #12
0
    def test_main(self, lines):
        cl = Contentlines()
        for key, params, value in lines:
            try:
                params = Parameters(**params)
            except TypeError:
                # Happens when there is a random parameter 'self'...
                continue
            cl.append(Contentline.from_parts(key, params, value))
        cl.append('')

        assert Contentlines.from_ical(cl.to_ical()) == cl
Example #13
0
    def test_issue_142(self):
        """Issue #142 - Multivalued parameters
        This is needed for VCard 3.0.
        https://github.com/collective/icalendar/pull/142
        """
        from icalendar.parser import Contentline, Parameters

        ctl = Contentline.from_ical("TEL;TYPE=HOME,VOICE:000000000")

        self.assertEqual(
            ctl.parts(),
            (u'TEL', Parameters({'TYPE': ['HOME', 'VOICE']}), u'000000000'),
        )
Example #14
0
    def test_issue_143(self):
        """Issue #143 - Allow dots in property names.
        Another vCard related issue.
        https://github.com/collective/icalendar/pull/143
        """
        from icalendar.parser import Contentline, Parameters

        ctl = Contentline.from_ical(
            "ITEMADRNULLTHISISTHEADRESS08158SOMECITY12345.ADR:;;This is the Adress 08; Some City;;12345;Germany"
        )  # nopep8
        self.assertEqual(
            ctl.parts(),
            (u'ITEMADRNULLTHISISTHEADRESS08158SOMECITY12345.ADR', Parameters(),
             u';;This is the Adress 08; Some City;;12345;Germany'),
        )

        ctl2 = Contentline.from_ical(
            "ITEMADRNULLTHISISTHEADRESS08158SOMECITY12345.X-ABLABEL:"
        )  # nopep8
        self.assertEqual(
            ctl2.parts(),
            (u'ITEMADRNULLTHISISTHEADRESS08158SOMECITY12345.X-ABLABEL',
             Parameters(), u''),
        )
Example #15
0
    def from_ical(cls, st, multiple=False):
        """Populates the component recursively from a string.
        """
        stack = []  # a stack of components
        comps = []
        previous_line = None
        for line in Contentlines.from_ical(st):  # raw parsing
            if not line:
                continue

            try:
                name, params, vals = line.parts()
                previous_line = line
            except ValueError as err:
                # if unable to parse a line within a component
                # that ignores exceptions, mark the component
                # as broken and skip the line. otherwise raise.
                try:
                    if previous_line and name in NEWLINE_FIX_NAMES:
                        try:
                            #Try to generate line from last name key (fix malformed line breaks)
                            new_line = Contentline.from_ical(
                                previous_line + escape_char('\n') + line)
                            name, params, vals = new_line.parts()
                            component = stack[-1]
                            component.pop(name)
                            previous_line = new_line
                        except:
                            raise
                    else:
                        raise
                except ValueError as err:
                    component = stack[-1] if stack else None
                    if not component or not component.ignore_exceptions:
                        raise
                    component.is_broken = True
                    print "Broken: " + str(component)
                    continue

            uname = name.upper()
            # check for start of component
            if uname == 'BEGIN':
                # try and create one of the components defined in the spec,
                # otherwise get a general Components for robustness.
                c_name = vals.upper()
                c_class = component_factory.get(c_name, cls)
                component = c_class()
                if not getattr(component, 'name', ''):  # undefined components
                    component.name = c_name
                stack.append(component)
            # check for end of event
            elif uname == 'END':
                # we are done adding properties to this component
                # so pop it from the stack and add it to the new top.
                component = stack.pop()
                if not stack:  # we are at the end
                    comps.append(component)
                else:
                    if not component.is_broken:
                        stack[-1].add_component(component)
            # we are adding properties to the current top of the stack
            else:
                factory = types_factory.for_property(name)
                component = stack[-1]
                datetime_names = ('DTSTART', 'DTEND', 'RECURRENCE-ID', 'DUE',
                                  'FREEBUSY', 'RDATE', 'EXDATE')
                try:
                    if name in datetime_names and 'TZID' in params:
                        vals = factory(factory.from_ical(vals, params['TZID']))
                    else:
                        vals = factory(factory.from_ical(vals))
                except ValueError:
                    if not component.ignore_exceptions:
                        raise
                    component.is_broken = True
                else:
                    vals.params = params
                    component.add(name, vals, encode=0)

        if multiple:
            return comps
        if len(comps) > 1:
            raise ValueError('Found multiple components where '
                             'only one is allowed: {st!r}'.format(**locals()))
        if len(comps) < 1:
            #Fix missing END:VCALENDAR flag problem
            if len(stack) == 1 and stack[-1].name == u'VCALENDAR':
                component = stack.pop()
                comps.append(component)
            else:
                raise ValueError('Found no components where '
                                 'exactly one is required: '
                                 '{st!r}'.format(**locals()))
        return comps[0]
Example #16
0
 def XtestTrailingNewline(self):
     from icalendar.parser import Contentlines, Contentline
     c = Contentlines([Contentline('BEGIN:VEVENT\\r\\n')])
     output = str(c)
     self.assertEqual(output, 'BEGIN:VEVENT\\r\\n')
Example #17
0
 def content_line(self, name, value, sorted=True):
     """Returns property as content line.
     """
     params = getattr(value, 'params', Parameters())
     return Contentline.from_parts(name, params, value, sorted=sorted)
Example #18
0
 def content_line(self, name, value, sorted=True):
     """Returns property as content line.
     """
     params = getattr(value, 'params', Parameters())
     return Contentline.from_parts(name, params, value, sorted=sorted)