diff --git a/pkgs/development/python-modules/ical/default.nix b/pkgs/development/python-modules/ical/default.nix
new file mode 100644
index 000000000000..d5ac5f4196ed
--- /dev/null
+++ b/pkgs/development/python-modules/ical/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, python-dateutil
+, buildPythonPackage
+, fetchFromGitHub
+, freezegun
+, tzdata
+, pyparsing
+, pydantic
+, pytest-asyncio
+, pytest-benchmark
+, pytest-golden
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "ical";
+  version = "4.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "allenporter";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-pZtjGWmEVcHSCgiVTKoEaRvec02cz3x93W+UXx3J8gE=";
+  };
+
+  propagatedBuildInputs = [
+    python-dateutil
+    tzdata
+    pydantic
+    pyparsing
+  ];
+
+  checkInputs = [
+    freezegun
+    pytest-asyncio
+    pytest-benchmark
+    pytest-golden
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "ical"
+  ];
+
+  meta = with lib; {
+    description = "Library for handling iCalendar";
+    homepage = "https://github.com/allenporter/ical";
+    changelog = "https://github.com/allenporter/ical/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/pkgs/development/python-modules/pytest-golden/default.nix b/pkgs/development/python-modules/pytest-golden/default.nix
new file mode 100644
index 000000000000..d6fd3fe5d2d0
--- /dev/null
+++ b/pkgs/development/python-modules/pytest-golden/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, atomicwrites
+, buildPythonPackage
+, fetchFromGitHub
+  #, hatchling
+, ruamel-yaml
+, poetry
+, pytest
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, pythonRelaxDepsHook
+, testfixtures
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-golden";
+  version = "0.2.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "oprypin";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-l5fXWDK6gWJc3dkYFTokI9tWvawMRnF0td/lSwqkYXE=";
+  };
+
+  pythonRelaxDeps = [
+    "testfixtures"
+  ];
+
+  nativeBuildInputs = [
+    # hatchling used for > 0.2.2
+    poetry
+    pythonRelaxDepsHook
+  ];
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    atomicwrites
+    ruamel-yaml
+    testfixtures
+  ];
+
+  checkInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pytest_golden"
+  ];
+
+  meta = with lib; {
+    description = "Plugin for pytest that offloads expected outputs to data files";
+    homepage = "https://github.com/oprypin/pytest-golden";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/pkgs/top-level/python-packages.nix b/pkgs/top-level/python-packages.nix
index 576f36815c7a..06db4bb3052e 100644
--- a/pkgs/top-level/python-packages.nix
+++ b/pkgs/top-level/python-packages.nix
@@ -4371,6 +4371,8 @@ self: super: with self; {
 
   ibm-watson = callPackage ../development/python-modules/ibm-watson { };
 
+  ical = callPackage ../development/python-modules/ical { };
+
   icalendar = callPackage ../development/python-modules/icalendar { };
 
   icecream = callPackage ../development/python-modules/icecream { };
@@ -8749,6 +8751,8 @@ self: super: with self; {
 
   pytest-freezegun = callPackage ../development/python-modules/pytest-freezegun { };
 
+  pytest-golden = callPackage ../development/python-modules/pytest-golden { };
+
   pytest-helpers-namespace = callPackage ../development/python-modules/pytest-helpers-namespace { };
 
   pytest-html = callPackage ../development/python-modules/pytest-html { };