Repository: collective/icalendar

Issue:
Missing equivalence member function for icalendar.prop.vDDDTypes
While comparing two vevents, I have to check if RECURRENCE-ID are the same in addition to UID.
However, `vevent1["RECURRENCE-ID"]==vevent2["RECURRENCE-ID"] `always returns false, as only the object ids are compared and not the content.

It would be helpful if `icalendar.prop.vDDDTypes` would implement `__eq__(self, other)`.



Discussion:
coveralls: ## Pull Request Test Coverage Report for [Build 2947161652](https://coveralls.io/builds/52017687)

* **4** of **4**   **(100.0%)**  changed or added relevant lines in **1** file are covered.
* **1** unchanged line in **1** file lost coverage.
* Overall coverage increased (+**0.2%**) to **92.812%**

---


|  Files with Coverage Reduction | New Missed Lines | % |
| :-----|--------------|--: |
| [src/icalendar/parser.py](https://coveralls.io/builds/52017687/source?filename=src%2Ficalendar%2Fparser.py#L54) | 1 | 97.51% |
<!-- | **Total:** | **1** |  | -->

|  Totals | [![Coverage Status](https://coveralls.io/builds/52017687/badge)](https://coveralls.io/builds/52017687) |
| :-- | --: |
| Change from base [Build 2942168031](https://coveralls.io/builds/52003917): |  0.2% |
| Covered Lines: | 1175 |
| Relevant Lines: | 1266 |

---
##### 💛  - [Coveralls](https://coveralls.io)


Patch:
diff --git a/CHANGES.rst b/CHANGES.rst
index 027d4e2..86588af 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -11,7 +11,7 @@ Minor changes:
 
 Breaking changes:
 
-- Require Python 3.7 as minimum Python version.  [maurits] [niccokunzmann]
+- Require Python 3.8 as minimum Python version.  [maurits]
 - icalenar now takes a ics file directly as an input
 - icalendar's output is different
 
diff --git a/setup.py b/setup.py
index 01a8a84..091a3c0 100644
--- a/setup.py
+++ b/setup.py
@@ -35,7 +35,6 @@ setuptools.setup(
         'License :: OSI Approved :: BSD License',
         'Operating System :: OS Independent',
         'Programming Language :: Python',
-        'Programming Language :: Python :: 3.7',
         'Programming Language :: Python :: 3.8',
         'Programming Language :: Python :: 3.9',
         'Programming Language :: Python :: 3.10',
@@ -52,7 +51,7 @@ setuptools.setup(
     package_dir={'': 'src'},
     include_package_data=True,
     zip_safe=False,
-    python_requires=">=3.7",
+    python_requires=">=3.8",
     install_requires=install_requires,
     entry_points = {'console_scripts': ['icalendar = icalendar.cli:main']},
     extras_require={
diff --git a/src/icalendar/prop.py b/src/icalendar/prop.py
index b6395df..36d2b94 100644
--- a/src/icalendar/prop.py
+++ b/src/icalendar/prop.py
@@ -323,6 +323,11 @@ class vDDDTypes:
         else:
             raise ValueError(f'Unknown date type: {type(dt)}')
 
+    def __eq__(self, other):
+        if isinstance(other, vDDDTypes):
+            return self.params == other.params
+        return False
+
     @classmethod
     def from_ical(cls, ical, timezone=None):
         if isinstance(ical, cls):
diff --git a/tox.ini b/tox.ini
index 8d1e399..5f4d8a8 100644
--- a/tox.ini
+++ b/tox.ini
@@ -1,6 +1,6 @@
 # to run for a specific environment, use ``tox -e ENVNAME``
 [tox]
-envlist = py37,py38,py39,py310,pypy3,docs
+envlist = py38,py39,py310,pypy3,docs
 # Note: the 'docs' env creates a 'build' directory which may interfere in strange ways
 # with the other environments.  You might see this when you run the tests in parallel.
 # See https://github.com/collective/icalendar/pull/359#issuecomment-1214150269


Test patch:
diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
index 83bb814..2e97a43 100644
--- a/.github/workflows/tests.yml
+++ b/.github/workflows/tests.yml
@@ -14,7 +14,6 @@ jobs:
       matrix:
         config:
         # [Python version, tox env]
-        - ["3.7",   "py37"]
         - ["3.8",   "py38"]
         - ["3.9",   "py39"]
         - ["3.10",  "py310"]
diff --git a/src/icalendar/tests/test_unit_prop.py b/src/icalendar/tests/test_unit_prop.py
index acfc788..0549320 100644
--- a/src/icalendar/tests/test_unit_prop.py
+++ b/src/icalendar/tests/test_unit_prop.py
@@ -112,6 +112,27 @@ class TestProp(unittest.TestCase):
         # Bad input
         self.assertRaises(ValueError, vDDDTypes, 42)
 
+    def test_vDDDTypes_equivalance(self):
+        from ..prop import vDDDTypes
+        from copy import deepcopy
+
+        vDDDTypes = [
+                vDDDTypes(pytz.timezone('US/Eastern').localize(datetime(year=2022, month=7, day=22, hour=12, minute=7))),
+                vDDDTypes(datetime(year=2022, month=7, day=22, hour=12, minute=7)),
+                vDDDTypes(date(year=2022, month=7, day=22)),
+                vDDDTypes(time(hour=22, minute=7, second=2))]
+
+        for v_type in vDDDTypes:
+            self.assertEqual(v_type, deepcopy(v_type))
+            for other in vDDDTypes:
+                if other is v_type:
+                    continue
+                self.assertNotEqual(v_type, other)
+
+            # see if equivalnce fails for other types
+            self.assertNotEqual(v_type, 42)
+            self.assertNotEqual(v_type, 'test')
+
     def test_prop_vDate(self):
         from ..prop import vDate