Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-caldav for openSUSE:Factory checked in at 2022-11-03 19:15:11 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-caldav (Old) and /work/SRC/openSUSE:Factory/.python-caldav.new.2275 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-caldav" Thu Nov 3 19:15:11 2022 rev:12 rq:1033143 version:0.10.0 Changes: -------- --- /work/SRC/openSUSE:Factory/python-caldav/python-caldav.changes 2022-10-14 15:43:55.040056466 +0200 +++ /work/SRC/openSUSE:Factory/.python-caldav.new.2275/python-caldav.changes 2022-11-03 19:15:52.692605080 +0100 @@ -1,0 +2,78 @@ +Thu Nov 3 17:38:12 UTC 2022 - Daniel Garcia <daniel.gar...@suse.com> + +- Add drop-python2-support.patch to remove python-six dependency + gh#python-caldav/caldav#228 +- Remove python_module macro definition +- Update to 0.10.0 + ## Quick summary + * Work on a universal search method + * Refactoring, consolidated lots of slightly duplicated code into one + method to rule them all + * Support for things needed by the calendar-cli utility, like search by + categories + * Support for completion of recurring tasks + * More utilities for tasks + * Uncomplete-method ... for undoing the complete (recurrences not supported + though) + * get/set duration/dtstart/dtend (arguably this belongs to vobject and/or + icalendar) + * Other improvements: + * picklable URLs + * display_name convenience method + * possible to set child/parent relationships + * Potential bugfix: sequence number may need to be increased when saving + something to the calendar (not backported, this may have side effects) + + ## Search method + Calendar now has a method search. Here is some information from the + docstring: + + Parameters supported: + * xml - use this search query, and ignore other filter parameters + * comp_class - set to event, todo or journal to restrict search to this + resource type. Some server implementations require this to be set. + * todo - sets comp_class to Todo, and restricts search to pending tasks, + unless the next parameter is set ... + * include_completed - include completed tasks + * event - sets comp_class to event + * text attribute search parameters: category, uid, summary, omment, + description, location, status + * expand - do server side expanding of recurring events/tasks + * start, stop: do a time range search + * filters - other kind of filters (in lxml tree format) + * sort_keys - list of attributes to use when sorting + + not supported yet: + * negated text match + * attribute not set + + ## Completed tasks + While the RFCs do support recurring tasks, they are not very clear on the + details. In v0.10 there are three different ways to complete a task. The + first one is to ignore the RRULE property and mark the task as completed. + This is the backwards-compatibility mode - though, according to my + understanding of a "recurring task" this is the wrong way to do it. + + The two other modes considers the task to be "interval based" is no BY-rules + are specified in the RRULE - meaning that if a task is supposed to be done + weekly, then a week should pass from it was completed and until one needs to + start with it again - no matter the DTSTART of the original instance - but + the standards may also be interpreted so that if the original task was to be + started at a Tuesday 10:00, then all recurrences should be started at a + Tuesday 10:00. + + Both the modes stores a copy of the completed task, for the record. The + "safe" mode stores the copy as a completely independent task, and modifies + the DTSTART/DUE of the original task - so the completed task is not linked up + to the recurring task. (One may eventually try to make a link by + establishing a "parent task"). + + The "thisandfuture"-mode will establish the completed task as a separate + recurrence in a recurrence set. The non-completed task is also duplicated + with a new DTSTART set and range set to THISANDFUTURE. As I understand the + RFC, this is the way to handle interval-based tasks, future recurrences will + then base their starting time on the DTSTART of the THISANDFUTURE task. For + fixed tasks the THISANDFUTURE recurrence is moot, so I'm considering to + create a third mode as well. + +------------------------------------------------------------------- Old: ---- caldav-0.9.2.tar.gz New: ---- caldav-0.10.0.tar.gz drop-python2-support.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-caldav.spec ++++++ --- /var/tmp/diff_new_pack.hFPkOY/_old 2022-11-03 19:15:53.136607691 +0100 +++ /var/tmp/diff_new_pack.hFPkOY/_new 2022-11-03 19:15:53.144607737 +0100 @@ -16,26 +16,25 @@ # -%{?!python_module:%define python_module() python-%{**} python3-%{**}} %global modname caldav Name: python-%{modname} -Version: 0.9.2 +Version: 0.10.0 Release: 0 Summary: CalDAV (RFC4791) client library for Python License: Apache-2.0 AND GPL-3.0-or-later Group: Development/Languages/Python URL: https://pypi.python.org/pypi/%{modname} Source: https://files.pythonhosted.org/packages/source/c/caldav/%{modname}-%{version}.tar.gz +# PATCH-FIX-UPSTREAM drop-python2-support.patch gh#python-caldav/caldav#228 +Patch1: drop-python2-support.patch BuildRequires: %{python_module lxml} BuildRequires: %{python_module requests} BuildRequires: %{python_module setuptools} -BuildRequires: %{python_module six} BuildRequires: %{python_module vobject} BuildRequires: fdupes BuildRequires: python-rpm-macros Requires: python-lxml Requires: python-requests -Requires: python-six Requires: python-vobject BuildArch: noarch %ifpython2 @@ -51,7 +50,7 @@ events, modify events and properties). %prep -%setup -q -n %{modname}-%{version} +%autosetup -p1 -n %{modname}-%{version} # Remove shebangs find caldav -name "*.py" | xargs sed -i '1 {/^#!/d}' ++++++ caldav-0.9.2.tar.gz -> caldav-0.10.0.tar.gz ++++++ ++++ 2547 lines of diff (skipped) ++++++ drop-python2-support.patch ++++++ Index: caldav-0.10.0/caldav/davclient.py =================================================================== --- caldav-0.10.0.orig/caldav/davclient.py +++ caldav-0.10.0/caldav/davclient.py @@ -4,7 +4,6 @@ import logging import re import requests -import six from caldav.elements import cdav from caldav.elements import dav from caldav.elements import ical @@ -21,10 +20,7 @@ from caldav.objects import ScheduleInbox from caldav.objects import ScheduleOutbox from lxml import etree -if six.PY3: - from urllib.parse import unquote -else: - from urlparse import unquote +from urllib.parse import unquote class DAVResponse: Index: caldav-0.10.0/caldav/elements/base.py =================================================================== --- caldav-0.10.0.orig/caldav/elements/base.py +++ caldav-0.10.0/caldav/elements/base.py @@ -3,7 +3,6 @@ from caldav.lib.namespace import nsmap from caldav.lib.python_utilities import to_unicode from lxml import etree -from six import PY3 class BaseElement(object): @@ -30,9 +29,7 @@ class BaseElement(object): utf8 = etree.tostring( self.xmlelement(), encoding="utf-8", xml_declaration=True, pretty_print=True ) - if PY3: - return str(utf8, "utf-8") - return utf8 + return str(utf8, "utf-8") def xmlelement(self): root = etree.Element(self.tag, nsmap=nsmap) Index: caldav-0.10.0/caldav/lib/python_utilities.py =================================================================== --- caldav-0.10.0.orig/caldav/lib/python_utilities.py +++ caldav-0.10.0/caldav/lib/python_utilities.py @@ -1,53 +1,31 @@ -from six import PY3 -from six import string_types - - -def isPython3(): - """Deprecated. Use six.PY3""" - return PY3 - - def to_wire(text): - if text is not None and isinstance(text, string_types) and PY3: + if text is not None and isinstance(text, str): text = bytes(text, "utf-8") - elif not PY3: - text = to_unicode(text).encode("utf-8") return text def to_local(text): - if text is not None and not isinstance(text, string_types): + if text is not None and not isinstance(text, str): text = text.decode("utf-8") return text def to_str(text): - if text and not isinstance(text, string_types): + if text and not isinstance(text, str): text = text.decode("utf-8") return text def to_normal_str(text): """ - A str object is a unicode on python3 and a byte string on python2. - Make sure we return a normal string, no matter what version of - python ... + Make sure we return a normal string """ - if PY3 and text and not isinstance(text, str): + if text and not isinstance(text, str): text = text.decode("utf-8") - elif not PY3 and text and not isinstance(text, str): - text = text.encode("utf-8") return text def to_unicode(text): - if ( - text - and isinstance(text, string_types) - and not PY3 - and not isinstance(text, unicode) - ): - return unicode(text, "utf-8") - if PY3 and text and isinstance(text, bytes): + if text and isinstance(text, bytes): return text.decode("utf-8") return text Index: caldav-0.10.0/caldav/lib/url.py =================================================================== --- caldav-0.10.0.orig/caldav/lib/url.py +++ caldav-0.10.0/caldav/lib/url.py @@ -2,29 +2,15 @@ # -*- encoding: utf-8 -*- from caldav.lib.python_utilities import to_normal_str from caldav.lib.python_utilities import to_unicode -from six import PY3 -if PY3: - from urllib.parse import ( - ParseResult, - SplitResult, - urlparse, - unquote, - quote, - urlunparse, - ) -else: - from urlparse import ParseResult, SplitResult - from urlparse import urlparse, urlunparse - from urllib import unquote, quote - - -def uc2utf8(input): - # argh! this feels wrong, but seems to be needed. - if not PY3 and type(input) == unicode: - return input.encode("utf-8") - else: - return input +from urllib.parse import ( + ParseResult, + SplitResult, + urlparse, + unquote, + quote, + urlunparse, +) class URL: @@ -195,12 +181,12 @@ class URL: raise ValueError("%s can't be joined with %s" % (self, path)) if path.path[0] == "/": - ret_path = uc2utf8(path.path) + ret_path = path.path else: sep = "/" if self.path.endswith("/"): sep = "" - ret_path = "%s%s%s" % (self.path, sep, uc2utf8(path.path)) + ret_path = "%s%s%s" % (self.path, sep, path.path) return URL( ParseResult( self.scheme or path.scheme, Index: caldav-0.10.0/setup.py =================================================================== --- caldav-0.10.0.orig/setup.py +++ caldav-0.10.0/setup.py @@ -66,7 +66,7 @@ if __name__ == "__main__": packages=find_packages(exclude=["tests"]), include_package_data=True, zip_safe=False, - install_requires=["vobject", "lxml", "requests", "six", "icalendar"] + install_requires=["vobject", "lxml", "requests", "icalendar"] + extra_packages, tests_require=test_packages + extra_test_packages, extras_require={ Index: caldav-0.10.0/tests/proxy.py =================================================================== --- caldav-0.10.0.orig/tests/proxy.py +++ caldav-0.10.0/tests/proxy.py @@ -28,18 +28,11 @@ from types import FrameType from caldav.lib.python_utilities import to_local from caldav.lib.python_utilities import to_wire -from six import PY3 -if PY3: - from urllib import parse - from urllib.parse import urlparse, urlunparse - from http.server import BaseHTTPRequestHandler, HTTPServer - from socketserver import ThreadingMixIn -else: - from urlparse import urlparse as parse - from urlparse import urlparse, urlunparse - from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer - from SocketServer import ThreadingMixIn +from urllib import parse +from urllib.parse import urlparse, urlunparse +from http.server import BaseHTTPRequestHandler, HTTPServer +from socketserver import ThreadingMixIn __version__ = "0.3.1" Index: caldav-0.10.0/tests/test_caldav.py =================================================================== --- caldav-0.10.0.orig/tests/test_caldav.py +++ caldav-0.10.0/tests/test_caldav.py @@ -41,7 +41,6 @@ from caldav.objects import Principal from caldav.objects import Todo from nose.plugins.skip import SkipTest from requests.packages import urllib3 -from six import PY3 from . import compatibility_issues from .conf import caldav_servers @@ -70,10 +69,7 @@ if test_radicale: import radicale.server import socket -if PY3: - from urllib.parse import urlparse -else: - from urlparse import urlparse +from urllib.parse import urlparse log = logging.getLogger("caldav") Index: caldav-0.10.0/tests/test_caldav_unit.py =================================================================== --- caldav-0.10.0.orig/tests/test_caldav_unit.py +++ caldav-0.10.0/tests/test_caldav_unit.py @@ -37,15 +37,10 @@ from caldav.objects import FreeBusy from caldav.objects import Journal from caldav.objects import Principal from caldav.objects import Todo -from six import PY3 -if PY3: - from urllib.parse import urlparse - from unittest import mock -else: - from urlparse import urlparse - import mock +from urllib.parse import urlparse +from unittest import mock ## Some example icalendar data copied from test_caldav.py ev1 = """BEGIN:VCALENDAR @@ -165,14 +160,11 @@ class TestCalDAV: assert response.status == 200 assert response.tree is None - if PY3: - response = client.put( - "/foo/m????h/bar".encode("utf-8"), - "bringeb??rsyltet??y ?????? ????????".encode("utf-8"), - {}, - ) - else: - response = client.put(u"/foo/m????h/bar", "bringeb??rsyltet??y ?????? ????????", {}) # fmt: skip + response = client.put( + "/foo/m????h/bar".encode("utf-8"), + "bringeb??rsyltet??y ?????? ????????".encode("utf-8"), + {}, + ) assert response.status == 200 assert response.tree is None