about summary refs log tree commit diff
path: root/pkgs/development
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/development')
-rw-r--r--pkgs/development/beam-modules/build-mix.nix13
-rw-r--r--pkgs/development/beam-modules/mix-release.nix81
-rw-r--r--pkgs/development/compilers/gcc/default.nix8
-rw-r--r--pkgs/development/compilers/gcc/patches/8/avr-gcc-8-darwin.patch16
-rw-r--r--pkgs/development/compilers/gcc/patches/default.nix5
-rw-r--r--pkgs/development/coq-modules/coq-ext-lib/default.nix3
-rw-r--r--pkgs/development/libraries/botan/2.0.nix4
-rw-r--r--pkgs/development/libraries/botan/3.0.nix6
-rw-r--r--pkgs/development/libraries/botan/generic.nix4
-rw-r--r--pkgs/development/libraries/webkitgtk/default.nix4
-rw-r--r--pkgs/development/python-modules/azure-mgmt-kusto/default.nix27
-rw-r--r--pkgs/development/python-modules/django-stubs-ext/default.nix4
-rw-r--r--pkgs/development/python-modules/django-stubs/default.nix4
-rw-r--r--pkgs/development/python-modules/dvc-data/default.nix4
-rw-r--r--pkgs/development/python-modules/dvc-objects/default.nix11
-rw-r--r--pkgs/development/python-modules/dvc/default.nix4
-rw-r--r--pkgs/development/python-modules/easyenergy/default.nix4
-rw-r--r--pkgs/development/python-modules/energyzero/default.nix4
-rw-r--r--pkgs/development/python-modules/etils/default.nix4
-rw-r--r--pkgs/development/python-modules/fpdf2/default.nix67
-rw-r--r--pkgs/development/python-modules/identify/default.nix4
-rw-r--r--pkgs/development/python-modules/proton-core/default.nix76
-rw-r--r--pkgs/development/python-modules/proton-keyring-linux-secretservice/default.nix46
-rw-r--r--pkgs/development/python-modules/proton-keyring-linux/default.nix48
-rw-r--r--pkgs/development/python-modules/proton-vpn-api-core/default.nix66
-rw-r--r--pkgs/development/python-modules/proton-vpn-connection/default.nix71
-rw-r--r--pkgs/development/python-modules/proton-vpn-killswitch-network-manager/default.nix58
-rw-r--r--pkgs/development/python-modules/proton-vpn-killswitch/default.nix46
-rw-r--r--pkgs/development/python-modules/proton-vpn-logger/default.nix51
-rw-r--r--pkgs/development/python-modules/proton-vpn-network-manager-openvpn/default.nix51
-rw-r--r--pkgs/development/python-modules/proton-vpn-network-manager/default.nix58
-rw-r--r--pkgs/development/python-modules/proton-vpn-session/default.nix67
-rw-r--r--pkgs/development/python-modules/pynitrokey/default.nix107
-rw-r--r--pkgs/development/python-modules/python-opensky/default.nix8
-rw-r--r--pkgs/development/python-modules/python-vlc/default.nix4
-rw-r--r--pkgs/development/python-modules/pyunifiprotect/default.nix30
-rw-r--r--pkgs/development/python-modules/qiskit-aer/default.nix2
-rw-r--r--pkgs/development/python-modules/qiskit-terra/default.nix16
-rw-r--r--pkgs/development/python-modules/reolink-aio/default.nix4
-rw-r--r--pkgs/development/python-modules/type-infer/default.nix4
-rw-r--r--pkgs/development/tools/bearer/default.nix4
-rw-r--r--pkgs/development/tools/turso-cli/default.nix4
-rw-r--r--pkgs/development/web/deno/default.nix6
43 files changed, 1004 insertions, 104 deletions
diff --git a/pkgs/development/beam-modules/build-mix.nix b/pkgs/development/beam-modules/build-mix.nix
index 4c5ad3f6fa24..d61b5e91556b 100644
--- a/pkgs/development/beam-modules/build-mix.nix
+++ b/pkgs/development/beam-modules/build-mix.nix
@@ -5,6 +5,11 @@
 , src
 , buildInputs ? [ ]
 , nativeBuildInputs ? [ ]
+, erlangCompilerOptions ? [ ]
+  # Deterministic Erlang builds remove full system paths from debug information
+  # among other things to keep builds more reproducible. See their docs for more:
+  # https://www.erlang.org/doc/man/compile
+, erlangDeterministicBuilds ? true
 , beamDeps ? [ ]
 , propagatedBuildInputs ? [ ]
 , postPatch ? ""
@@ -31,6 +36,13 @@ let
     MIX_ENV = mixEnv;
     MIX_DEBUG = if enableDebugInfo then 1 else 0;
     HEX_OFFLINE = 1;
+
+    ERL_COMPILER_OPTIONS =
+      let
+        options = erlangCompilerOptions ++ lib.optionals erlangDeterministicBuilds [ "deterministic" ];
+      in
+      "[${lib.concatStringsSep "," options}]";
+
     LC_ALL = "C.UTF-8";
 
     # add to ERL_LIBS so other modules can find at runtime.
@@ -108,4 +120,3 @@ let
   });
 in
 lib.fix pkg
-
diff --git a/pkgs/development/beam-modules/mix-release.nix b/pkgs/development/beam-modules/mix-release.nix
index e5b44bc5dcdb..a762b8e0bc2e 100644
--- a/pkgs/development/beam-modules/mix-release.nix
+++ b/pkgs/development/beam-modules/mix-release.nix
@@ -8,6 +8,8 @@
 , rebar3
 , fetchMixDeps
 , findutils
+, ripgrep
+, bbe
 , makeWrapper
 , coreutils
 , gnused
@@ -25,6 +27,17 @@
 , mixEnv ? "prod"
 , compileFlags ? [ ]
 
+  # Options to be passed to the Erlang compiler. As documented in the reference
+  # manual, these must be valid Erlang terms. They will be turned into an
+  # erlang list and set as the ERL_COMPILER_OPTIONS environment variable.
+  # See https://www.erlang.org/doc/man/compile
+, erlangCompilerOptions ? [ ]
+
+  # Deterministic Erlang builds remove full system paths from debug information
+  # among other things to keep builds more reproducible. See their docs for more:
+  # https://www.erlang.org/doc/man/compile
+, erlangDeterministicBuilds ? true
+
   # Mix dependencies provided as a fixed output derivation
 , mixFodDeps ? null
 
@@ -36,6 +49,7 @@
 , mixNixDeps ? { }
 
 , elixir ? inputs.elixir
+, erlang ? inputs.erlang
 , hex ? inputs.hex.override { inherit elixir; }
 
   # Remove releases/COOKIE
@@ -63,7 +77,7 @@
 }@attrs:
 let
   # Remove non standard attributes that cannot be coerced to strings
-  overridable = builtins.removeAttrs attrs [ "compileFlags" "mixNixDeps" ];
+  overridable = builtins.removeAttrs attrs [ "compileFlags" "erlangCompilerOptions" "mixNixDeps" ];
 in
 assert mixNixDeps != { } -> mixFodDeps == null;
 assert stripDebug -> !enableDebugInfo;
@@ -75,7 +89,7 @@ stdenv.mkDerivation (overridable // {
     # Mix deps
     (builtins.attrValues mixNixDeps) ++
     # other compile-time deps
-    [ findutils makeWrapper ];
+    [ findutils ripgrep bbe makeWrapper ];
 
   buildInputs = buildInputs;
 
@@ -89,6 +103,12 @@ stdenv.mkDerivation (overridable // {
   MIX_REBAR = "${rebar}/bin/rebar";
   MIX_REBAR3 = "${rebar3}/bin/rebar3";
 
+  ERL_COMPILER_OPTIONS =
+    let
+      options = erlangCompilerOptions ++ lib.optionals erlangDeterministicBuilds [ "deterministic" ];
+    in
+    "[${lib.concatStringsSep "," options}]";
+
   LC_ALL = "C.UTF-8";
 
   postUnpack = ''
@@ -161,10 +181,10 @@ stdenv.mkDerivation (overridable // {
   '';
 
   postFixup = ''
-    # Remove files for Microsoft Windows
+    echo "removing files for Microsoft Windows"
     rm -f "$out"/bin/*.bat
 
-    # Wrap programs in $out/bin with their runtime deps
+    echo "wrapping programs in $out/bin with their runtime deps"
     for f in $(find $out/bin/ -type f -executable); do
       wrapProgram "$f" \
         --prefix PATH : ${lib.makeBinPath [
@@ -176,34 +196,41 @@ stdenv.mkDerivation (overridable // {
     done
   '' + lib.optionalString removeCookie ''
     if [ -e $out/releases/COOKIE ]; then
+      echo "removing $out/releases/COOKIE"
       rm $out/releases/COOKIE
     fi
+  '' + ''
+    if [ -e $out/erts-* ]; then
+      # ERTS is included in the release, then erlang is not required as a runtime dependency.
+      # But, erlang is still referenced in some places. To removed references to erlang,
+      # following steps are required.
+
+      # 1. remove references to erlang from plain text files
+      for file in $(rg "${erlang}/lib/erlang" "$out" --files-with-matches); do
+        echo "removing references to erlang in $file"
+        substituteInPlace "$file" --replace "${erlang}/lib/erlang" "$out"
+      done
+
+      # 2. remove references to erlang from .beam files
+      #
+      # No need to do anything, because it has been handled by "deterministic" option specified
+      # by ERL_COMPILER_OPTIONS.
+
+      # 3. remove references to erlang from normal binary files
+      for file in $(rg "${erlang}/lib/erlang" "$out" --files-with-matches --binary --iglob '!*.beam'); do
+        echo "removing references to erlang in $file"
+        # use bbe to substitute strings in binary files, because using substituteInPlace
+        # on binaries will raise errors
+        bbe -e "s|${erlang}/lib/erlang|$out|" -o "$file".tmp "$file"
+        rm -f "$file"
+        mv "$file".tmp "$file"
+      done
+
+      # References to erlang should be removed from output after above processing.
+    fi
   '' + lib.optionalString stripDebug ''
     # Strip debug symbols to avoid hardreferences to "foreign" closures actually
     # not needed at runtime, while at the same time reduce size of BEAM files.
     erl -noinput -eval 'lists:foreach(fun(F) -> io:format("Stripping ~p.~n", [F]), beam_lib:strip(F) end, filelib:wildcard("'"$out"'/**/*.beam"))' -s init stop
   '';
-
-  # TODO: remove erlang references in resulting derivation
-  #
-  # # Step 1 - investigate why the resulting derivation still has references to erlang.
-  #
-  # The reason is that the generated binaries contains erlang reference. Here's a repo to
-  # demonstrate the problem - <https://github.com/plastic-gun/nix-mix-release-unwanted-references>.
-  #
-  #
-  # # Step 2 - remove erlang references from the binaries
-  #
-  # As said in above repo, it's hard to remove erlang references from `.beam` binaries.
-  #
-  # We need more experienced developers to resolve this issue.
-  #
-  #
-  # # Tips
-  #
-  # When resolving this issue, it is convenient to fail the build when erlang is referenced,
-  # which can be achieved by using:
-  #
-  #   disallowedReferences = [ erlang ];
-  #
 })
diff --git a/pkgs/development/compilers/gcc/default.nix b/pkgs/development/compilers/gcc/default.nix
index 628b259acbd9..eef6faf26424 100644
--- a/pkgs/development/compilers/gcc/default.nix
+++ b/pkgs/development/compilers/gcc/default.nix
@@ -29,7 +29,7 @@
 , buildPackages
 , pkgsBuildTarget
 , libxcrypt
-, disableGdbPlugin ? !enablePlugin
+, disableGdbPlugin ? !enablePlugin || (stdenv.targetPlatform.isAvr && stdenv.hostPlatform.isDarwin && stdenv.hostPlatform.isAarch64)
 , nukeReferences
 , callPackage
 , majorMinorVersion
@@ -423,7 +423,11 @@ lib.pipe ((callFile ./common/builder.nix {}) ({
       maintainers
     ;
   } // lib.optionalAttrs (!atLeast11) {
-    badPlatforms = if !(is48 || is49) then [ "aarch64-darwin" ] else lib.platforms.darwin;
+    badPlatforms =
+      # avr-gcc8 is maintained for the `qmk` package
+      if (is8 && targetPlatform.isAvr) then []
+      else if !(is48 || is49) then [ "aarch64-darwin" ]
+      else lib.platforms.darwin;
   } // lib.optionalAttrs is11 {
     badPlatforms = if targetPlatform != hostPlatform then [ "aarch64-darwin" ] else [ ];
   };
diff --git a/pkgs/development/compilers/gcc/patches/8/avr-gcc-8-darwin.patch b/pkgs/development/compilers/gcc/patches/8/avr-gcc-8-darwin.patch
new file mode 100644
index 000000000000..3705ed99c49a
--- /dev/null
+++ b/pkgs/development/compilers/gcc/patches/8/avr-gcc-8-darwin.patch
@@ -0,0 +1,16 @@
+From https://gist.githubusercontent.com/DavidEGrayson/88bceb3f4e62f45725ecbb9248366300/raw/c1f515475aff1e1e3985569d9b715edb0f317648/gcc-11-arm-darwin.patch
+
+diff -ur a/gcc/config/host-darwin.c b/gcc/config/host-darwin.c
+--- a/gcc/config/host-darwin.c	2021-04-27 03:00:13.000000000 -0700
++++ b/gcc/config/host-darwin.c	2021-06-11 14:49:13.754000000 -0700
+@@ -22,6 +22,10 @@
+ #include "coretypes.h"
+ #include "diagnostic-core.h"
+ #include "config/host-darwin.h"
++#include "hosthooks.h"
++#include "hosthooks-def.h"
++
++const struct host_hooks host_hooks = HOST_HOOKS_INITIALIZER;
+ 
+ /* Yes, this is really supposed to work.  */
+ /* This allows for a pagesize of 16384, which we have on Darwin20, but should
\ No newline at end of file
diff --git a/pkgs/development/compilers/gcc/patches/default.nix b/pkgs/development/compilers/gcc/patches/default.nix
index 32938be376d9..55636b8ab51c 100644
--- a/pkgs/development/compilers/gcc/patches/default.nix
+++ b/pkgs/development/compilers/gcc/patches/default.nix
@@ -215,6 +215,11 @@ in
 # which is not supported by the clang integrated assembler used by default on Darwin.
 ++ optional (is8 && hostPlatform.isDarwin) ./8/gcc8-darwin-as-gstabs.patch
 
+# Make avr-gcc8 build on aarch64-darwin
+# avr-gcc8 is maintained for the `qmk` package
+# https://github.com/osx-cross/homebrew-avr/blob/main/Formula/avr-gcc%408.rb#L69
+++ optional (is8 && targetPlatform.isAvr && hostPlatform.isDarwin && hostPlatform.isAarch64) ./8/avr-gcc-8-darwin.patch
+
 
 ## gcc 7.0 and older ##############################################################################
 
diff --git a/pkgs/development/coq-modules/coq-ext-lib/default.nix b/pkgs/development/coq-modules/coq-ext-lib/default.nix
index 54ef3f8b0f36..5d39e4f0c3c7 100644
--- a/pkgs/development/coq-modules/coq-ext-lib/default.nix
+++ b/pkgs/development/coq-modules/coq-ext-lib/default.nix
@@ -5,7 +5,7 @@ mkCoqDerivation rec {
   owner = "coq-ext-lib";
   inherit version;
   defaultVersion = with lib.versions; lib.switch coq.coq-version [
-    { case = range "8.11" "8.18"; out = "0.11.8"; }
+    { case = range "8.11" "8.18"; out = "0.12.0"; }
     { case = range "8.8" "8.16"; out = "0.11.6"; }
     { case = range "8.8" "8.14"; out = "0.11.4"; }
     { case = range "8.8" "8.13"; out = "0.11.3"; }
@@ -13,6 +13,7 @@ mkCoqDerivation rec {
     { case = "8.6";              out = "0.9.5"; }
     { case = "8.5";              out = "0.9.4"; }
   ] null;
+  release."0.12.0".sha256 = "sha256-9szpnWoS83bDc+iLqElfgz0LNRo9hSRQwUFIgpTca4c=";
   release."0.11.8".sha256 = "sha256-uUBKJb7XjRnyb7rCisZrDcaDdsp1Bv1lXDIU3Ce8e5k=";
   release."0.11.7".sha256 = "sha256-HkxUny0mxDDT4VouBBh8btwxGZgsb459kBufTLLnuEY=";
   release."0.11.6".sha256 = "0w6iyrdszz7zc8kaybhy3mwjain2d2f83q79xfd5di0hgdayh7q7";
diff --git a/pkgs/development/libraries/botan/2.0.nix b/pkgs/development/libraries/botan/2.0.nix
index e2b4aa880415..53b4e167a7d9 100644
--- a/pkgs/development/libraries/botan/2.0.nix
+++ b/pkgs/development/libraries/botan/2.0.nix
@@ -1,7 +1,7 @@
-{ callPackage, fetchpatch, ... } @ args:
+{ callPackage, ... } @ args:
 
 callPackage ./generic.nix (args // {
   baseVersion = "2.19";
   revision = "3";
-  sha256 = "sha256-2uBH85nFpH8IfbXT2dno8RrkmF0UySjXHaGv+AGALVU=";
+  hash = "sha256-2uBH85nFpH8IfbXT2dno8RrkmF0UySjXHaGv+AGALVU=";
 })
diff --git a/pkgs/development/libraries/botan/3.0.nix b/pkgs/development/libraries/botan/3.0.nix
index a9b6a7aa27d3..4c0eae63493a 100644
--- a/pkgs/development/libraries/botan/3.0.nix
+++ b/pkgs/development/libraries/botan/3.0.nix
@@ -1,9 +1,7 @@
-{ callPackage, fetchpatch, lib, ... } @ args:
+{ callPackage, ... } @ args:
 
 callPackage ./generic.nix (args // {
   baseVersion = "3.2";
   revision = "0";
-  sha256 = "BJyEeDX89u86niBrM94F3TiZnDJeJHSCdypVmNnl7OM=";
-  # reconsider removing this platform marking, when MacOS uses Clang 14.0+ by default.
-  badPlatforms = lib.platforms.darwin;
+  hash = "sha256-BJyEeDX89u86niBrM94F3TiZnDJeJHSCdypVmNnl7OM=";
 })
diff --git a/pkgs/development/libraries/botan/generic.nix b/pkgs/development/libraries/botan/generic.nix
index 795cd5189efe..8e053581e88b 100644
--- a/pkgs/development/libraries/botan/generic.nix
+++ b/pkgs/development/libraries/botan/generic.nix
@@ -1,6 +1,6 @@
 { lib, stdenv, fetchurl, python3, bzip2, zlib, gmp, boost
 # Passed by version specific builders
-, baseVersion, revision, sha256
+, baseVersion, revision, hash
 , sourceExtension ? "tar.xz"
 , extraConfigureFlags ? ""
 , extraPatches ? [ ]
@@ -24,7 +24,7 @@ stdenv.mkDerivation rec {
        "http://files.randombit.net/botan/v${baseVersion}/Botan-${version}.${sourceExtension}"
        "http://botan.randombit.net/releases/Botan-${version}.${sourceExtension}"
     ];
-    inherit sha256;
+    inherit hash;
   };
   patches = extraPatches;
   inherit postPatch;
diff --git a/pkgs/development/libraries/webkitgtk/default.nix b/pkgs/development/libraries/webkitgtk/default.nix
index 8192dded7e4c..c5bf837b3dac 100644
--- a/pkgs/development/libraries/webkitgtk/default.nix
+++ b/pkgs/development/libraries/webkitgtk/default.nix
@@ -70,7 +70,7 @@
 
 stdenv.mkDerivation (finalAttrs: {
   pname = "webkitgtk";
-  version = "2.42.2";
+  version = "2.42.3";
   name = "${finalAttrs.pname}-${finalAttrs.version}+abi=${if lib.versionAtLeast gtk3.version "4.0" then "6.0" else "4.${if lib.versions.major libsoup.version == "2" then "0" else "1"}"}";
 
   outputs = [ "out" "dev" "devdoc" ];
@@ -81,7 +81,7 @@ stdenv.mkDerivation (finalAttrs: {
 
   src = fetchurl {
     url = "https://webkitgtk.org/releases/webkitgtk-${finalAttrs.version}.tar.xz";
-    hash = "sha256-VyCqPoYn8bn2MlIYfU3w+CM65x1pexeW6/vlynUL0Rg=";
+    hash = "sha256-ChpGMARWKLOm/pXactxHhSz/INZr4axv0NZpyIwT2OI=";
   };
 
   patches = lib.optionals stdenv.isLinux [
diff --git a/pkgs/development/python-modules/azure-mgmt-kusto/default.nix b/pkgs/development/python-modules/azure-mgmt-kusto/default.nix
index e272ff372ced..474b19814c0b 100644
--- a/pkgs/development/python-modules/azure-mgmt-kusto/default.nix
+++ b/pkgs/development/python-modules/azure-mgmt-kusto/default.nix
@@ -1,37 +1,42 @@
-{ lib, buildPythonPackage, fetchPypi, isPy27
+{ lib
 , azure-common
 , azure-mgmt-core
-, msrest
-, msrestazure
+, buildPythonPackage
+, fetchPypi
+, isodate
+, pythonOlder
 }:
 
 buildPythonPackage rec {
-  version = "3.2.0";
-  format = "setuptools";
   pname = "azure-mgmt-kusto";
-  disabled = isPy27;
+  version = "3.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
 
   src = fetchPypi {
     inherit pname version;
-    hash = "sha256-zgkFMrufHoX3gq9QXo8SlJYZOfV5GlY3pVQXmIWyx7c=";
-    extension = "zip";
+    hash = "sha256-PmGGtyVrYFCMnpiCq9x9uwoMboDO1ePlGAJzrMTj3ps=";
   };
 
   propagatedBuildInputs = [
     azure-common
     azure-mgmt-core
-    msrest
-    msrestazure
+    isodate
   ];
 
   # no tests included
   doCheck = false;
 
-  pythonImportsCheck = [ "azure.common" "azure.mgmt.kusto" ];
+  pythonImportsCheck = [
+    "azure.common"
+    "azure.mgmt.kusto"
+  ];
 
   meta = with lib; {
     description = "Microsoft Azure Kusto Management Client Library for Python";
     homepage = "https://github.com/Azure/azure-sdk-for-python";
+    changelog = "https://github.com/Azure/azure-sdk-for-python/blob/azure-mgmt-kusto_${version}/sdk/kusto/azure-mgmt-kusto/CHANGELOG.md";
     license = licenses.mit;
     maintainers = with maintainers; [ jonringer ];
   };
diff --git a/pkgs/development/python-modules/django-stubs-ext/default.nix b/pkgs/development/python-modules/django-stubs-ext/default.nix
index a3bbfd91b0d8..6cc31a06b7c3 100644
--- a/pkgs/development/python-modules/django-stubs-ext/default.nix
+++ b/pkgs/development/python-modules/django-stubs-ext/default.nix
@@ -9,14 +9,14 @@
 
 buildPythonPackage rec {
   pname = "django-stubs-ext";
-  version = "4.2.2";
+  version = "4.2.5";
   format = "setuptools";
 
   disabled = pythonOlder "3.8";
 
   src = fetchPypi {
     inherit pname version;
-    hash = "sha256-xp0cxG8cTDt4lLaFpQIsKbKjbHz7UuI3YurzV+v8LJg=";
+    hash = "sha256-jE0ftfaEGbOyR0xlloGhiYA+J9al5av1qg2ldgG1hjM=";
   };
 
   propagatedBuildInputs = [
diff --git a/pkgs/development/python-modules/django-stubs/default.nix b/pkgs/development/python-modules/django-stubs/default.nix
index 6dcc875884e0..d404177a43c7 100644
--- a/pkgs/development/python-modules/django-stubs/default.nix
+++ b/pkgs/development/python-modules/django-stubs/default.nix
@@ -14,14 +14,14 @@
 
 buildPythonPackage rec {
   pname = "django-stubs";
-  version = "4.2.4";
+  version = "4.2.6";
   format = "setuptools";
 
   disabled = pythonOlder "3.7";
 
   src = fetchPypi {
     inherit pname version;
-    hash = "sha256-fUoTLDgVGYFehlwnqJ7KQby9BgVoMlByJIFqQ9dcYBw=";
+    hash = "sha256-5gtD3mYqGZ20sVyAPAZmngrFA1YUrykcvTuRWR99zJQ=";
   };
 
   propagatedBuildInputs = [
diff --git a/pkgs/development/python-modules/dvc-data/default.nix b/pkgs/development/python-modules/dvc-data/default.nix
index 3c054f1ccb0c..edfad3b6c247 100644
--- a/pkgs/development/python-modules/dvc-data/default.nix
+++ b/pkgs/development/python-modules/dvc-data/default.nix
@@ -14,7 +14,7 @@
 
 buildPythonPackage rec {
   pname = "dvc-data";
-  version = "2.22.3";
+  version = "2.22.6";
   pyproject = true;
 
   disabled = pythonOlder "3.8";
@@ -23,7 +23,7 @@ buildPythonPackage rec {
     owner = "iterative";
     repo = "dvc-data";
     rev = "refs/tags/${version}";
-    hash = "sha256-5x+I6Ds7x3JqaZ1oyddrsaX0kbMM8pO+rF3ckpRdcgc=";
+    hash = "sha256-oHW80TqQe7LCvBpdB0kW8+vKCZ36/zXEssp7+kHUrTA=";
   };
 
   SETUPTOOLS_SCM_PRETEND_VERSION = version;
diff --git a/pkgs/development/python-modules/dvc-objects/default.nix b/pkgs/development/python-modules/dvc-objects/default.nix
index 041d2b1a3db1..0458828812d3 100644
--- a/pkgs/development/python-modules/dvc-objects/default.nix
+++ b/pkgs/development/python-modules/dvc-objects/default.nix
@@ -8,6 +8,7 @@
 , pytest-mock
 , pytestCheckHook
 , pythonOlder
+, reflink
 , setuptools-scm
 , shortuuid
 , tqdm
@@ -16,7 +17,7 @@
 
 buildPythonPackage rec {
   pname = "dvc-objects";
-  version = "1.3.2";
+  version = "1.4.9";
   format = "pyproject";
 
   disabled = pythonOlder "3.8";
@@ -25,7 +26,7 @@ buildPythonPackage rec {
     owner = "iterative";
     repo = pname;
     rev = "refs/tags/${version}";
-    hash = "sha256-30UnTbEHpGSgSGnhml7pXtPDivH9+NO7nvK4jEmRRUA=";
+    hash = "sha256-9fuxlZDy83nl+rnVEFdAza1NHun8PdewgowMl3G5wZU=";
   };
 
   SETUPTOOLS_SCM_PRETEND_VERSION = version;
@@ -47,12 +48,18 @@ buildPythonPackage rec {
   nativeCheckInputs = [
     pytest-mock
     pytestCheckHook
+    reflink
   ];
 
   pythonImportsCheck = [
     "dvc_objects"
   ];
 
+  disabledTestPaths = [
+    # Disable benchmarking
+    "tests/benchmarks/"
+  ];
+
   meta = with lib; {
     description = "Library for DVC objects";
     homepage = "https://github.com/iterative/dvc-objects";
diff --git a/pkgs/development/python-modules/dvc/default.nix b/pkgs/development/python-modules/dvc/default.nix
index f7ee2eccd3df..cf925f030944 100644
--- a/pkgs/development/python-modules/dvc/default.nix
+++ b/pkgs/development/python-modules/dvc/default.nix
@@ -55,14 +55,14 @@
 
 buildPythonPackage rec {
   pname = "dvc";
-  version = "3.30.3";
+  version = "3.33.3";
   format = "pyproject";
 
   src = fetchFromGitHub {
     owner = "iterative";
     repo = pname;
     rev = "refs/tags/${version}";
-    hash = "sha256-efj2p5Tj3VWJC7o8/nLpNrkM0eZodLMsFZRcZQpLFws=";
+    hash = "sha256-S6RHRY0G6YYcLa7CBFNxi1fVSJH7ZdgyqAo3wmLUNbE=";
   };
 
   pythonRelaxDeps = [
diff --git a/pkgs/development/python-modules/easyenergy/default.nix b/pkgs/development/python-modules/easyenergy/default.nix
index 13184bb6bc6e..91031fd567aa 100644
--- a/pkgs/development/python-modules/easyenergy/default.nix
+++ b/pkgs/development/python-modules/easyenergy/default.nix
@@ -13,7 +13,7 @@
 
 buildPythonPackage rec {
   pname = "easyenergy";
-  version = "2.0.0";
+  version = "2.1.0";
   pyproject = true;
 
   disabled = pythonOlder "3.11";
@@ -22,7 +22,7 @@ buildPythonPackage rec {
     owner = "klaasnicolaas";
     repo = "python-easyenergy";
     rev = "refs/tags/v${version}";
-    hash = "sha256-MqKhI38sEeTWiQn4IRivN0Rrq0ZMx4Pt0cFpsZQw/BI=";
+    hash = "sha256-WnDyGkF1JI0Yu4p+znBdtCRvzrmGl9DH7QygKDuhEZo=";
   };
 
   postPatch = ''
diff --git a/pkgs/development/python-modules/energyzero/default.nix b/pkgs/development/python-modules/energyzero/default.nix
index de8c8b27c162..0c99ced94a13 100644
--- a/pkgs/development/python-modules/energyzero/default.nix
+++ b/pkgs/development/python-modules/energyzero/default.nix
@@ -13,7 +13,7 @@
 
 buildPythonPackage rec {
   pname = "energyzero";
-  version = "2.0.0";
+  version = "2.1.0";
   format = "pyproject";
 
   disabled = pythonOlder "3.11";
@@ -22,7 +22,7 @@ buildPythonPackage rec {
     owner = "klaasnicolaas";
     repo = "python-energyzero";
     rev = "refs/tags/v${version}";
-    hash = "sha256-iyvjXpJWFtC03xhpCBQ9wuEZQbP+zX5KrPj8MYqCvBg=";
+    hash = "sha256-NZbCiLCZC+hTcV0twOeCoKKD3eZ0/ZzPTnVpFyMLSfw=";
   };
 
   postPatch = ''
diff --git a/pkgs/development/python-modules/etils/default.nix b/pkgs/development/python-modules/etils/default.nix
index b6a3eed265df..4eb12d98386e 100644
--- a/pkgs/development/python-modules/etils/default.nix
+++ b/pkgs/development/python-modules/etils/default.nix
@@ -28,14 +28,14 @@
 
 buildPythonPackage rec {
   pname = "etils";
-  version = "1.5.1";
+  version = "1.5.2";
   format = "pyproject";
 
   disabled = pythonOlder "3.8";
 
   src = fetchPypi {
     inherit pname version;
-    hash = "sha256-tTDA0bLtG42hrzZ9S5eJHmgKakZY1BkBgyELu7jPH7k=";
+    hash = "sha256-umo+Gv+Vx2kTB3aqF2wRVAY39d2IHzt5FypRSbaxxEY=";
   };
 
   nativeBuildInputs = [
diff --git a/pkgs/development/python-modules/fpdf2/default.nix b/pkgs/development/python-modules/fpdf2/default.nix
new file mode 100644
index 000000000000..dd24dc35972e
--- /dev/null
+++ b/pkgs/development/python-modules/fpdf2/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+, setuptools
+
+, defusedxml
+, pillow
+, fonttools
+
+, pytestCheckHook
+, qrcode
+, camelot
+, uharfbuzz
+}:
+
+buildPythonPackage rec {
+  pname = "fpdf2";
+  version = "2.7.6";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "py-pdf";
+    repo = "fpdf2";
+    rev = version;
+    hash = "sha256-wiCKmS+GlrYV2/6TEdXUbmWIMWU4hyzswFJZR9EOWxc=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "--cov=fpdf --cov-report=xml" ""
+  '';
+
+  nativeBuildInputs = [ setuptools ];
+
+  propagatedBuildInputs = [
+    defusedxml
+    pillow
+    fonttools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    qrcode
+    camelot
+    uharfbuzz
+  ];
+
+  disabledTestPaths = [
+    "test/table/test_table_extraction.py" # tabula-py not packaged yet
+    "test/signing/test_sign.py" # endesive not packaged yet
+  ];
+
+  disabledTests = [
+    "test_png_url" # tries to download file
+    "test_page_background" # tries to download file
+    "test_share_images_cache" # uses timing functions
+  ];
+
+  meta = {
+    homepage = "https://github.com/py-pdf/fpdf2";
+    description = "Simple PDF generation for Python";
+    changelog = "https://github.com/py-pdf/fpdf2/blob/${version}/CHANGELOG.md";
+    license = lib.licenses.lgpl3Only;
+    maintainers = with lib.maintainers; [ jfvillablanca ];
+  };
+}
diff --git a/pkgs/development/python-modules/identify/default.nix b/pkgs/development/python-modules/identify/default.nix
index d754f90318cf..f2ce179d65bd 100644
--- a/pkgs/development/python-modules/identify/default.nix
+++ b/pkgs/development/python-modules/identify/default.nix
@@ -9,7 +9,7 @@
 
 buildPythonPackage rec {
   pname = "identify";
-  version = "2.5.32";
+  version = "2.5.33";
   format = "setuptools";
 
   disabled = pythonOlder "3.8";
@@ -18,7 +18,7 @@ buildPythonPackage rec {
     owner = "pre-commit";
     repo = pname;
     rev = "refs/tags/v${version}";
-    hash = "sha256-fKcxK11IxC0wmpPdyGzYQViSW2rx1v9Bvc+uBvGT8kE=";
+    hash = "sha256-v0k+N/E1xzhL2iWM0HQzYCxHfzuP8Za4eupkofN7bAA=";
   };
 
   nativeCheckInputs = [
diff --git a/pkgs/development/python-modules/proton-core/default.nix b/pkgs/development/python-modules/proton-core/default.nix
new file mode 100644
index 000000000000..9623cb0544d9
--- /dev/null
+++ b/pkgs/development/python-modules/proton-core/default.nix
@@ -0,0 +1,76 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, aiohttp
+, bcrypt
+, pyopenssl
+, python-gnupg
+, requests
+, pytestCheckHook
+}:
+
+buildPythonPackage {
+  pname = "proton-core";
+  version = "0.1.15-unstable-2023-10-24";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "ProtonVPN";
+    repo = "python-proton-core";
+    rev = "5e795e04094dff67c03c56f2f3de03ff43514cc4";
+    hash = "sha256-hchwrolc65tVmSe2IzxwH2zDU2JZzXrCMzWaETWcMDI=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    bcrypt
+    aiohttp
+    pyopenssl
+    python-gnupg
+    requests
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "--cov=proton --cov-report html --cov-report term" ""
+  '';
+
+  pythonImportsCheck = [ "proton" ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # Single test, requires internet connection
+    "tests/test_alternativerouting.py"
+  ];
+
+  disabledTests = [
+    # Invalid modulus
+    "test_modulus_verification"
+    # Permission denied: '/run'
+    "test_broken_data"
+    "test_broken_index"
+    "test_sessions"
+    # No working transports found
+    "test_auto_works_on_prod"
+    "test_ping"
+    "test_successful"
+    "test_without_pinning"
+    # Failed assertions
+    "test_bad_pinning_fingerprint_changed"
+    "test_bad_pinning_url_changed"
+  ];
+
+  meta = {
+    description = "Core logic used by the other Proton components";
+    homepage = "https://github.com/ProtonVPN/python-proton-core";
+    license = lib.licenses.gpl3Only;
+    maintainers = with lib.maintainers; [ wolfangaukang ];
+  };
+}
diff --git a/pkgs/development/python-modules/proton-keyring-linux-secretservice/default.nix b/pkgs/development/python-modules/proton-keyring-linux-secretservice/default.nix
new file mode 100644
index 000000000000..78de141dad56
--- /dev/null
+++ b/pkgs/development/python-modules/proton-keyring-linux-secretservice/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, proton-keyring-linux
+, pytestCheckHook
+}:
+
+buildPythonPackage {
+  pname = "proton-keyring-linux-secretservice";
+  version = "0.0.1-unstable-2023-04-14";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "ProtonVPN";
+    repo = "python-proton-keyring-linux-secretservice";
+    rev = "973d2646ec4d04bc270df53058df892950244e70";
+    hash = "sha256-JlhvJBpbewT2c8k31CPMUlvvo/orWW1qfylFZLnDxeY=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    proton-keyring-linux
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "--cov=proton.keyring_linux.secretservice --cov-report html --cov-report term" ""
+  '';
+
+  pythonImportsCheck = [ "proton.keyring_linux" ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "ProtonVPN component to access Linux's keyring secret service API";
+    homepage = "https://github.com/ProtonVPN/python-proton-keyring-linux-secretservice";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ wolfangaukang ];
+  };
+}
diff --git a/pkgs/development/python-modules/proton-keyring-linux/default.nix b/pkgs/development/python-modules/proton-keyring-linux/default.nix
new file mode 100644
index 000000000000..4dac98134ac0
--- /dev/null
+++ b/pkgs/development/python-modules/proton-keyring-linux/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, keyring
+, proton-core
+, pytestCheckHook
+}:
+
+buildPythonPackage {
+  pname = "proton-keyring-linux";
+  version = "0.0.1-unstable-2023-04-14";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "ProtonVPN";
+    repo = "python-proton-keyring-linux";
+    rev = "5ff3c7f9a1a162836649502dd23c2fbe1f487d73";
+    hash = "sha256-4d8ZePG8imURhdNtLbraMRisrTLoRvJ+L2UuuOo3MPM=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    keyring
+    proton-core
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "--cov=proton.keyring_linux.core --cov-report html --cov-report term" ""
+  '';
+
+  pythonImportsCheck = [ "proton.keyring_linux.core" ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "ProtonVPN core component to access Linux's keyring";
+    homepage = "https://github.com/ProtonVPN/python-proton-keyring-linux";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ wolfangaukang ];
+  };
+}
diff --git a/pkgs/development/python-modules/proton-vpn-api-core/default.nix b/pkgs/development/python-modules/proton-vpn-api-core/default.nix
new file mode 100644
index 000000000000..0906d2bd4248
--- /dev/null
+++ b/pkgs/development/python-modules/proton-vpn-api-core/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, proton-core
+, proton-vpn-connection
+, proton-vpn-logger
+, proton-vpn-killswitch
+, proton-vpn-session
+, distro
+, pytestCheckHook
+}:
+
+buildPythonPackage {
+  pname = "proton-vpn-api-core";
+  version = "0.20.1-unstable-2023-10-10";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "ProtonVPN";
+    repo = "python-proton-vpn-api-core";
+    rev = "9c03fc30d3ff08559cab3644eadde027b029375d";
+    hash = "sha256-vnz1+NazQceAs9KA3Jq0tsJditRoG/LoBR+0wuDzzHk=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    distro
+    proton-core
+    proton-vpn-connection
+    proton-vpn-logger
+    proton-vpn-killswitch
+    proton-vpn-session
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "--cov=proton/vpn/core/ --cov-report html --cov-report term" ""
+  '';
+
+  pythonImportsCheck = [ "proton.vpn.core" ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    # Needed for Permission denied: '/homeless-shelter'
+    export HOME=$(mktemp -d)
+  '';
+
+  disabledTestPaths = [
+    # Has a single test failing with Permission denied: '/run'
+    "tests/test_session.py"
+  ];
+
+  meta = with lib; {
+    description = "Acts as a facade to the other Proton VPN components, exposing a uniform API to the available Proton VPN services";
+    homepage = "https://github.com/ProtonVPN/python-proton-vpn-api-core";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ wolfangaukang ];
+  };
+}
diff --git a/pkgs/development/python-modules/proton-vpn-connection/default.nix b/pkgs/development/python-modules/proton-vpn-connection/default.nix
new file mode 100644
index 000000000000..7acbb173e8b6
--- /dev/null
+++ b/pkgs/development/python-modules/proton-vpn-connection/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, proton-core
+, proton-vpn-killswitch
+, proton-vpn-logger
+, jinja2
+, pytestCheckHook
+}:
+
+buildPythonPackage {
+  pname = "proton-vpn-connection";
+  version = "0.11.0-unstable-2023-09-05";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "ProtonVPN";
+    repo = "python-proton-vpn-connection";
+    rev = "747ccacb5350ad59f2a09953b8d20c5c161aab54";
+    hash = "sha256-WyMG0kmwBKoWc0mHnaop9E0upPAYHFwS/A9I1//WwlY=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    jinja2
+    proton-core
+    proton-vpn-killswitch
+    proton-vpn-logger
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "--cov=proton.vpn.connection --cov-report html --cov-report term" ""
+  '';
+
+  pythonImportsCheck = [ "proton.vpn.connection" ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Permission denied: '/run'
+    "test_ensure_configuration_file_is_deleted"
+    "test_ensure_generate_is_returning_expected_content"
+    "test_ensure_same_configuration_file_in_case_of_duplicate"
+    "test_ensure_configuration_file_is_created"
+    "test_wireguard_config_content_generation"
+    "test_wireguard_with_malformed_credentials"
+    "test_wireguard_with_non_certificate"
+    "test_wireguard_without_settings"
+    # Neiter udp or tcp are working
+    "test_ovpnconfig_with_settings"
+    "test_ovpnconfig_with_missing_settings_applies_expected_defaults"
+    "test_ovpnconfig_with_malformed_params"
+    "test_ovpnconfig_with_certificate_and_malformed_credentials"
+    "test_ovpnconfig_with_malformed_server"
+    "test_ovpnconfig_with_malformed_server_and_credentials"
+  ];
+
+  meta = with lib; {
+    description = "Defines the interface that VPN connection backends should implement";
+    homepage = "https://github.com/ProtonVPN/python-proton-vpn-connection";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ wolfangaukang ];
+  };
+}
diff --git a/pkgs/development/python-modules/proton-vpn-killswitch-network-manager/default.nix b/pkgs/development/python-modules/proton-vpn-killswitch-network-manager/default.nix
new file mode 100644
index 000000000000..d0f62ac6f998
--- /dev/null
+++ b/pkgs/development/python-modules/proton-vpn-killswitch-network-manager/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, gobject-introspection
+, setuptools
+, networkmanager
+, proton-vpn-killswitch
+, proton-vpn-logger
+, pycairo
+, pygobject3
+, pytestCheckHook
+}:
+
+buildPythonPackage {
+  pname = "proton-vpn-killswitch-network-manager";
+  version = "0.2.0-unstable-2023-09-05";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "ProtonVPN";
+    repo = "python-proton-vpn-killswitch-network-manager";
+    rev = "39d4398f169539e335c1f661e0dfc5551df0e6af";
+    hash = "sha256-vmTXMIhXZgRvXeUX/XslT+ShqY60w4P7kJBQzWhA66k=";
+  };
+
+  nativeBuildInputs = [
+    # Solves ImportError: cannot import name NM, introspection typelib not found
+    gobject-introspection
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    # Needed here for the NM namespace
+    networkmanager
+    proton-vpn-killswitch
+    proton-vpn-logger
+    pycairo
+    pygobject3
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "--cov=proton.vpn.killswitch.backend.linux.networkmanager --cov-report=html --cov-report=term" ""
+  '';
+
+  pythonImportsCheck = [ "proton.vpn.killswitch.backend.linux.networkmanager" ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Implementation of the proton-vpn-killswitch interface using Network Manager";
+    homepage = "https://github.com/ProtonVPN/python-proton-vpn-killswitch-network-manager";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ wolfangaukang ];
+  };
+}
diff --git a/pkgs/development/python-modules/proton-vpn-killswitch/default.nix b/pkgs/development/python-modules/proton-vpn-killswitch/default.nix
new file mode 100644
index 000000000000..d36dedfbd4aa
--- /dev/null
+++ b/pkgs/development/python-modules/proton-vpn-killswitch/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, proton-core
+, pytestCheckHook
+}:
+
+buildPythonPackage {
+  pname = "proton-vpn-killswitch";
+  version = "0.2.0-unstable-2023-09-05";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "ProtonVPN";
+    repo = "python-proton-vpn-killswitch";
+    rev = "6e84588ea6ae0946141d4b44b2cf5df8465d5eba";
+    hash = "sha256-eFwWN8E+nIDpbut8tkWqXucLhzm7HaLAMBIbAq/X2eo=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    proton-core
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "--cov=proton --cov-report=html --cov-report=term" ""
+  '';
+
+  pythonImportsCheck = [ "proton.vpn.killswitch.interface" ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Defines the ProtonVPN kill switch interface";
+    homepage = "https://github.com/ProtonVPN/python-proton-vpn-killswitch";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ wolfangaukang ];
+  };
+}
diff --git a/pkgs/development/python-modules/proton-vpn-logger/default.nix b/pkgs/development/python-modules/proton-vpn-logger/default.nix
new file mode 100644
index 000000000000..6091c2b25a1e
--- /dev/null
+++ b/pkgs/development/python-modules/proton-vpn-logger/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, proton-core
+, pytestCheckHook
+}:
+
+buildPythonPackage {
+  pname = "proton-vpn-logger";
+  version = "0.2.1-unstable-2023-05-10";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "ProtonVPN";
+    repo = "python-proton-vpn-logger";
+    rev = "0acbc1ab41a65cbc9ceb340e3db011e6f89eb65a";
+    hash = "sha256-VIggBKopAAKiNdQ5ypG1qI74E2WMDwDSriSuka/DBKA=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    proton-core
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "--cov=proton/vpn/logging/ --cov-report html --cov-report term" ""
+  '';
+
+  pythonImportsCheck = [ "proton.vpn.logging" ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    # Needed for Permission denied: '/homeless-shelter'
+    export HOME=$(mktemp -d)
+  '';
+
+  meta = with lib; {
+    description = "General purpose logging package for the entire ProtonVPN Linux client";
+    homepage = "https://github.com/ProtonVPN/python-proton-vpn-logger";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ wolfangaukang ];
+  };
+}
diff --git a/pkgs/development/python-modules/proton-vpn-network-manager-openvpn/default.nix b/pkgs/development/python-modules/proton-vpn-network-manager-openvpn/default.nix
new file mode 100644
index 000000000000..9eca560ac005
--- /dev/null
+++ b/pkgs/development/python-modules/proton-vpn-network-manager-openvpn/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, gobject-introspection
+, setuptools
+, proton-core
+, proton-vpn-network-manager
+, pytestCheckHook
+}:
+
+buildPythonPackage {
+  pname = "proton-vpn-network-manager-openvpn";
+  version = "0.0.4-unstable-2023-07-05";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "ProtonVPN";
+    repo = "python-proton-vpn-network-manager-openvpn";
+    rev = "b79f6732646378ef1b92696de3665ff9560286d3";
+    hash = "sha256-Z5X8RRu+1KaZ0pnH7tzGhfeST2W8bxMZnuryLhFjG/g=";
+  };
+
+  nativeBuildInputs = [
+    # Solves Namespace NM not available
+    gobject-introspection
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    proton-core
+    proton-vpn-network-manager
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "--cov=proton.vpn.backend.linux.networkmanager.protocol.openvpn --cov-report html --cov-report term" ""
+  '';
+
+  pythonImportsCheck = [ "proton.vpn.backend.linux.networkmanager.protocol" ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Adds support for the OpenVPN protocol using NetworkManager";
+    homepage = "https://github.com/ProtonVPN/python-proton-vpn-network-manager-openvpn";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ wolfangaukang ];
+  };
+}
diff --git a/pkgs/development/python-modules/proton-vpn-network-manager/default.nix b/pkgs/development/python-modules/proton-vpn-network-manager/default.nix
new file mode 100644
index 000000000000..f8874e1d0f3a
--- /dev/null
+++ b/pkgs/development/python-modules/proton-vpn-network-manager/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, gobject-introspection
+, setuptools
+, networkmanager
+, proton-core
+, proton-vpn-connection
+, pycairo
+, pygobject3
+, pytestCheckHook
+}:
+
+buildPythonPackage {
+  pname = "proton-vpn-network-manager";
+  version = "0.3.0-unstable-2023-09-05";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "ProtonVPN";
+    repo = "python-proton-vpn-network-manager";
+    rev = "6ffd04fa0ae88a89d2b733443317066ef23b3ccd";
+    hash = "sha256-Bqlwo7U/mwodQarl30n3/BNETqit1MVQUJT+mAhC6AI=";
+  };
+
+  nativeBuildInputs = [
+    # Needed to recognize the NM namespace
+    gobject-introspection
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    # Needed here for the NM namespace
+    networkmanager
+    proton-core
+    proton-vpn-connection
+    pycairo
+    pygobject3
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "--cov=proton/vpn/backend/linux/networkmanager --cov-report html --cov-report term" ""
+  '';
+
+  pythonImportsCheck = [ "proton.vpn.backend.linux.networkmanager" ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Provides the necessary functionality for other ProtonVPN components to interact with NetworkManager";
+    homepage = "https://github.com/ProtonVPN/python-proton-vpn-network-manager";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ wolfangaukang ];
+  };
+}
diff --git a/pkgs/development/python-modules/proton-vpn-session/default.nix b/pkgs/development/python-modules/proton-vpn-session/default.nix
new file mode 100644
index 000000000000..b61bed91682a
--- /dev/null
+++ b/pkgs/development/python-modules/proton-vpn-session/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, cryptography
+, distro
+, proton-core
+, proton-vpn-logger
+, pynacl
+, aiohttp
+, pyopenssl
+, pytest-asyncio
+, requests
+, pytestCheckHook
+}:
+
+buildPythonPackage {
+  pname = "proton-vpn-session";
+  version = "0.6.2-unstable-2023-10-24";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "ProtonVPN";
+    repo = "python-proton-vpn-session";
+    rev = "419b25bd1823f78d1219dc4cc441eeaf37646068";
+    hash = "sha256-YPyNxbKxw+670bNQZ7U5nljyUjsNJ+k7eL+HpGiSCLk=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    cryptography
+    distro
+    proton-core
+    proton-vpn-logger
+    pynacl
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "--cov=proton.vpn.session --cov-report term" ""
+  '';
+
+  pythonImportsCheck = [ "proton.vpn.session" ];
+
+  postInstall = ''
+    # Needed for Permission denied: '/homeless-shelter'
+    export HOME=$(mktemp -d)
+  '';
+
+  nativeCheckInputs = [
+    aiohttp
+    pyopenssl
+    pytest-asyncio
+    requests
+    pytestCheckHook
+  ];
+
+  meta = {
+    description = "Provides utility classes to manage VPN sessions";
+    homepage = "https://github.com/ProtonVPN/python-proton-vpn-session";
+    license = lib.licenses.gpl3Only;
+    maintainers = with lib.maintainers; [ wolfangaukang ];
+  };
+}
diff --git a/pkgs/development/python-modules/pynitrokey/default.nix b/pkgs/development/python-modules/pynitrokey/default.nix
new file mode 100644
index 000000000000..4d91dc586c19
--- /dev/null
+++ b/pkgs/development/python-modules/pynitrokey/default.nix
@@ -0,0 +1,107 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonRelaxDepsHook
+, installShellFiles
+, libnitrokey
+, flit-core
+, certifi
+, cffi
+, click
+, cryptography
+, ecdsa
+, fido2
+, intelhex
+, nkdfu
+, python-dateutil
+, pyusb
+, requests
+, spsdk
+, tqdm
+, tlv8
+, typing-extensions
+, pyserial
+, protobuf
+, click-aliases
+, semver
+, nethsm
+, importlib-metadata
+}:
+
+let
+  pname = "pynitrokey";
+  version = "0.4.43";
+  mainProgram = "nitropy";
+in
+
+buildPythonPackage {
+  inherit pname version;
+  pyproject = true;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-dYOdokqALDg4Xn7N6Yd0skM/tit+j5+xY73sm9k76hE=";
+  };
+
+  propagatedBuildInputs = [
+    certifi
+    cffi
+    click
+    cryptography
+    ecdsa
+    fido2
+    intelhex
+    nkdfu
+    python-dateutil
+    pyusb
+    requests
+    spsdk
+    tqdm
+    tlv8
+    typing-extensions
+    pyserial
+    protobuf
+    click-aliases
+    semver
+    nethsm
+    importlib-metadata
+  ];
+
+  nativeBuildInputs = [
+    flit-core
+    installShellFiles
+    pythonRelaxDepsHook
+  ];
+
+  pythonRelaxDeps = true;
+
+  # pythonRelaxDepsHook runs in postBuild so cannot be used
+  pypaBuildFlags = [ "--skip-dependency-check" ];
+
+  # libnitrokey is not propagated to users of the pynitrokey Python package.
+  # It is only usable from the wrapped bin/nitropy
+  makeWrapperArgs = [
+    "--set LIBNK_PATH ${lib.makeLibraryPath [ libnitrokey ]}"
+  ];
+
+  # no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "pynitrokey" ];
+
+  postInstall = ''
+    installShellCompletion --cmd ${mainProgram} \
+      --bash <(_NITROPY_COMPLETE=bash_source $out/bin/${mainProgram}) \
+      --zsh <(_NITROPY_COMPLETE=zsh_source $out/bin/${mainProgram}) \
+      --fish <(_NITROPY_COMPLETE=fish_source $out/bin/${mainProgram})
+  '';
+
+  meta = with lib; {
+    description = "Python client for Nitrokey devices";
+    homepage = "https://github.com/Nitrokey/pynitrokey";
+    changelog = "https://github.com/Nitrokey/pynitrokey/releases/tag/v${version}";
+    license = with licenses; [ asl20 mit ];
+    maintainers = with maintainers; [ frogamic ];
+    inherit mainProgram;
+  };
+}
diff --git a/pkgs/development/python-modules/python-opensky/default.nix b/pkgs/development/python-modules/python-opensky/default.nix
index 0f23163d9aff..e6b7a41f6e68 100644
--- a/pkgs/development/python-modules/python-opensky/default.nix
+++ b/pkgs/development/python-modules/python-opensky/default.nix
@@ -14,16 +14,16 @@
 
 buildPythonPackage rec {
   pname = "python-opensky";
-  version = "0.2.1";
-  format = "pyproject";
+  version = "1.0.0";
+  pyproject = true;
 
-  disabled = pythonOlder "3.10";
+  disabled = pythonOlder "3.11";
 
   src = fetchFromGitHub {
     owner = "joostlek";
     repo = "python-opensky";
     rev = "refs/tags/v${version}";
-    hash = "sha256-xNXFvCUZ/x5ox3KxmG3eA73wpX4fwhvAVmlfcKiT1V8=";
+    hash = "sha256-Ia6/Lr/uNuF1u0s4g0tpYaW+hKeLbUKxYC/O+ZBqiXI=";
   };
 
   postPatch = ''
diff --git a/pkgs/development/python-modules/python-vlc/default.nix b/pkgs/development/python-modules/python-vlc/default.nix
index bb603396c787..cdc557bbe879 100644
--- a/pkgs/development/python-modules/python-vlc/default.nix
+++ b/pkgs/development/python-modules/python-vlc/default.nix
@@ -9,14 +9,14 @@
 
 buildPythonPackage rec {
   pname = "python-vlc";
-  version = "3.0.18122";
+  version = "3.0.20123";
   format = "setuptools";
 
   disabled = pythonOlder "3.7";
 
   src = fetchPypi {
     inherit pname version;
-    hash = "sha256-EDm94oeFO0t7Yboi2DdhgyQ094UG2nYt+wYCkb8yiX0=";
+    hash = "sha256-JE+7njkqAyaEH8qSbW0SoqNsVGmCGR9JPxSPoZ5msdQ=";
   };
 
   patches = [
diff --git a/pkgs/development/python-modules/pyunifiprotect/default.nix b/pkgs/development/python-modules/pyunifiprotect/default.nix
index 00b0f3740c35..5d13ea6ce704 100644
--- a/pkgs/development/python-modules/pyunifiprotect/default.nix
+++ b/pkgs/development/python-modules/pyunifiprotect/default.nix
@@ -2,9 +2,13 @@
 , aiofiles
 , aiohttp
 , aioshutil
+, async-timeout
 , buildPythonPackage
 , dateparser
 , fetchFromGitHub
+, ffmpeg
+, hatch-vcs
+, hatchling
 , ipython
 , orjson
 , packaging
@@ -22,37 +26,34 @@
 , python-dotenv
 , pythonOlder
 , pytz
-, setuptools
-, setuptools-scm
 , termcolor
 , typer
-, ffmpeg
 }:
 
 buildPythonPackage rec {
   pname = "pyunifiprotect";
-  version = "4.21.0";
-  format = "pyproject";
+  version = "4.22.0";
+  pyproject = true;
 
   disabled = pythonOlder "3.9";
 
   src = fetchFromGitHub {
     owner = "briis";
-    repo = pname;
+    repo = "pyunifiprotect";
     rev = "refs/tags/v${version}";
-    hash = "sha256-BFcICpWq0aBjEww9EuO6UH8oGX8fufernFqh/gihIrM=";
+    hash = "sha256-qzom1mLTfP683GCYlUav/MlOkYj+AiEe13b74ceW7gI=";
   };
 
+  env.SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
   postPatch = ''
     substituteInPlace pyproject.toml \
-      --replace "--cov=pyunifiprotect --cov-append" ""
+      --replace "--strict-markers -ra -Wd --ignore=.* --no-cov-on-fail --cov=pyunifiprotect --cov-append --maxfail=10 -n=auto" ""
   '';
 
-  SETUPTOOLS_SCM_PRETEND_VERSION = version;
-
   nativeBuildInputs = [
-    setuptools
-    setuptools-scm
+    hatch-vcs
+    hatchling
   ];
 
   propagatedBuildInputs = [
@@ -67,7 +68,10 @@ buildPythonPackage rec {
     pyjwt
     pytz
     typer
-  ] ++ typer.optional-dependencies.all;
+  ] ++ typer.optional-dependencies.all
+  ++ lib.optionals (pythonOlder "3.11") [
+    async-timeout
+  ];
 
   passthru.optional-dependencies = {
     shell = [
diff --git a/pkgs/development/python-modules/qiskit-aer/default.nix b/pkgs/development/python-modules/qiskit-aer/default.nix
index e774990fb999..ecd8905583e2 100644
--- a/pkgs/development/python-modules/qiskit-aer/default.nix
+++ b/pkgs/development/python-modules/qiskit-aer/default.nix
@@ -147,7 +147,7 @@ buildPythonPackage rec {
   postCheck = "popd";
 
   meta = with lib; {
-    broken = (stdenv.isLinux && stdenv.isAarch64);
+    broken = true;
     description = "High performance simulators for Qiskit";
     homepage = "https://qiskit.org/aer";
     downloadPage = "https://github.com/QISKit/qiskit-aer/releases";
diff --git a/pkgs/development/python-modules/qiskit-terra/default.nix b/pkgs/development/python-modules/qiskit-terra/default.nix
index 216f3356dc26..596f9d619d2e 100644
--- a/pkgs/development/python-modules/qiskit-terra/default.nix
+++ b/pkgs/development/python-modules/qiskit-terra/default.nix
@@ -1,11 +1,13 @@
 { stdenv
 , lib
+, pythonAtLeast
 , pythonOlder
 , buildPythonPackage
 , fetchFromGitHub
 , cargo
 , rustPlatform
 , rustc
+, libiconv
   # Python requirements
 , dill
 , numpy
@@ -61,7 +63,7 @@ buildPythonPackage rec {
   version = "0.25.1";
   format = "setuptools";
 
-  disabled = pythonOlder "3.7";
+  disabled = pythonOlder "3.7" || pythonAtLeast "3.11";
 
   src = fetchFromGitHub {
     owner = "qiskit";
@@ -72,10 +74,12 @@ buildPythonPackage rec {
 
   nativeBuildInputs = [ setuptools-rust rustc cargo rustPlatform.cargoSetupHook ];
 
+  buildInputs = lib.optionals stdenv.isDarwin [ libiconv ];
+
   cargoDeps = rustPlatform.fetchCargoTarball {
     inherit src;
     name = "${pname}-${version}";
-    hash = "sha256-SXC0UqWjWqLlZvKCRBylSX73r4Vale130KzS0zM8gjQ=";
+    hash = "sha256-f5VLNxv9DKwfRy5zacydfz4Zrkbiee7JecOAbVelSto=";
   };
 
   propagatedBuildInputs = [
@@ -117,6 +121,8 @@ buildPythonPackage rec {
     "test/randomized/"
     # These tests consistently fail on GitHub Actions build
     "test/python/quantum_info/operators/test_random.py"
+    # Too many floating point arithmetic errors
+    "test/visual/mpl/circuit/test_circuit_matplotlib_drawer.py"
   ];
   pytestFlagsArray = [ "--durations=10" ];
   disabledTests = [
@@ -126,6 +132,11 @@ buildPythonPackage rec {
     "TestGraphMatplotlibDrawer"
     "test_copy" # assertNotIn doesn't seem to work as expected w/ pytest vs unittest
 
+    "test_bound_pass_manager" # AssertionError: 0 != 2
+    "test_complex_parameter_bound_to_real" # qiskit.circuit.exceptions.CircuitError: "Invalid param type <class 'complex'> for gate rx."
+    "test_expressions_of_parameter_with_constant" # Floating point arithmetic error
+    "test_handle_measurement" # AssertionError: The two circuits are not equal
+
     # Flaky tests
     "test_pulse_limits" # Fails on GitHub Actions, probably due to minor floating point arithmetic error.
     "test_cx_equivalence"  # Fails due to flaky test
@@ -196,7 +207,6 @@ buildPythonPackage rec {
 
 
   meta = with lib; {
-    broken = true; # tests segfault python
     description = "Provides the foundations for Qiskit.";
     longDescription = ''
       Allows the user to write quantum circuits easily, and takes care of the constraints of real hardware.
diff --git a/pkgs/development/python-modules/reolink-aio/default.nix b/pkgs/development/python-modules/reolink-aio/default.nix
index 2fbacc6ea980..9cd9b8c22aae 100644
--- a/pkgs/development/python-modules/reolink-aio/default.nix
+++ b/pkgs/development/python-modules/reolink-aio/default.nix
@@ -9,7 +9,7 @@
 
 buildPythonPackage rec {
   pname = "reolink-aio";
-  version = "0.8.1";
+  version = "0.8.2";
   format = "setuptools";
 
   disabled = pythonOlder "3.9";
@@ -18,7 +18,7 @@ buildPythonPackage rec {
     owner = "starkillerOG";
     repo = "reolink_aio";
     rev = "refs/tags/${version}";
-    hash = "sha256-zxIx7+cpYKN811yz+nxjtOagHOMMIs1YU0ZLN9q5T7M=";
+    hash = "sha256-HqGxKIP1Zdj7wgHVvnWXdHol9tvGKiXbEytnon4epFU=";
   };
 
   propagatedBuildInputs = [
diff --git a/pkgs/development/python-modules/type-infer/default.nix b/pkgs/development/python-modules/type-infer/default.nix
index 214f7cf4d1ab..7983ac8d29bf 100644
--- a/pkgs/development/python-modules/type-infer/default.nix
+++ b/pkgs/development/python-modules/type-infer/default.nix
@@ -24,7 +24,7 @@ let
 in
 buildPythonPackage rec {
   pname = "type-infer";
-  version = "0.0.16";
+  version = "0.0.17";
   format = "pyproject";
 
   disabled = pythonOlder "3.8";
@@ -33,7 +33,7 @@ buildPythonPackage rec {
   src = fetchPypi {
     pname = "type_infer";
     inherit version;
-    hash = "sha256-EWH8odCHAzrEcBtFEYBm5gt4zlrwrK33c6uEfFBgPfA=";
+    hash = "sha256-2bPXJuGDXTVoYUP9IfwyRy8LbMT/ySoHDzuelrOq/DU=";
   };
 
   nativeBuildInputs = [
diff --git a/pkgs/development/tools/bearer/default.nix b/pkgs/development/tools/bearer/default.nix
index 448b91115186..a073c2b2b248 100644
--- a/pkgs/development/tools/bearer/default.nix
+++ b/pkgs/development/tools/bearer/default.nix
@@ -7,13 +7,13 @@
 
 buildGoModule rec {
   pname = "bearer";
-  version = "1.31.1";
+  version = "1.32.0";
 
   src = fetchFromGitHub {
     owner = "bearer";
     repo = "bearer";
     rev = "refs/tags/v${version}";
-    hash = "sha256-GjCb0b8wT1mfk8Od1r5U6+a3yUzliS1ExIYIV6vnUPs=";
+    hash = "sha256-fqc/+eYrUcFHgC+st0LogLLIW/jRyp0M5VwxMBWkPKY=";
   };
 
   vendorHash = "sha256-QDtjB1h7mNBEpTwoQfex3c6oba/kztKlgQpbmNHvoz0=";
diff --git a/pkgs/development/tools/turso-cli/default.nix b/pkgs/development/tools/turso-cli/default.nix
index d5ad729050ce..2f1d3b7e72b1 100644
--- a/pkgs/development/tools/turso-cli/default.nix
+++ b/pkgs/development/tools/turso-cli/default.nix
@@ -8,13 +8,13 @@
 }:
 buildGo121Module rec {
   pname = "turso-cli";
-  version = "0.87.4";
+  version = "0.87.6";
 
   src = fetchFromGitHub {
     owner = "tursodatabase";
     repo = "turso-cli";
     rev = "v${version}";
-    hash = "sha256-e5HuDWMmikTlWC2ezZ5zxxKYFlgz9jrpHtNfIwSiiok=";
+    hash = "sha256-LQBAq7U9+6LCkIsA9mvyBUz3vXN/lYdzKHvca4JdxE0=";
   };
 
   vendorHash = "sha256-EcWhpx93n+FzkXDOHwAxhn13qR4n9jLFeaKoe49x1x4=";
diff --git a/pkgs/development/web/deno/default.nix b/pkgs/development/web/deno/default.nix
index 09d266ff9737..abaf279e7269 100644
--- a/pkgs/development/web/deno/default.nix
+++ b/pkgs/development/web/deno/default.nix
@@ -13,16 +13,16 @@
 
 rustPlatform.buildRustPackage rec {
   pname = "deno";
-  version = "1.38.4";
+  version = "1.38.5";
 
   src = fetchFromGitHub {
     owner = "denoland";
     repo = pname;
     rev = "v${version}";
-    hash = "sha256-Jve2aKfnWZotgzfzUJ+ez+9sainmQiUg3x8FIWnr6/o=";
+    hash = "sha256-gNYyB6KUgi0/kGfyYPuDdPWU0B4Io2TxEBAf/oRSHxs=";
   };
 
-  cargoHash = "sha256-pDDi0Xm1o61Ng308MeTVoVp+cYVFt34Kh4sj2idH+9s=";
+  cargoHash = "sha256-soHNk/EY6Db49NtdAHrky9DfEJDKfPcS2L/crkJI/9E=";
 
   postPatch = ''
     # upstream uses lld on aarch64-darwin for faster builds